【机器学习笔记】——模型评价准则(Evaluation metrics)

目 录

1 模型选择

  模型选择有两个思路,一是解释性。即在现有数据下哪些特征是重要的特征,应该用什么样的模型来解释数据。好的模型应该是最能解释现有数据的模型,也就是说更能拟合训练集数据的模型(训练误差小)。二是预测性,好的模型应该是泛化能力更强的模型,也就是说在测试集上表现更好的模型。笔记里主要关注的是后者,即如何评价一个训练好了的模型(已知参数的模型)的好坏

2 回归任务

2.1 MSE(Mean Square Error)均方误差

(1) M S E = 1 N ∑ i = 1 N ( y i − y i ^ ) 2 MSE = \frac{1}{N} \sum_{i = 1}^{N} {(y_i - \hat{y_i})}^2 \tag{1} MSE=N1i=1N(yiyi^)2(1)

  在训练模型时常被用作线性回归的损失函数,所以自然地也拿来在测试集上评价模型

2.2 RMSE(Root Mean Square Error)均方根误差

(2) R M S E = M S E = 1 N ∑ i = 1 N ( y i − y i ^ ) 2 RMSE = \sqrt{MSE} = \sqrt{\frac{1}{N} \sum_{i = 1}^{N} {(y_i - \hat{y_i})}^2} \tag{2} RMSE=MSE =N1i=1N(yiyi^)2 (2)

  常作为机器学习模型预测结果的评价准则,比如随机森林回归和XGBregressor的默认评价准则都是这个。RMSE和MSE的区别仅在于做了一个平方,使得量纲和变量保持一致,有点像平方差和标准差的感觉。所以对于评价模型两者没什么优劣之分,只不过RMSE可能有更好的解释性。

2.3 RMSLE(Root Mean Square Log Error)均方根对数误差

(3) R M S L E = 1 N ∑ i = 1 N ( log ⁡ ( y i + 1 ) − log ⁡ ( y i ^ + 1 ) ) 2 RMSLE = \sqrt{\frac{1}{N} \sum_{i = 1}^{N} {(\log (y_i + 1) - \log (\hat{y_i} + 1))}^2} \tag{3} RMSLE=N1i=1N(log(yi+1)log(yi^+1))2 (3)

  使用RMSLE的好处:

  •   一个有趣的现象是使用RMSLE对于预测值较小的惩罚更大:考虑只有一个实例的学习,如果真实值为1000,预测值为1100,此时 R M S E = 100 RMSE = 100 RMSE=100 R M S L E = 0.095 RMSLE = 0.095 RMSLE=0.095;如果预测值为900,此时 R M S E = 100 RMSE = 100 RMSE=100 R M S L E = 0.105 RMSLE = 0.105 RMSLE=0.105。这一点可能对于特殊的情况有一些好处

  •   取对数是一个变化量纲的变换,能够把一些大的值压缩,把一些小的值增大。所以当数据中有少量的值和真实值差别较大时,RMSLE能够降低这些值对于整体误差的影响,这会降低个别异常点对于模型评价的影响。

  •   同前一条有点类似,如果要预测的数据的量纲很大,比如一个左偏的模型。那么如果模型在大的真实值处的误差就会使RMSE的结果很大,得出这个模型不好的结论;而如果一个事实上很差的模型在这个大的真实值上的预测很准确而在非常多的小的真实值处有一些误差,那么的RMSE反而会没有前面那个模型的大,得出这个模型更好的结论。RMSLE就是会降低这种错误的准则。另一个方法是先对标签取 log ⁡ \log log,再用RMSE作为评价准则,这需要提前认识数据的分布。

2.4 MAE(Mean Absolute Error)平均绝对误差

(4) M A E = 1 N ∑ i = 1 N ∣ y i − y i ^ ∣ MAE = \frac{1}{N} \sum_{i = 1}^{N} {|y_i - \hat{y_i}|} \tag{4} MAE=N1i=1Nyiyi^(4)

  因为这个函数不是处处可导,所以没有用作线性回归训练模型的损失函数,但是这不影响它可以作为测试集上的模型评价准则。MAE和RMSE具有同样的量纲,但是RMSE会对误差平方后再求和,也就是说它能够放大误差更大的样本的影响,而MAE就是真实误差的直接反映。RMSE越小说明最大误差越小,因为能反映最大误差,所以RMSE更常用一些。

2.5 R 2 R^2 R2(R Squared)R方

(5) R 2 = 1 − S S R S S T = 1 − ∑ i = 1 N ( y i − y i ^ ) 2 ∑ i = 1 N ( y i − y i ˉ ) 2 = 1 − M S E V a r R^2 = 1 - \frac{SSR}{SST} = 1 - \frac{\sum_{i = 1}^{N} {(y_i - \hat{y_i})}^2}{\sum_{i = 1}^{N} {(y_i - \bar{y_i})}^2} = 1 - \frac{MSE}{Var} \tag{5} R2=1SSTSSR=1i=1N(yiyiˉ)2i=1N(yiyi^)2=1VarMSE(5)

  R方是线性回归中非常常用的评价准则,先来了解一下R方的产生。我们先以RMSE为例,对于同一个预测身高的模型,如果把标签的单位从米换成厘米,那么RMSE就会变成原来的100倍,那么能不能说用米做单位的模型更好呢,这显然说不通,因为两个模型是等价的。一个自然的想法是,既然RMSE研究的是数据的绝对误差,那么只要用相对误差就好了,那么相对于什么呢?考虑先相对于原始数据的平方和

(6) ∑ i = 1 N ( y i − y i ^ ) 2 ∑ i = 1 N y i 2 \frac{\sum_{i = 1}^{N} {(y_i - \hat{y_i})}^2}{\sum_{i = 1}^{N} {y_i}^2} \tag{6} i=1Nyi2i=1N(yiyi^)2(6)

  这样看似是不错的,但是仍然存在一些问题,就是如果 Y Y Y 增加平移,结果就会产生变化。比如我们希望研究的是相对于海平面的身高而不是相对于地面的身高,那么所有的真实值和预测值都会加上一个所在地面的海拔高度。这样一来分子并不会因为这一段海拔高度变化,而分母却会产生变化。我们真正关心的是不同的人身高之间的差异与哪些因素有关,只是改变了测量身高的参考系,不应该改变模型对不同的人身高差异的预测能力,所以上面采用误差平方和与真实值比值的评分方式也需要改进。

  为了使得我们的模型好坏评分系统不会因为模型里的预测值同时增加会减小一个固定值(比如像上面的例子那样将参考系从地面变成海平面)而改变,可以先将 Y Y Y 的预测值先减去其平均值(这一过程也叫做中心化),再取平方和,叫做总平方和

(7) ∑ i = 1 N ( y i − y i ^ ) 2 ∑ i = 1 N ( y i − y i ˉ ) 2 \frac{\sum_{i = 1}^{N} {(y_i - \hat{y_i})}^2}{\sum_{i = 1}^{N} {(y_i - \bar{y_i})}^2} \tag{7} i=1N(yiyiˉ)2i=1N(yiyi^)2(7)

  我们也把分母表示的模型称为基准模型,即把平均值作为真实值的预测。到了这里我们就已经得到了一个不错的评价准则,但是在我们的惯性思维中一般都是评分高,结果越好,所以我们用 1 减去上面的分式作为最终结果,也就是R方。

(8) R 2 = 1 − ∑ i = 1 N ( y i − y i ^ ) 2 ∑ i = 1 N ( y i − y i ˉ ) 2 R^2 = 1 - \frac{\sum_{i = 1}^{N} {(y_i - \hat{y_i})}^2}{\sum_{i = 1}^{N} {(y_i - \bar{y_i})}^2} \tag{8} R2=1i=1N(yi

  • 1
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
机器学习模型评价指标可以分为分类模型和回归模型两类。 ## 分类模型评价指标 ### 混淆矩阵 混淆矩阵是分类模型评价中最基本的指标,它用于描述分类模型预测结果和真实结果之间的关系。可以用以下代码实现混淆矩阵的可视化: ```python import matplotlib.pyplot as plt import seaborn as sns from sklearn.metrics import confusion_matrix def plot_confusion_matrix(y_true, y_pred, classes, normalize=False, cmap=plt.cm.Blues): cm = confusion_matrix(y_true, y_pred) if normalize: cm = cm.astype('float') / cm.sum(axis=1)[:, np.newaxis] plt.imshow(cm, interpolation='nearest', cmap=cmap) plt.title('Confusion matrix') plt.colorbar() tick_marks = np.arange(len(classes)) plt.xticks(tick_marks, classes, rotation=45) plt.yticks(tick_marks, classes) fmt = '.2f' if normalize else 'd' thresh = cm.max() / 2. for i, j in itertools.product(range(cm.shape[0]), range(cm.shape[1])): plt.text(j, i, format(cm[i, j], fmt), horizontalalignment="center", color="white" if cm[i, j] > thresh else "black") plt.tight_layout() plt.ylabel('True label') plt.xlabel('Predicted label') ``` ### 准确率 准确率是分类模型评价中最常用的指标,用于衡量模型预测正确的样本占总样本数量的比例。可以用以下代码实现准确率的计算和可视化: ```python from sklearn.metrics import accuracy_score def plot_accuracy(y_true, y_pred): acc = accuracy_score(y_true, y_pred) plt.figure(figsize=(4, 4)) plt.title('Accuracy: {:.2%}'.format(acc)) sns.heatmap(confusion_matrix(y_true, y_pred), square=True, annot=True, fmt='d', cbar=False) ``` ### 精确率、召回率和 F1 值 精确率是指模型预测为正例的样本中,真正为正例的样本占比;召回率是指真正为正例的样本中,被模型预测为正例的样本占比;F1 值是精确率和召回率的调和平均数。可以用以下代码实现精确率、召回率和 F1 值的计算和可视化: ```python from sklearn.metrics import precision_score, recall_score, f1_score def plot_precision_recall_f1(y_true, y_pred): precision = precision_score(y_true, y_pred) recall = recall_score(y_true, y_pred) f1 = f1_score(y_true, y_pred) plt.figure(figsize=(4, 4)) plt.title('Precision: {:.2%}, Recall: {:.2%}, F1 Score: {:.2%}'.format(precision, recall, f1)) sns.heatmap(confusion_matrix(y_true, y_pred), square=True, annot=True, fmt='d', cbar=False) ``` ## 回归模型评价指标 ### 均误差和均根误差 均误差是回归模型评价中最常用的指标之一,用于衡量模型预测值与真实值之间的差异。均根误差是均误差的平根。可以用以下代码实现均误差和均根误差的计算和可视化: ```python from sklearn.metrics import mean_squared_error def plot_mse_rmse(y_true, y_pred): mse = mean_squared_error(y_true, y_pred) rmse = np.sqrt(mse) plt.figure(figsize=(4, 4)) plt.title('MSE: {:.2f}, RMSE: {:.2f}'.format(mse, rmse)) plt.scatter(y_true, y_pred, alpha=0.5) plt.plot([y_true.min(), y_true.max()], [y_true.min(), y_true.max()], 'k--') plt.xlabel('True Values') plt.ylabel('Predictions') ``` ### R2 值 R2 值是回归模型评价中最常用的指标之一,用于衡量模型解释数据差的能力,取值范围为 0 到 1。可以用以下代码实现 R2 值的计算和可视化: ```python from sklearn.metrics import r2_score def plot_r2(y_true, y_pred): r2 = r2_score(y_true, y_pred) plt.figure(figsize=(4, 4)) plt.title('R2 Score: {:.2%}'.format(r2)) plt.scatter(y_true, y_pred, alpha=0.5) plt.plot([y_true.min(), y_true.max()], [y_true.min(), y_true.max()], 'k--') plt.xlabel('True Values') plt.ylabel('Predictions') ``` 以上是一些常用的机器学习模型评价指标及可视化代码,可以根据实际需求进行调整和修改。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值