机器学习任务的常用评估指标
机器学习任务中,不同任务类型(如回归、分类、聚类)使用不同的评估指标来衡量模型性能。在回归任务中,常用指标包括平均绝对误差(MAE)、均方根误差(RMSE)和决定系数(R²)。MAE对异常值不敏感,RMSE放大大误差,R²反映模型拟合程度。分类任务中,常用指标有准确率、精确率、召回率和F1值,分别关注整体正确率、预测正类的准确性、正类样本的覆盖率以及精确率与召回率的平衡。聚类任务中,轮廓系数和兰德
·
不同的机器学习任务(如回归、分类、聚类等)有不同的常用评估指标,以下为你详细介绍:
回归任务评估指标
1. 平均绝对误差(Mean Absolute Error,MAE)
- 定义:预测值与真实值之间绝对误差的平均值。
- 公式:MAE=1n∑i=1n∣yi−y^i∣MAE=\frac{1}{n}\sum_{i = 1}^{n}\vert y_i-\hat{y}_i\vertMAE=n1∑i=1n∣yi−y^i∣,其中yiy_iyi是真实值,y^i\hat{y}_iy^i是预测值,nnn是样本数量。
- 特点:MAE 对所有误差的处理是平等的,不会像均方误差(MSE)那样放大较大的误差,因此对异常值相对不敏感。
- 代码示例:
from sklearn.metrics import mean_absolute_error
import numpy as np
y_true = np.array([3, -0.5, 2, 7])
y_pred = np.array([2.5, 0.0, 2, 8])
mae = mean_absolute_error(y_true, y_pred)
print(f"平均绝对误差: {mae}")
2. 均方根误差(Root Mean Squared Error,RMSE)
- 定义:MSE 的平方根,它衡量了预测值与真实值之间的平均偏差程度。
- 公式:RMSE=1n∑i=1n(yi−y^i)2RMSE = \sqrt{\frac{1}{n}\sum_{i = 1}^{n}(y_i - \hat{y}_i)^2}RMSE=n1∑i=1n(yi−y^i)2
- 特点:RMSE 与原始数据具有相同的单位,便于理解和解释,同时由于对误差进行了平方运算,会放大较大的误差,因此对异常值比较敏感。
- 代码示例:
from sklearn.metrics import mean_squared_error
import numpy as np
y_true = np.array([3, -0.5, 2, 7])
y_pred = np.array([2.5, 0.0, 2, 8])
rmse = np.sqrt(mean_squared_error(y_true, y_pred))
print(f"均方根误差: {rmse}")
3. 决定系数(Coefficient of Determination,R2R^2R2)
- 定义:表示模型对数据的拟合程度,取值范围为(−∞,1](-\infty, 1](−∞,1]。R2R^2R2越接近 1,说明模型对数据的拟合效果越好。
- 公式:R2=1−∑i=1n(yi−y^i)2∑i=1n(yi−yˉ)2R^2 = 1-\frac{\sum_{i = 1}^{n}(y_i-\hat{y}_i)^2}{\sum_{i = 1}^{n}(y_i-\bar{y})^2}R2=1−∑i=1n(yi−yˉ)2∑i=1n(yi−y^i)2,其中yˉ\bar{y}yˉ是真实值的平均值。
- 特点:R2R^2R2可以直观地反映模型的优劣,并且考虑了数据的整体变化情况,但当模型中增加无关特征时,R2R^2R2可能会虚高。
- 代码示例:
from sklearn.metrics import r2_score
import numpy as np
y_true = np.array([3, -0.5, 2, 7])
y_pred = np.array([2.5, 0.0, 2, 8])
r2 = r2_score(y_true, y_pred)
print(f"决定系数: {r2}")
回归任务评估指标对比
graph TD
A[真实值] --> B[预测值]
B --> C{误差计算}
C --> D[MAE: 绝对误差平均]
C --> E[MSE: 平方误差平均]
E --> F[RMSE: 平方根]
C --> G[R²: 方差解释比例]
指标 | 公式 | 特点 | 异常值敏感度 |
---|---|---|---|
MAE | 1n∑∣yi−y^i∣\frac{1}{n}\sum \vert y_i-\hat{y}_i\vertn1∑∣yi−y^i∣ | 直观易解释,单位一致 | 低 |
RMSE | 1n∑(yi−y^i)2\sqrt{\frac{1}{n}\sum (y_i-\hat{y}_i)^2}n1∑(yi−y^i)2 | 放大大误差,同量纲 | 高 |
R² | 1−SSresSStot1-\frac{SS_{res}}{SS_{tot}}1−SStotSSres | 无量纲,可跨数据集比较 | 中 |
分类任务评估指标
1. 准确率(Accuracy)
- 定义:分类正确的样本数占总样本数的比例。
- 公式:Accuracy=TP+TNTP+TN+FP+FNAccuracy=\frac{TP + TN}{TP+TN+FP+FN}Accuracy=TP+TN+FP+FNTP+TN,其中TPTPTP(真正例)是实际为正类且预测为正类的样本数,TNTNTN(真反例)是实际为反类且预测为反类的样本数,FPFPFP(假正例)是实际为反类但预测为正类的样本数,FNFNFN(假反例)是实际为正类但预测为反类的样本数。
- 特点:简单直观,但在类别不平衡的情况下,准确率可能不能很好地反映模型的性能。
- 代码示例:
from sklearn.metrics import accuracy_score
import numpy as np
y_true = np.array([0, 1, 0, 1])
y_pred = np.array([1, 1, 0, 1])
accuracy = accuracy_score(y_true, y_pred)
print(f"准确率: {accuracy}")
2. 精确率(Precision)
- 定义:预测为正类的样本中,实际为正类的比例。
- 公式:Precision=TPTP+FPPrecision=\frac{TP}{TP + FP}Precision=TP+FPTP
- 特点:精确率关注的是预测为正类的样本的准确性,常用于需要严格控制误判为正类的情况。
- 代码示例:
from sklearn.metrics import precision_score
import numpy as np
y_true = np.array([0, 1, 0, 1])
y_pred = np.array([1, 1, 0, 1])
precision = precision_score(y_true, y_pred)
print(f"精确率: {precision}")
3. 召回率(Recall)
- 定义:实际为正类的样本中,被预测为正类的比例。
- 公式:Recall=TPTP+FNRecall=\frac{TP}{TP + FN}Recall=TP+FNTP
- 特点:召回率关注的是模型对正类样本的识别能力,常用于需要尽可能找出所有正类样本的情况。
- 代码示例:
from sklearn.metrics import recall_score
import numpy as np
y_true = np.array([0, 1, 0, 1])
y_pred = np.array([1, 1, 0, 1])
recall = recall_score(y_true, y_pred)
print(f"召回率: {recall}")
4. F1值(F1 - Score)
- 定义:精确率和召回率的调和平均数,用于综合衡量模型的性能。
- 公式:F1=2×Precision×RecallPrecision+RecallF1 = 2\times\frac{Precision\times Recall}{Precision + Recall}F1=2×Precision+RecallPrecision×Recall
- 特点:F1 值在精确率和召回率之间取得了平衡,当两者都较高时,F1 值也会较高。
- 代码示例:
from sklearn.metrics import f1_score
import numpy as np
y_true = np.array([0, 1, 0, 1])
y_pred = np.array([1, 1, 0, 1])
f1 = f1_score(y_true, y_pred)
print(f"F1值: {f1}")
分类指标对比表
指标 | 公式 | 关注重点 | 适用场景 |
---|---|---|---|
准确率 | (TP+TN)/Total(TP+TN)/Total(TP+TN)/Total | 整体正确率 | 类别平衡 |
精确率 | TP/(TP+FP)TP/(TP+FP)TP/(TP+FP) | 预测正类的准确性 | 减少误报(如垃圾邮件检测) |
召回率 | TP/(TP+FN)TP/(TP+FN)TP/(TP+FN) | 正类样本的覆盖率 | 疾病筛查(避免漏诊) |
F1值 | 2∗P∗RP+R2*\frac{P*R}{P+R}2∗P+RP∗R | 精确率与召回率的平衡 | 类别不平衡 |
聚类任务评估指标
1. 轮廓系数(Silhouette Coefficient)
- 定义:衡量每个样本与其所在簇的紧密程度以及与其他簇的分离程度,取值范围为[−1,1][-1, 1][−1,1]。值越接近 1 表示样本聚类效果越好,越接近 -1 表示样本可能被错误地分配到了其他簇。
- 公式:s(i)=b(i)−a(i)max{a(i),b(i)}s(i)=\frac{b(i)-a(i)}{\max\{a(i),b(i)\}}s(i)=max{a(i),b(i)}b(i)−a(i),其中a(i)a(i)a(i)是样本iii到同一簇内其他样本的平均距离,b(i)b(i)b(i)是样本iii到其他最近簇中所有样本的平均距离。
- 特点:可以在不知道真实标签的情况下评估聚类效果,但计算复杂度较高。
- 代码示例:
from sklearn.metrics import silhouette_score
from sklearn.datasets import make_blobs
from sklearn.cluster import KMeans
X, _ = make_blobs(n_samples=500, centers=4, random_state=42)
kmeans = KMeans(n_clusters=4, random_state=42).fit(X)
labels = kmeans.labels_
silhouette_avg = silhouette_score(X, labels)
print(f"轮廓系数: {silhouette_avg}")
2. 兰德指数(Rand Index)
- 定义:当已知真实标签时,用于衡量聚类结果与真实标签的一致性。取值范围为[0,1][0, 1][0,1],值越接近 1 表示聚类结果与真实标签越一致。
- 公式:RI=TP+TNTP+TN+FP+FNRI=\frac{TP + TN}{TP+TN+FP+FN}RI=TP+TN+FP+FNTP+TN(这里的TPTPTP、TNTNTN、FPFPFP、FNFNFN是基于聚类结果和真实标签的组合情况计算得到的)
- 特点:考虑了所有样本对的分类情况,能够全面地评估聚类结果的准确性。
- 代码示例:
from sklearn.metrics import rand_score
import numpy as np
labels_true = np.array([0, 0, 1, 1])
labels_pred = np.array([0, 0, 1, 1])
ri = rand_score(labels_true, labels_pred)
print(f"兰德指数: {ri}")
聚类指标对比表
指标 | 公式 | 是否需要标签 | 取值范围 | 特点 |
---|---|---|---|---|
轮廓系数 | b(i)−a(i)max(a(i),b(i))\frac{b(i)-a(i)}{\max(a(i),b(i))}max(a(i),b(i))b(i)−a(i) | 否 | [-1, 1] | 评估簇内紧密度与簇间分离度 |
兰德指数 | TP+TNTP+TN+FP+FN\frac{TP+TN}{TP+TN+FP+FN}TP+TN+FP+FNTP+TN | 是 | [0, 1] | 衡量与真实标签的一致性 |
核心指标速查表
任务类型 | 首选指标 | 次要指标 | 使用建议 |
---|---|---|---|
回归预测 | RMSE | R² + MAE | 优先报告RMSE,补充R²解释方差 |
二分类 | F1值 | 精确率 + 召回率 | 类别不平衡时用F1,需控制误报时看精确率 |
多分类 | 准确率 | 宏平均F1 | 类别平衡时用准确率,不平衡时用宏平均F1 |
聚类分析 | 轮廓系数 | 兰德指数(带标签) | 无监督场景用轮廓系数,有标签时用兰德指数 |
更多推荐
所有评论(0)