假设您的任务是训练一个ML模型,将数据点分类到一定数量的预定义类中。一旦建立了分类模型,接下来的任务就是评估其性能。有许多指标可以帮助您根据用例进行操作。在这篇文章中,我们将尝试回答诸如何时使用它之类的问题。它是什么?以及如何实施?混淆矩阵混淆矩阵定义为大小矩阵(类x类),因此对于二分类问题是2x2,对于三类问题是3x3,依此类推。为简单起见,让我们考虑二元分类并了解矩阵的组成部分。TrulyPositive(TP)-表示该类是“真实”的次数并且您的模型也说它是“真实”。TrueNegatives(TN)-表示类为假且您的模型也表示为假的次数。误报(FP)-表示该类为假,但您的模型表示为真。你可以这样记住它——你的模型错误地认为它是阳性假阴性(FN)——类是“真”的次数,但你的模型说它是“假”的。你可以这样记住它-你的模型错误地认为它是一个错误的值你可以像这样使用sklearn轻松获得混淆矩阵-fromsklearnimportmetricsdefcalculate_confusion_matrix(y,y_pred):returnmetrics.confusion_matrix(y,y_pred)如图1所示,混淆矩阵的组成部分是TP、TN、FP、FN,您也可以使用普通python计算它们,如下所示-计算TP、TN、FP、FNdefcalculate_TP(y,y_pred):tp=0fori,jinzip(y,y_pred):ifi==j==1:tp+=1returntpdefcalculate_TN(y,y_pred):tn=0fori,jinzip(y,y_pred):ifi==j==0:tn+=1returntndefcalculate_FP(y,y_pred):fp=0fori,jinzip(y,y_pred):ifi==0andj==1:fp+=1returnfpdefcalculate_FN(y,y_pred):fn=0fori,jinzip(y,y_pred):ifi==1andj==0:fn+=1returnfn混淆矩阵对于理解模型的细粒度性能很重要,然后根据用例的敏感性,可以确定这个模型好不好。例如,在医疗诊断用例中,您希望您的模型具有非常低的假阴性率,因为您不希望系统在测试人的任何痕迹时如果事实为“是”就说“不”疾病。您仍然可以设法将误报率偏高,因为该人可以通过相关测试并在稍后阶段得到确认。准确性准确性给出了模型如何执行的整体感觉。但是,如果使用不当,它很容易高估这些数字。例如-如果类标签的分布是倾斜的,则仅预测多数类会给你高分(高估性能),而准确性对平衡类更有意义。您可以使用sklearn轻松获得准确度分数,如下所示-fromsklearnimportmetricsdefcalculate_accuracy_sklearn(y,y_pred):returnmetrics.accuracy_score(y,y_pred)也可以使用Python从混淆矩阵组件计算如下-defcalculate_accuracy(y,y_pred):tp=calculate_TP(y,y_pred)tn=calculate_TN(y,y_pred)fp=calculate_FP(y,y_pred)fn=calculate_FN(y,y_pred)return(tp+tn)/(tp+tn+fp+fn)Precision精度度量帮助我们了解识别阳性样本的正确性百分比。例如,我们的模型假设它有80次是正数,我们准确计算出这80次模型有多少次是正确的。也可以这样计算-defcalculate_precision(y,y_pred):tp=calculate_TP(y,y_pred)fp=calculate_FP(y,y_pred)returntp/(tp+fp)召回率Recall召回率指标可以帮助我们理解所有的模型可以正确识别groundtruth正样本中正样本的百分比。例如——假设数据中有100个正样本,我们计算模型能够正确捕获这100个样本中的多少。计算也可以这样-defcalculate_recall(y,y_pred):tp=calculate_TP(y,y_pred)fn=calculate_FN(y,y_pred)returntp/(tp+fn)对于那些以概率为输出的模型,调整阈值然后填充相关的混淆矩阵和其他属性始终是一个好习惯。可以针对不同的阈值绘制精确召回曲线,并根据用例的敏感性选择阈值。defprecision_recall_curve(y,y_pred):y_pred_class,precision,recall=[],[],[]thresholds=[0.1,0.2,0.3,0.6,0.65]forthreshinthresholds:foriiny_pred:#y_predholdsprobvalueforclass1ifi>=thresh:y_pred_class.append(1)else:y_pred_class.append(0)precision.append(calculate_precision(y,y_pred_class))recall.append(calculate_recall(y,y_pred_class))returnrecall,precisionplt.plot(recall,precision)F1分数F1结合了Precision和Recall分数,获得一个数字有助于直接比较不同的模型。将其视为P和R的调和平均值。调和平均值是因为与其他方法不同,它对非常大的值不敏感。在处理具有倾斜目标的数据集时,我们通常考虑F1而不是准确性。您可以像这样进行计算-defcalculate_F1(y,y_pred):p=calculate_precision(y,y_pred)r=calculate_recall(y,y_pred)return2*p*r/(p+r)AUC-ROCAUC-ROCisforOne二元分类问题的非常常见的评估指标。这是在y轴上的TPR(真实率)和x轴上的FPR(错误率)之间绘制的曲线,其中TPR和FPR定义为-如果您注意到,TPR和Recall具有相同的表示形式,如As您正确分类的许多正确样本。另一方面,FPR是被错误分类的负样本的比例。ROC图总结了每个阈值的分类器性能。因此,对于每个阈值,我们都有新的TPR和FPR混淆矩阵值,它们最终成为ROC二维空间中的点。ROC曲线下的AUC(areaunderthecurve)值越接近1,模型越好。这意味着一般来说,对于每个具有更高AUC的阈值,我们的模型比其他模型表现更好。您可以按如下方式计算它-fromsklearn.metricsimportroc_auc_scoredefroc_auc(y,y_pred):returnroc_auc_score(y,y_pred)Precision@kPrecision@k是多标签分类设置的常用指标之一。在此之下,我们计算给定示例的前k个预测,然后计算这k个预测中有多少实际上是真实标签。我们计算Precision@k为-Precision@k=(#ofcorrectpredictionsfromk)/(#ofitemsink)actual_label=[1,1,0,0,1]predicted_label=[1,1,1,0,0]Letk=3Precision@k=2/3(It'ssameasTP/(TP+FP))logloss当你有一个二进制分类问题时,logloss非常好。当您有一个输出概率的模型时,将使用该模型,该模型会根据预测与实际标签的偏离程度来考虑预测的不确定性。您可以按如下方式计算-defcalculate_log_loss(y,y_pred_probs):log_loss=-1.0*(t*log(p)+(1-t)*(t*log(1-p))returnlog_lossonimbalanceddataset在这种情况下的,也可以加入类权重来惩罚少数类相对于多数类的误差,代码中w1和w2分别对应正类和负类的权重defcalculate_log_loss_weighted(y,y_pred):log_loss=-1.0*(w1*t*log(p)+w2*(1-t)*(t*log(1-p))returnlog_loss旁注:您可以轻松地将其扩展到名为cross-entropy.BrierScoreBrierscore通常在任务本质上是二分类时使用,它只是实际值和预测值之间的平方差,对于N组样本,我们取平均。可以这样计算——defbrier_score(y,y_pred):s=0fori,jinzip(y,y_pred):s+=(j-i)**2returns*(1/len(y))在这篇文章中,我们看到了一些每个数据科学家在根据手头问题的性质评估机器学习分类模型时必须牢记的流行评估指标。
