机器学习中的性能度量

回归任务

均方误差(Mean squared error, MSE)

E(f;D)=1mi=1m(f(xi)yi)2 E ( f ; D ) = 1 m ∑ i = 1 m ( f ( x i ) − y i ) 2

均方根误差(Root-Mean-Squared-Error, RMSE)

E(f;D)=1mi=1m(f(xi)yi)2=MSE(f(x)ˆ) E ( f ; D ) = 1 m ∑ i = 1 m ( f ( x i ) − y i ) 2 = M S E ( f ( x ) ^ )

分类任务

错误率与精度

E(f;D)=1mi=1m(f(xi)yi) E ( f ; D ) = 1 m ∑ i = 1 m ( f ( x i ) ≠ y i )

acc(f;D)=1mi=1m(f(xi)=yi)=1E(f;D) a c c ( f ; D ) = 1 m ∑ i = 1 m ( f ( x i ) = y i ) = 1 − E ( f ; D )

观察正确率的背后:准确率和召回率

Predicted PositivePredicted Negative
Actually PositivaTrue Positive, TPFalse Negative, FN
Actually NegativeFalse Positive, FPTrue Negative, TN

查准率(precision)

P=TPTP+FP P = T P T P + F P

查全率(recall)

R=TPTP+FN R = T P T P + F N

F-measure标准

F=2×P×RP+R F = 2 × P × R P + R

from sklearn.metrics import f1_score

评价曲线

准确-召回曲线

P/R曲线更适合正类别比负类别更重要的任务,或者说正例数目比负例数目小得多的任务。信息检索或欺诈检索是它的典型应用领域。

from sklearn.metrics import precision_recall_curve
受试者工作特征曲线(Receiver Operator Characteristic, ROC)

ROC曲线对分类器的一般效果提供了一个更好的描述。ROC曲线刻画的是真正率假正率之间的关系。

y轴x轴
P/RPrecision = TP / (TP + FP)recall = TP / (TP + FN)
ROCTPR = TP / (TP + FN)FPR = FP / (FP + TN)

ROC和P/R曲线所假定的是二分类问题,画图时可以显示分类器在“1 vs REST”分类中的效果。

绘图过程

  • 给定m个正例和n个负例(m=n),根据学习器预测结果对样例进行排序,然后把分类阈值设为最大,把所有样本均预测为反例,此时真正例率和假正例率均为0,在坐标(0, 0)处标记一个点。
  • 然后,将分类阈值一次设为每个样例的预测值,即一次将每个样例划分为正例。设前一个标记点为(x, y),当前若为真正例,则对应标记点的坐标为(x, y+1/m);当前若为假正例,则对应标记点的坐标为(x+1/n, y),然后用线段连接相邻点即得。

若一个学习器的ROC曲线被另一个学习器的曲线完全“包住”,则可断言后者的性能优于前者

曲线下面积(Area Under Curve, AUC)

AUC可以通过对ROC曲线下各部分的面积求和而得。假定ROC曲线是由坐标为{(x1,y1),(x2,y2),…,(xm,ym)}的点按序连接而形成(x1=0,xm=1),则AUC可估算为:

AUC=12i=1m1(xi+1xi)(yi+yi+1) A U C = 1 2 ∑ i = 1 m − 1 ( x i + 1 − x i ) ⋅ ( y i + y i + 1 )

def plotROC(predStrengths, classLabels):
    import matplotlib.pyplot as plt
    cur = (1.0,1.0) #cursor
    ySum = 0.0 #variable to calculate AUC
    numPosClas = sum(array(classLabels)==1.0)
    yStep = 1/float(numPosClas); xStep = 1/float(len(classLabels)-numPosClas)
    sortedIndicies = predStrengths.argsort()#get sorted index, it's reverse
    fig = plt.figure()
    fig.clf()
    ax = plt.subplot(111)
    #loop through all the values, drawing a line segment at each point
    for index in sortedIndicies.tolist()[0]:
        if classLabels[index] == 1.0:
            delX = 0; delY = yStep;
        else:
            delX = xStep; delY = 0;
            ySum += cur[1]
        #draw line from cur to (cur[0]-delX,cur[1]-delY)
        ax.plot([cur[0],cur[0]-delX],[cur[1],cur[1]-delY], c='b')
        cur = (cur[0]-delX,cur[1]-delY)
    ax.plot([0,1],[0,1],'b--')
    plt.xlabel('False positive rate'); plt.ylabel('True positive rate')
    plt.title('ROC curve for AdaBoost horse colic detection system')
    ax.axis([0,1,0,1])
    plt.show()
    print("the Area Under the Curve is: ", ySum * xStep)

混淆矩阵

在多分类问题中使用混淆矩阵(confusion matrix)评估正确率:对于多分类问题,我们不应该把关注点只局限在能否对体裁进行正确分类上,还应该仔细看一下那些互相混淆的类别。

from sklearn.metrics import confusion_matrix
cm = confusion_matrix(y_test, y_pred)
print(cm)

Neyman-Pearson 分类问题

在高风险分类(例如:高死亡率疾病监测、自动驾驶等场景)中控制假阳性率是非常重要的,由算法得出的结果将对个人产生巨大的影响。遗漏一名潜在病人的风险,远远高于误诊一名正常人。因此,我们希望在保证分类器假阳性率(即错误地将负样本分类为正样本的概率) 低于某个阈值 τ 的前提下,最小化其误分正样本的概率。

  • 调整标准分类器的参数
  • 引入基于领域知识的不平衡分类损失

代表性方法:

  • 代价敏感学习(Cost-sensitive learning)
  • 拉格朗日交替优化(LagragianMethod)
  • 排序——阈值法(Ranking-Thresholding)

Others

Bilingual Evaluation Understudy, BLEU

它主要用于衡量机器翻译相对于人类翻译的质量,它使用了精确度量的修改形式。

计算BLEU分数的步骤:

  • 把句子转换成单个词、两个词、三个词和四个词
  • 分别计算大小为1至4的n语法的精度
  • 取所有这些精度值的加权平均的指数
  • 将其与简短的惩罚项相乘

BLEU=BPexp(wnlog(Pn)) B L E U = B P ∗ e x p ( ∑ w n l o g ( P n ) )

BP={1,crexp(1rc),c<r B P = { 1 , c ≥ r e x p ( 1 − r c ) , c < r

这里BP是简短的惩罚项,r和c分别是参考翻译和候选翻译中的词的数量,w表示权重,P表示精度值

引入的惩罚项会惩罚那些短于参考翻译的候选翻译。例如,如果上述候选翻译的参考翻译是“The cat”,那么它对于单个词和两个词将具有很高的精度,因为两个单词都以相同的顺序出现在参考翻译中。但是,长度太短的话,实际上并不能很好的反映参考翻译的含义。有了这个简短的惩罚,候选翻译必须在长度、相同单词和单词顺序方面与参考翻译相匹配才能获得高分。

同:

exp(min(0,1lenlabellenpred))n=1kp1/2nn. exp ⁡ ( min ( 0 , 1 − l e n label l e n pred ) ) ∏ n = 1 k p n 1 / 2 n .

需要注意的是,匹配较长连续词比匹配较短连续词更难。因此,一方面,匹配较长连续词应被赋予更大权重。而上式中 p1/2nn p n 1 / 2 n 的指数相当于权重。随着 n 的提高,n 个连续词的精度的权重随着 1/2n 1 / 2 n 的减小而增大。例如 0.51/20.7,0.51/40.84,0.51/80.92,0.51/160.96 0.5 1 / 2 ≈ 0.7 , 0.5 1 / 4 ≈ 0.84 , 0.5 1 / 8 ≈ 0.92 , 0.5 1 / 16 ≈ 0.96 。另一方面,模型预测较短序列往往会得到较高的 n 个连续词的精度。因此,上式中连乘项前面的系数是为了惩罚较短的输出。举个例子,当 k=2 时,假设标签序列为 ABCDEF,而预测序列为 AB。虽然 p1=p2=1,但惩罚系数 exp(16/2)0.14 e x p ( 1 − 6 / 2 ) ≈ 0.14 ,因此 BLEU 也接近 0.14。当预测序列和标签序列完全一致时,BLEU 为 1。

《Building Machine Learning Systems with Python》 P85 5.7 P146 9.4.4

《机器学习实战》 P128 7.7.1

《机器学习》 P28 2.3

http://scikit-learn.org/stable/modules/model_evaluation.html#classification-metrics

https://en.wikipedia.org/wiki/Root-mean-square_deviation

《BLEU: a Method for Automatic Evaluation of Machine Translation
http://www.aclweb.org/anthology/P02-1040.pdf

https://en.wikipedia.org/wiki/BLEU

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值