spark 评估指标

来源:互联网 发布:网络统考时间 编辑:程序博客网 时间:2024/05/21 18:49

评估指标

1 Classification model evaluation

1.1 二元分类

       1.1.1阈值调整

1.2 Multiclassclassification

       1.2.1 Label based metrics

1.3 Muitilabel classification

1.4 Ranking systems

2 Regression model evaluation

 

Spark mllib 自带了许多机器学习算法,它能够用来进行模型的训练和预测。当使用这些算法来构建模型的时候,我们需要一些指标来评估这些模型的性能,这取决于应用和和其要求的性能。Spark mllib 也提供一套指标用来评估这些机器学习模型。

       具体的机器学习算法归入更广泛类型的机器学习应用,例如:分类,回归,聚类等等,每一种类型都很好的建立了性能评估指标。这些指标的具体信息见本节

 

1 分类模型评估

尽管有许多不同的分类模型,但是分类模型的评估都有相似的原理。在一个监督分类问题中,存在一个真正的输出和模型预测的输出值。由于这个原因,对于每个数据点的结果属于以下四类:

真阳性(TP) - 标签是积极的,预测也为正

真银杏(TN) - 标签为负,预测也为负

假阳性(FP) - 标签是阴性,但预测为正

假阴性(FN) - 标签是积极的,但预测为负

这四个数字是大多数分类评估模型的构建块。当考虑到分类评估是出精度的一个基本点(例如:预测正确或不正确)一般不是一个好的指标。原因就是有可能数据集时高度不平衡的。例如,在男女比例严重不均与的情况下,假如100个人,男生95,女生5人,对于一个人我只要预测他是男生,就能获得极高的准确率。所以在正负样本严重不均匀的情况下,准确率指标失效。由于这个原因,像精确率(TP/(TP+FP))和召回率(TP/(TP+FN)))通常被使用,因为他们考虑到错误的类型。在大多数应用中需要考虑精确率和召回率之间的平衡,她可以有两个组合成单个度量,成为F值。

 

1.1 二元分类

 

二元分类用来把给定的数据集分割成两个部分,他是多元分类里面的一个特例。大多数二元分类指标在多元分类中也适合。

 

1.1.1阈值调整

许多分类模型对每个类实际上输出一个“得分”(很多时候是一个概率),其中分数越高越相似。在二元分类情况下,模型可能对每个类别输出一个概率。P(Y=1|X) P(Y=0|X)。不同于简单地使用较高的概率,在某些情况下,模型需要被调整以便他预测一个类别的时候,属于这个类需要特别高的概率(例如对于二元分类,我们设定的阈值为90%,则>90%则为正,小于<90%都为负),因此,模型的输出的类别取决于模型的阈值。

调整预测阈值将改变准确率和召回率,它是模型优化的重要组成部分,为了直观的观察准确率,召回率或者其他的指标的变化,我们把他的这种变化作为一个阈值函数,通常的做法是绘制出他们之间的相互关系,参数是预测阈值。P-R曲线图(准确率,召回率)是对不同阈值绘制的曲线,ROC曲线绘制的是(召回率,假阳性率)绘制的曲线图。(假阳性率:FP/(FP+TN))

 

举例:以下程序片段说明了怎么样加载数据集,训练二元分类模型,使用不同的评估指标进行评估。

importorg.apache.spark.mllib.classification.LogisticRegressionWithLBFGS

importorg.apache.spark.mllib.evaluation.BinaryClassificationMetrics

importorg.apache.spark.mllib.regression.LabeledPoint

importorg.apache.spark.mllib.util.MLUtils

 

// Load training data in LIBSVM format

val data=MLUtils.loadLibSVMFile(sc,"data/mllib/sample_binary_classification_data.txt")

 

// Split data into training (60%) and test (40%)

valArray(training, test)= data.randomSplit(Array(0.6,0.4), seed =11L)

training.cache()

 

// Run training algorithm to build the model

val model=newLogisticRegressionWithLBFGS()

 .setNumClasses(2)

 .run(training)

 

// Clear the prediction threshold so the model will return probabilities

model.clearThreshold

 

// Compute raw scores on the test set

val predictionAndLabels= test.map{caseLabeledPoint(label, features)=>

 val prediction= model.predict(features)

 (prediction, label)

}

 

// Instantiate metrics object

val metrics=newBinaryClassificationMetrics(predictionAndLabels)

 

// Precision by threshold

val precision= metrics.precisionByThreshold

precision.foreach{case(t, p)=>

  println(s"Threshold: $t, Precision: $p")

}

 

// Recall by threshold

val recall= metrics.recallByThreshold

recall.foreach{case(t, r)=>

  println(s"Threshold: $t, Recall: $r")

}

 

// Precision-Recall Curve

valPRC= metrics.pr

 

// F-measure

val f1Score= metrics.fMeasureByThreshold

f1Score.foreach{case(t, f)=>

  println(s"Threshold: $t, F-score: $f, Beta = 1")

}

 

val beta=0.5

val fScore= metrics.fMeasureByThreshold(beta)

f1Score.foreach{case(t, f)=>

  println(s"Threshold: $t, F-score: $f, Beta = 0.5")

}

 

// AUPRC

val auPRC= metrics.areaUnderPR

println("Area under precision-recall curve = "+ auPRC)

 

// Compute thresholds used in ROC and PR curves

val thresholds= precision.map(_._1)

 

// ROC Curve

val roc= metrics.roc

 

// AUROC

val auROC= metrics.areaUnderROC

println("Area under ROC = "+ auROC)

 

 

 

 

 

 

 

 

 

0 0
原创粉丝点击