机器学习泛化能力的评价指标


对机器学习泛化能力的评估,不仅需要可行的估计方法,还需要衡量模型泛化能力的标准,这就是性能度量performance measure)。

模型的 “好坏” 不仅取决于算法和数据,还取决于任务需求。



一、回归模型评估

指标 描述 sklearn函数
Mean Squred Error (MSE,RMSE) 均方误差 from sklearn.metrics import mean_squared_error
Absolute Error (MAE,RAE) 绝对误差 from sklearn.metrics import mean_absolute_error, median_absolute_error
RSquared R平方值 from sklearn.metrics import r2_score
Explained Variance Score 可解释方差 from sklearn.metrics import explained_variance_score


1.均方误差

给定样例集 D={(x1,y1),(x2,y2),...,(xm,ym)}yi 是示例 xi 的真实标记,f(x) 是预测结果。

回归模型最常用的性能度量是均方误差(Mean Squared Error),数值越小越好。

MSE=1mi=1m(f(xi)yi)2


2.绝对误差

绝对误差(Mean Absolute Error)用来描述预测值与真实值的差值。数值越小越好。

MAE=1mi=1m|f(xi)yi|


3.r2

给定样例集 D={(x1,y1),(x2,y2),...,(xm,ym)}yi 是示例 xi 的真实标记,f(x) 是预测结果。

值最大为 1,越接近 1 越好。

y¯=1mi=1myiR2=1i=1m(yif(xi))2i=1m(yiy¯)2


4.可解释方差

可解释方差(Explained Variance Score),值最大为 1,越接近 1 越好。

Explained Variance=1Var(yif(xi))Var(yi)



二、分类模型评估


指标 描述 sklearn函数
Precision 精确率、查准率 from sklearn.metrics import precision_score
Recall 召回率、查全率 from sklearn.metrics import recall_score
F1 F1 from sklearn.metrics import f1_score
Confusion Matrix 混淆矩阵 from sklearn.metrics import confusion_matrix
ROC ROC 曲线 from sklearn.metrics import confusion_matrix
AUC ROC 曲线下的面积 from sklearn.metrics import auc


1.错误率与准确率

分类模型最常用的两种性能度量,既适用二分类,也适用多分类

错误率:分类错误的样本数占总样本数的比例。

准确率(Accuracy):分类正确的样本数占总样本数的比例。

对样例集 D,分类错误率

E(f;D)=1mi=1mI(f(xi)yi)

准确率

acc(f;D)=1mi=1mI(f(xi)=yi)=1E(f;D)

准确率在很多项目场景不适用,原因是样本不均衡时,准确率会失效。

例:一个总样本中,正样本占90%,负样本占10%,样本严重不平衡。这时候如果将全部正样本预测为正样本,即可达到90%的准确率。



2.精确率、召回率、F1

对于二分类问题,根据真实情况与预测结果划分为:

真正例(true positive, TP)、假正例(false positive, FP)、真反例(true negative, TN)、假反例(false negative, FN)。TP+FP+TN+FN=

分类结果的 “混淆矩阵”:

真实情况 预测结果 预测结果
正例 反例
正例 TP(真正例) FN(假反例)
反例 FP(假正例) TN (真反例)

查准率,也称精确率(Precision):被预测为正的正样本数 / 被预测为正的样本总数预测的准不准,看预测列

P=TPTP+FP

查全率,也称召回率(Recall):被预测为正的正样本数 / 正样本实际数预测的全不全,看实际行

R=TPTP+FN

查准率和查全率是相矛盾的,查准率高时,查全率偏低;查全率高时,查准率偏低。

以查准率为纵轴,查全率为横轴作图,得到查准率-查全率曲线,简称 “PR 曲线”,显示该曲线的图称为 "PR 图"。

平衡点BreakEvent Point, BEP):“查准率=查全率” 时的取值CBEP0.64


BEP 还是过于简化,更常用的是 F1 度量:查准率和查全率的调和均值

2F1=1P+1RF1=2TP2TP+FP+FN

因为查准率和查全率是相矛盾的,很难同时提高,所以用 F1 综合二者。F1 更接近于两个数较小的那个,当查全率和查准率接近时 F1 值最大。很多推荐系统用 F1 作为评测指标。



3. ROC 与 AUC

ROC 全称 “受试者工作特征”(Receiver Operating Characteristic)。

绘制 ROC 曲线,需要理解三个概念:TPRFPR,截断点。

截断点:分类过程中以某个“截断点”将预测样本分为两类,一部分正类,一部分负类。

比如:一个样本预测为正类的概率为0.4,取截断点为0.5,则这个样本为负类,取截断点为0.3,这个样本为正类。

真正率True Position Rate,TPR):TPR=TPTP+FN,即 被预测为正的正样本数 / 正样本实际数。等价于召回率。

假正率False Positive Rate,FPR):FPR=FPFP+TN,即 被预测为正的负样本数 / 负样本实际数。

假负率(False Negative Rate,FNP):FNR=FNTP+FN,即 被预测为负的正样本数 / 正样本实际数。

真负率(True Negative Rate,TNP):TNR=TNTN+FP,即 被预测为负的负样本数 / 负样本实际数。

ROC 曲线:纵轴是 "真正率(TPR)",横轴是 “假正率(FPR)”。截断点取值不同,TPRFPR 计算结果也不同,将截断点不同取值下对应的 TPRFPR 结果画在二维坐标系中得到的曲线,就是 ROC 曲线。

ROC 曲线中,FPR 越低 TPR 越高(即曲线越陡峭),模型越好。ROC 曲线无视样本不均衡。

AUC 曲线:ROC 曲线下的面积。全称“曲线下的面积”(Area Under The Curve)。


import numpy as np
from sklearn import metrics

y = np.array([1, 1, 2, 2])		# 样本的真实分类
scores = np.array([0.1, 0.4, 0.35, 0.8])    # y 是正类的概率估计[0.1, 0.4, 0.35, 0.8]
fpr, tpr, thresholds = metrics.roc_curve(y, scores, pos_label=2)     # FPR、TPR、截断点

print(fpr)
print(tpr)
print(thresholds)
[0.  0.  0.5 0.5 1. ]
[0.  0.5 0.5 1.  1. ]
[1.8  0.8  0.4  0.35 0.1 ]

pos_label:正类的标签。如果y不在 {1,1}{0,1} 时,pos_label设置为 2,否则引发错误。

thresholds[0]表示没有实例被预测并且任意设置为max(scores) + 1


分析:

y表示类别 {1,2}。假设y1 表示反例,2 表示正例。则y重写为:

y_true = [0, 0, 1, 1]
样本 预测是 1 的概率 y_true
y[0] 0.1 0
y[1] 0.4 0
y[2] 0.35 1
y[3] 0.8 1

① 截断点为 0.1

scores0.1,预测类别为 1。此时,因为 4 个样本都 0.1,所以y_pred = [1, 1, 1, 1]

scores = [0.1, 0.4, 0.35, 0.8]
y_true = [0, 0, 1, 1]
y_pred = [1, 1, 1, 1]
真实值 预测值 预测值
正例 反例
正例 TP=2 FN=0
反例 FP=2 TN=0

TPR=TPTP+FN=1

FPR=FPTN+FP=1


② 截断点为 0.4

scores0.4,预测类别为 1,所以y_pred = [0, 1, 0, 1]

scores = [0.1, 0.4, 0.35, 0.8]
y_true = [0, 0, 1, 1]
y_pred = [0, 1, 0, 1]
真实值 预测值 预测值
正例 反例
正例 TP=1 FN=1
反例 FP=1 TN=1

TPR=TPTP+FN=0.5

FPR=FPTN+FP=0.5


③ 截断点为 0.35

scores0.35,预测类别为 1,所以y_pred = [0, 1, 1, 1]

scores = [0.1, 0.4, 0.35, 0.8]
y_true = [0, 0, 1, 1]
y_pred = [0, 1, 1, 1]
真实值 预测值 预测值
正例 反例
正例 TP=2 FN=0
反例 FP=1 TN=1

TPR=TPTP+FN=1

FPR=FPTN+FP=0.5


④ 截断点为 0.8

scores0.8,预测类别为 1,所以y_pred = [0, 0, 0, 1]

scores = [0.1, 0.4, 0.35, 0.8]
y_true = [0, 0, 1, 1]
y_pred = [0, 0, 0, 1]
真实值 预测值 预测值
正例 反例
正例 TP=1 FN=1
反例 FP=0 TN=2

TPR=TPTP+FN=0.5

FPR=FPTN+FP=0



来自:https://www.biaodianfu.com/regression-metrics.html

posted @   做梦当财神  阅读(3352)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示