机器学习泛化能力的评价指标
对机器学习泛化能力的评估,不仅需要可行的估计方法,还需要衡量模型泛化能力的标准,这就是性能度量()。
模型的 “好坏” 不仅取决于算法和数据,还取决于任务需求。
一、回归模型评估
sklearn 函数 |
||
---|---|---|
均方误差 | from sklearn.metrics import mean_squared_error |
|
绝对误差 | from sklearn.metrics import mean_absolute_error, median_absolute_error |
|
平方值 | from sklearn.metrics import r2_score |
|
可解释方差 | from sklearn.metrics import explained_variance_score |
1.均方误差
给定样例集 , 是示例 的真实标记, 是预测结果。
回归模型最常用的性能度量是均方误差(),数值越小越好。
2.绝对误差
绝对误差()用来描述预测值与真实值的差值。数值越小越好。
3.r2
给定样例集 , 是示例 的真实标记, 是预测结果。
值最大为 ,越接近 越好。
4.可解释方差
可解释方差(),值最大为 ,越接近 越好。
二、分类模型评估
指标 | 描述 | sklearn 函数 |
---|---|---|
精确率、查准率 | from sklearn.metrics import precision_score |
|
召回率、查全率 | from sklearn.metrics import recall_score |
|
值 | from sklearn.metrics import f1_score |
|
混淆矩阵 | from sklearn.metrics import confusion_matrix |
|
曲线 | from sklearn.metrics import confusion_matrix |
|
曲线下的面积 | from sklearn.metrics import auc |
1.错误率与准确率
分类模型最常用的两种性能度量,既适用二分类,也适用多分类。
错误率:分类错误的样本数占总样本数的比例。
准确率():分类正确的样本数占总样本数的比例。
对样例集 ,分类错误率
准确率
准确率在很多项目场景不适用,原因是样本不均衡时,准确率会失效。
例:一个总样本中,正样本占90%,负样本占10%,样本严重不平衡。这时候如果将全部正样本预测为正样本,即可达到90%的准确率。
2.精确率、召回率、F1
对于二分类问题,根据真实情况与预测结果划分为:
真正例()、假正例()、真反例()、假反例()。。
分类结果的 “混淆矩阵”:
正例 | 反例 | |
正例 | (真正例) | (假反例) |
反例 | (假正例) | (真反例) |
查准率,也称精确率():被预测为正的正样本数 / 被预测为正的样本总数(预测的准不准,看预测列)
查全率,也称召回率():被预测为正的正样本数 / 正样本实际数(预测的全不全,看实际行)
查准率和查全率是相矛盾的,查准率高时,查全率偏低;查全率高时,查准率偏低。
以查准率为纵轴,查全率为横轴作图,得到查准率-查全率曲线,简称 “ 曲线”,显示该曲线的图称为 " 图"。
平衡点():“查准率=查全率” 时的取值。 的 是 。
还是过于简化,更常用的是 度量:查准率和查全率的调和均值。
因为查准率和查全率是相矛盾的,很难同时提高,所以用 综合二者。 更接近于两个数较小的那个,当查全率和查准率接近时 值最大。很多推荐系统用 作为评测指标。
3. ROC 与 AUC
全称 “受试者工作特征”()。
绘制 曲线,需要理解三个概念:,,截断点。
截断点:分类过程中以某个“截断点”将预测样本分为两类,一部分正类,一部分负类。
比如:一个样本预测为正类的概率为0.4,取截断点为0.5,则这个样本为负类,取截断点为0.3,这个样本为正类。
真正率():,即 被预测为正的正样本数 / 正样本实际数。等价于召回率。
假正率():,即 被预测为正的负样本数 / 负样本实际数。
假负率():,即 被预测为负的正样本数 / 正样本实际数。
真负率():,即 被预测为负的负样本数 / 负样本实际数。
曲线:纵轴是 "真正率()",横轴是 “假正率()”。截断点取值不同,、 计算结果也不同,将截断点不同取值下对应的 、 结果画在二维坐标系中得到的曲线,就是 曲线。
曲线中, 越低 越高(即曲线越陡峭),模型越好。 曲线无视样本不均衡。
曲线: 曲线下的面积。全称“曲线下的面积”()。
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
不在 或 时,pos_label
设置为 ,否则引发错误。
thresholds[0]
表示没有实例被预测并且任意设置为max(scores) + 1
分析:
y
表示类别 。假设y
中 表示反例, 表示正例。则y
重写为:
y_true = [0, 0, 1, 1]
y[0] | ||
y[1] | ||
y[2] | ||
y[3] |
① 截断点为
当 ,预测类别为 。此时,因为 个样本都 ,所以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]
正例 | 反例 | |
正例 | ||
反例 |
② 截断点为
当 ,预测类别为 ,所以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]
正例 | 反例 | |
正例 | ||
反例 |
③ 截断点为
当 ,预测类别为 ,所以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]
正例 | 反例 | |
正例 | ||
反例 |
④ 截断点为
当 ,预测类别为 ,所以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]
正例 | 反例 | |
正例 | ||
反例 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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)