做购物网站开发价格,网站标题用空格 逗号影响seo,网站建设的地方,德阳市建设局网站本文详细讨论了分类模型的常用评价指标#xff0c;包括准确率、平均准确率、混淆矩阵、精确率、召回率、F1值和AUC等。对这些指标含义的理解和运用#xff0c;尤其是在不平衡样本数据集上的应用#xff0c;是设计恰当模型和指导AI大模型调整模型需要掌握的知识。对这些指标的…本文详细讨论了分类模型的常用评价指标包括准确率、平均准确率、混淆矩阵、精确率、召回率、F1值和AUC等。对这些指标含义的理解和运用尤其是在不平衡样本数据集上的应用是设计恰当模型和指导AI大模型调整模型需要掌握的知识。对这些指标的讨论采用了示例入手、逐步推进的方式便于读者理解。在本专栏的前述文章里对分类模型的评价采用了最简单的准确率。本文详细讨论分类模型的常用评价指标。无论是自己设计模型还是指导AI大模型去调整模型评价指标显然是必须理解的内容。本文仍然采用示例入手的分析方法便于读者理解。读者也可暂时跳过公式推导部分先掌握应用方法。3 混淆矩阵(Confusion Matrix)混淆矩阵是对分类的结果进行详细描述的矩阵对于二分类则是一个2×22 \times 22×2的矩阵对于n分类则是n×nn \times nn×n的矩阵。二分类的混淆矩阵如表9-1所示第一行是真实类别为“正Positive”的样本数第二行则是真实类别为“负Negative)”的样本数第一列是预测值为“正”的样本数第二列则是预测值为“负”的样本数。表9-1 二分类的混淆矩阵预测为“正”的样本数预测为“负”的样本数标签为“正”的样本数True Positive(TP)False Negative(FN)标签为“负”的样本数False Positive(FP)True Negative(TN)表中TP表示真正即被算法分类正确的正样本FN表示假正即被算法分类错误的正样本FP表示假负即被算法分类错误的负样本TN表示真负即被算法分类正确的负样本。sklearn.metrics中计算混淆矩阵的函数为confusion_matrix。可以由混淆矩阵计算出准确率Accuracy和平均准确率Average_accuracyaccuracyTPTNTPFPFNTN(式9-2) \text{accuracy} \frac{TP TN}{TP FP FN TN}\tag{式9-2}accuracyTPFPFNTNTPTN(式9-2)average-accuracy12(TPTPFNTNFPTN)(式9-3) \text{average-accuracy} \frac{1}{2} \left( \frac{TP}{TP FN} \frac{TN}{FP TN} \right)\tag{式9-3}average-accuracy21(TPFNTPFPTNTN)(式9-3)在代码9-1.1后添加代码实现计算示例中验证集预测结果的混淆矩阵如代码9-1.2所示。代码9-1.2 计算混淆矩阵### 7. 计算混淆矩阵conf_matrixmetrics.confusion_matrix(all_labels,all_predictions)print(\n混淆矩阵:)print(-*40)print(f 预测为0 预测为1)print(f真实为0 (0){conf_matrix[0,0]:5d}{conf_matrix[0,1]:5d})print(f真实为1 (非0){conf_matrix[1,0]:5d}{conf_matrix[1,1]:5d})输出混淆矩阵:----------------------------------------预测为0预测为1真实为0(0)94634真实为1(非0)598961进一步可以推出这些指标1真正率True Positive Rate, TPR又名灵敏度Sensitivity分类正确的正样本个数占整个正样本个数的比例TPRTPTPFN(式9-4) TPR \frac{TP}{TP FN}\tag{式9-4}TPRTPFNTP(式9-4)2假负率False Negative Rate, FNR分类错误的正样本的个数占正样本的个数的比例FNRFNTPFN(式9-5) FNR \frac{FN}{TP FN}\tag{式9-5}FNRTPFNFN(式9-5)3假正率False Positive Rate, FPR分类错误的负样本个数占整个负样本个数的比例FPRFPFPTN(式9-6) FPR \frac{FP}{FP TN}\tag{式9-6}FPRFPTNFP(式9-6)4真负率True Negative Rate, TNR分类正确的负样本的个数占负样本的个数的比例TNRTNFPTN(式9-7) TNR \frac{TN}{FP TN}\tag{式9-7}TNRFPTNTN(式9-7)4 精确率-召回率(Precision-Recall)精确率-召回率包含两个评价指标一般同时使用。精确率-召回率是对每一类样本单独计算的。对分为正和负的二分类样本来说精确率是指分类器分类正确错误的正样本的个数占该分类器所有分类为正负样本个数的比例召回率是指分类器分类正确的正负样本个数占所有的正负样本个数的比例。精确率是从预测的角度来看的即预测为正负的样本中预测成功的比例。召回率是从样本的角度来看的即实际标签为正负的样本中被成功预测的比例。准确率也是从样本的角度来看的即所有样本中正确预测的比例。与精确率和召回率不同准确率是不分类别的。在二分类混淆矩阵中预测为正的样本的精确率为precisionPositiveTPTPFP(式9-8) \text{precision}_{\text{Positive}} \frac{TP}{TP FP}\tag{式9-8}precisionPositiveTPFPTP(式9-8)预测为负的样本的精确率为precisionNegativeTNTNFN(式9-9) \text{precision}_{\text{Negative}} \frac{TN}{TN FN}\tag{式9-9}precisionNegativeTNFNTN(式9-9)真实正样本的召回率为recallPositiveTPTPFNTPR(式9-10) \text{recall}_{\text{Positive}} \frac{TP}{TP FN} TPR\tag{式9-10}recallPositiveTPFNTPTPR(式9-10)真实负样本的召回率为recallNegativeTNTNFPTNR(式9-11) \text{recall}_{\text{Negative}} \frac{TN}{TN FP} TNR\tag{式9-11}recallNegativeTNFPTNTNR(式9-11)其中真实正样本的召回率即为真正率灵敏度TPR式9-4真实负样本的召回率即为真负率TNR式9-7。sklearn中计算精确率的是sklearn.metrics.precision_score()。通过设置它的average参数还可以计算所谓的宏macro平均精确率、微micro平均精确率和加权weighted平均精确率等。宏平均是按类平均即计算出每个类别的精确率或召回率后再算平均值。例如在二分类中宏平均精确率为macro-precision12(precisionPositiveprecisionNegative)(式9-12) \text{macro-precision} \frac{1}{2} \left( \text{precision}_{\text{Positive}} \text{precision}_{\text{Negative}} \right)\tag{式9-12}macro-precision21(precisionPositiveprecisionNegative)(式9-12)微平均是总体平均它将每个类别的精确率或召回率的分子之和除以分母之和。在二分类中微平均精确率为micro-precisionTPTNTPFPTNFN(式9-13) \text{micro-precision} \frac{TPTN}{TP FPTNFN}\tag{式9-13}micro-precisionTPFPTNFNTPTN(式9-13)加权平均是对每个类别的精确率乘以权重的和每个类别的权重是该类别的样本数量在总样本数量的占比值。从宏平均、微平均和加权平均的定义来看宏平均只观注类别而不管每类样本的数量因此它更偏向于样本数量占比小的类别微平均则偏向于样本数量占比大的类别加权平均则通过权重要调和它们。了解这些指标的差异有助于设计更加合理的模型。sklearn中计算召回率的是sklearn.metrics.recall_score()它的各种平均值的计算与sklearn.metrics.precision_score()相同不再赘述。计算示例中验证集预测结果的精确率和召回率如代码9-1.3所示。代码9-1.3 计算精确率与召回率precisionmetrics.precision_score(all_labels,all_predictions,averageNone)recallmetrics.recall_score(all_labels,all_predictions,averageNone)precision_macrometrics.precision_score(all_labels,all_predictions,averagemacro)precision_micrometrics.precision_score(all_labels,all_predictions,averagemicro)precision_weightedmetrics.precision_score(all_labels,all_predictions,averageweighted)recall_macrometrics.recall_score(all_labels,all_predictions,averagemacro)recall_micrometrics.recall_score(all_labels,all_predictions,averagemicro)recall_weightedmetrics.recall_score(all_labels,all_predictions,averageweighted)print(f预测为0的精确率:{precision[0]:.4f})print(f类别0召回率:{recall[0]:.4f})print(f预测为1精确率:{precision[1]:.4f})print(f类别1召回率:{recall[1]:.4f})print(f宏平均精确率:{precision_macro:.4f})print(f微平均精确率:{precision_micro:.4f})print(f加权平均精确率:{precision_weighted:.4f})print(f宏平均召回率:{recall_macro:.4f})print(f微平均召回率:{recall_micro:.4f})print(f加权平均召回率:{recall_weighted:.4f})输出预测为0的精确率:0.9413类别0召回率:0.9653预测为1精确率:0.9962类别1召回率:0.9935宏平均精确率:0.9688微平均精确率:0.9907加权平均精确率:0.9908宏平均召回率:0.9794微平均召回率:0.9907加权平均召回率:0.99075F1−scoreF_1 - \text{score}F1−score精确率与召回率实际上是一对矛盾的值有时候单独采用一个值难以全面衡量算法F1−scoreF_1 - \text{score}F1−score试图将两者结合起来作为一个指标来衡量算法。F1−scoreF_1 - \text{score}F1−score为预测为正样本的精确率与真实正样本的召回率的调和平均值即F12×precisionPositive×recallPositiveprecisionPositiverecallPositive(式9-14) F_1 \frac{2 \times \text{precision}_{\text{Positive}} \times \text{recall}_{\text{Positive}}}{\text{precision}_{\text{Positive}} \text{recall}_{\text{Positive}}} \quad \tag{式9-14}F1precisionPositiverecallPositive2×precisionPositive×recallPositive(式9-14)还可以给精确率和召回率加权重系数来区别两者的重要性将F1−scoreF_1 - \text{score}F1−score扩展为Fβ−scoreF_\beta - scoreFβ−score:Fβ(1β2)precisionPositive×recallPositive(β2×precisionPositive)recallPositive(式9-15) F_\beta (1 \beta^2) \frac{\text{precision}_{\text{Positive}} \times \text{recall}_{\text{Positive}}}{(\beta^2 \times \text{precision}_{\text{Positive}}) \text{recall}_{\text{Positive}}} \quad \tag{式9-15}Fβ(1β2)(β2×precisionPositive)recallPositiveprecisionPositive×recallPositive(式9-15)β\betaβ表示召回率比精确率的重要程度除了 1 之外常取 2 或 0.5分别表示召回率的重要程度是精确率的 2 倍或一半。sklearn.metrics 包中也提供计算了它们的函数见示例代码9-1.4。代码9-1.4 F1值计算示例### 8. 计算F1值f1metrics.f1_score(all_labels,all_predictions,averageNone)f1_macrometrics.f1_score(all_labels,all_predictions,averagemacro)f1_weightedmetrics.f1_score(all_labels,all_predictions,averageweighted)print(f类别0 F1值:{f1[0]:.4f})print(f类别1 F1值:{f1[1]:.4f})print(f宏平均F1值:{f1_macro:.4f})print(f加权平均F1值:{f1_weighted:.4f})输出类别0 F1值: 0.9531类别1 F1值: 0.9948宏平均F1值: 0.9740加权平均F1值: 0.9908