机器学习模型常见评估指标

机器学习模型常见评估指标

python包:sklearn.metrics,参考文档:scikit-learn


目录

一、分类指标

1.1、准确率(Accuracy)

1.2、精确率(Precision)

1.3、召回率(Recall)

1.4、F1-Score

1.5、PR(Precision-Recall)曲线

1.6、AP(Average Precision)

1.7、ROC(Receiver Operating Characteristic)曲线

1.8、AUC(Area Under the Curve)

二、回归指标

2.1、MSE(Mean Squared Error)

2.2、MAE(Mean Absolute Error)

2.3、MSLE(Mean Squared Logarithmic Error)

2.4、MAPE(Mean Absolute Percentage Error)

2.5、R-Squared


一、分类指标

在介绍分类指标之前,先引入一个概念:混淆矩阵(Confusion Matrix),这有助于后续的理解。

对于二分类问题,混淆矩阵为2\times 2维矩阵,如表格所示,其中各个符号含义如下:

  • TP(True Positive):真正例,预测为正例,实际也为正例;
  • FP(False Positive):假正例,预测为正例,实际为反例;
  • TN(True Negative):真反例,预测为反例,实际也为反例;
  • FN(False Negative):假反例,预测为反例,实际为正例。
 预测正例预测反例
实际正例TP(真正例)FN(假反例)
实际反例FP(假正例)TN(真反例)

除此之外,还有TPR和FPR,含义分别为:

  • TPR(True Positive Rate):真正例率,TPR=TP/(TP+FN),在实际为正例的所有样本中,预测为正例的概率;
  • FPR(False Positive Rate):假正例率,FPR=FP/(FP+TN),在实际为反例的所有样本中,预测为正例的概率。

下图为可视化混淆矩阵的一个例子: 

混淆矩阵

from sklearn.metrics import confusion_matrix
y_true = [2, 0, 2, 2, 0, 1]
y_pred = [0, 0, 2, 2, 0, 2]
confusion_matrix(y_true, y_pred)
# from sklearn.metrics import plot_confusion_matrix
# plot_confusion_matrix(clf, X_test, y_test)  

1.1、准确率(Accuracy)

Accuracy=\frac{TP+TN}{TP+TN+FP+FN}

准确率表示模型预测正确的结果占总样本的百分比。但当样本不平衡时,准确率无法评价模型性能的优劣。

from sklearn.metrics import accuracy_score
y_true = [0, 1, 2, 3]
y_pred = [0, 2, 1, 3]
accuracy_score(y_true, y_pred) # 0.5

1.2、精确率(Precision)

Precision=\frac{TP}{TP+FP}

精确率表示模型预测正确的正例样本占所有预测为正例的样本的百分比,即在所有预测为正例的样本中,实际为正例的样本的比例。

from sklearn.metrics import precision_score
y_true = [0, 1, 2, 0, 1, 2]
y_pred = [0, 0, 0, 0, 0, 0]
precision_score(y_true, y_pred, average=None)
# array([0.33..., 0.        , 0.        ])

1.3、召回率(Recall)

Recall=\frac{TP}{TP+FN}

召回率表示模型预测正确的正例样本占所有实际为正例的样本的百分比,即在所有实际为正例的样本中,预测为正例的样本的比例。

from sklearn.metrics import recall_score
y_true = [0, 0, 0, 0, 0, 0]
y_pred = [0, 2, 1, 0, 0, 1]
recall_score(y_true, y_pred, average=None)
# array([0.5, 0. , 0. ])

1.4、F1-Score

F1=\frac{2*Precision*Recall}{Precision+Recall}=\frac{2TP}{2TP+FP+FN}

F1-Score综合了精确率(Precision)与召回率(Recall),是两者的调和平均数,当两者都很高时,F1-Score才会高。

另外,sklearn.metrics提供了一个函数precision_recall_fscore_support可同时计算precision、recall和fscore。

from sklearn.metrics import f1_score
y_true = [0, 1, 2, 0, 1, 2]
y_pred = [0, 2, 1, 0, 0, 1]
f1_score(y_true, y_pred, average=None)
# array([0.8, 0. , 0. ])

1.5、PR(Precision-Recall)曲线

PR曲线描述了精确率(Precision)与召回率(Recall)之间的变化关系,它以召回率为横坐标,精确率为纵坐标,根据分类器的预测结果对测试样本进行排序,将最可能是“正例”的样本排在前面,最不可能是“正例”的样本排在后面,然后按顺序逐个把样本作为“正例”预测,每次计算当前的Recall和Precision,得到一系列点对构成PR曲线。

from sklearn import metrics
y_true = np.array([0, 0, 1, 1])
y_pred = np.array([0.1, 0.4, 0.35, 0.8])
precision, recall, thresholds = metrics.precision_recall_curve(y_true, y_pred)
# metrics.plot_precision_recall_curve(clf, X_test, y_test)

1.6、AP(Average Precision)

AP=\sum_{n}(R_{n}-R_{n-1})P_{n}

AP(Average Precision),以召回率(Recall)在每个阈值下的增益作为权重对每个阈值下的精确率(Precision)进行加权求和,相当于计算PR曲线下的面积。

from sklearn.metrics import average_precision_score
y_true = np.array([0, 0, 1, 1])
y_pred = np.array([0.1, 0.4, 0.35, 0.8])
average_precision_score(y_true, y_pred)

1.7、ROC(Receiver Operating Characteristic)曲线

ROC(Receiver Operating Characteristic)曲线,又称为接受者操作特性曲线。横坐标为假正例率(FPR),纵坐标为真正例率(TPR),通过遍历阈值可以得到一系列点对,然后构成ROC曲线。曲线越接近左上角,说明模型分类性能越好,即TPR越高,正例样本召回率越高,FPR越低,反例样本误判的越少。

Receiver operating characteristic example

from sklearn import metrics
y_true = np.array([1, 1, 2, 2])
y_pred = np.array([0.1, 0.4, 0.35, 0.8])
fpr, tpr, thresholds = metrics.roc_curve(y_true, y_pred, pos_label=2)
# metrics.plot_roc_curve(clf, X_test, y_test)

1.8、AUC(Area Under the Curve)

这里介绍的AUC指的是ROC曲线下的面积,它是一个概率值,可以理解为随机抽取一个正例样本和一个反例样本,分类器预测正例样本为正例大于预测反例样本为正例的概率。

  • 当AUC=1时,分类器可以对样本完美分类,正例样本召回率为1,即所有正例样本都被分类器正确分类;
  • 当0.5<AUC<1时,分类器优于随机猜测,妥善设置阈值的话,能有预测价值;
  • 当AUC=0.5时,分类器对正例和反例样本没有区分能力,不论是正例样本还是反例样本,分类器预测为正例的概率相同;
  • 当AUC<0.5时,分类器比随机猜测还差,但只要总是反预测就优于随机猜测。

from sklearn.metrics import roc_auc_score
roc_auc_score(y_true, y_pred)

二、回归指标

2.1、MSE(Mean Squared Error)

MSE(y,\hat{y})=\frac{1}{N}\sum_{i=1}^{N}(y_{i}-\hat{y}_{i})^{2},其中y为真实值(目标值),\hat{y}为预测值,下同。

MSE为均方误差,也称为L2损失,对异常点敏感,但通过令其导数为0,可以得到更稳定的封闭解。

from sklearn.metrics import mean_squared_error
y_true = [3, -0.5, 2, 7]
y_pred = [2.5, 0.0, 2, 8]
mean_squared_error(y_true, y_pred)

2.2、MAE(Mean Absolute Error)

MAE(y,\hat{y})=\frac{1}{N}\sum_{i=1}^{N} \left | (y_{i}-\hat{y}_{i}) \right |

MAE为平均绝对误差,也称为L1损失,对异常点鲁棒,但其导数不连续,求解效率低。

from sklearn.metrics import mean_absolute_error
y_true = [3, -0.5, 2, 7]
y_pred = [2.5, 0.0, 2, 8]
mean_absolute_error(y_true, y_pred)

直观上可以这样理解:如果我们最小化MSE来对所有的样本点给出一个预测值,那么这个值一定是所有目标值的平均值;如果是最小化MAE,那么这个值则会是所有样本点目标值的中位数。对异常值而言,中位数比均值更加鲁棒,因此MAE对于异常值也比MSE更稳定。

然而MAE存在一个严重的问题(特别是对于神经网络),即更新的梯度始终相同,这可能导致在使用梯度下降快要结束时错过了最小点,因为即使对于很小的损失值,梯度也很大。为了解决这个问题,可以使用变化的学习率,在损失接近最小值时降低学习率。而对于MSE来说不存在这样的问题,因为其梯度会随着损失的减小而减小,从而使得结果更加精确。

2.3、MSLE(Mean Squared Logarithmic Error)

MSLE(y,\hat{y})=\frac{1}{N}\sum_{i=1}^{N}(log_{e}(1+y_{i})-log_{e}(1+\hat{y}_{i}))^{2}

当回归的目标呈指数增长时(例如人口计数、某商品在过去几年中的平均销售额等)是使用MSLE指标的最佳场景。

需要注意的是,该指标对低估的惩罚力度大于对高估的惩罚力度。

from sklearn.metrics import mean_squared_log_error
y_true = [3, 5, 2.5, 7]
y_pred = [2.5, 5, 4, 8]
mean_squared_log_error(y_true, y_pred)

2.4、MAPE(Mean Absolute Percentage Error)

MAPE(y,\hat{y})=\frac{1}{N}\sum_{i=1}^{N}\frac{\left | y_i-\hat{y}_i \right |}{max(\epsilon ,\left | y_i \right |)}

MAPE也称为MAPD(Mean Absolute Percentage Deviation),是平均绝对百分比误差,用来刻画预测值与真实值之间的相对误差,它不会因目标变量的全局缩放而改变。需要注意\epsilon取值为一个任意小的正数以避免除0错误。

from sklearn.metrics import mean_absolute_percentage_error
y_true = [1, 10, 1e6]
y_pred = [0.9, 15, 1.2e6]
mean_absolute_percentage_error(y_true, y_pred)

在上面的例子中,如果使用MAE则会忽视较小目标值的预测误差并且仅反映较大目标值的预测误差,而使用MAPE则可以很好的解决该问题,因为它计算的是关于目标值的相对百分比误差。

2.5、R-Squared

R^2(y,\hat{y})=1-\frac{\sum_{i=1}^{N}(y_i-\hat{y}_i)^2}{\sum_{i=1}^{N}(y_i-\bar{y})^2},其中\bar{y}=\frac{1}{N}\sum_{i=1}^{N}y_i

R-Squared通常表示为R^2 ,它代表了目标值的方差中已经被模型自变量所解释的比例(输入变量对输出变量的解释程度),它提供了一种拟合优度的指示,通过解释的方差的比例来衡量模型对未见样本的预测有多好。但是由于方差取决于数据集,因此R^2在不同数据集之间的比较可能没有意义。

  • R^2为1时,说明模型预测准确无误;
  • 正常情况下,R^2取值区间为[0,1],越接近1表示模型拟合度越高;
  • R^2可以为负值,因为模型可以任意差。

需要注意的是,r2_score在不校正目标样本方差的偏差的情况下计算未调整的R^2

from sklearn.metrics import r2_score
y_true = [3, -0.5, 2, 7]
y_pred = [2.5, 0.0, 2, 8]
r2_score(y_true, y_pred)
#0.948...

未完待续...

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值