分类回归算法的评价指标
引言
最近在做一些机器学习算法的工作,主要是应用,基本的机器学习算法都既可以做分类,又可以回归,然后对分类与回归算法进行评估的话有一些指标,本文主要是介绍这些一指标,以及计算方法,实现方法。
分类指标
对于二分类、多分类算法而言,主要的评价指标如下:
- Accuracy(准确度)
其是衡量分类结果最直接的评价指标,但是其对样本中正负样本的平衡性有要求,在比较平衡的样本中有较好的效果,如果正负样本差距较大则没什么参考性。它的定义
预测正确的样本的数量占总样本数量的比例,例如有80个样本,60个预测正确,则accuracy是0.75.在不平衡的样本里面,正例远大于负例子,所以都预测成正例子,准确率也很高,但是是没有参考意义的。
其实现在sklearn的metrics中有
from sklearn.metrics import accuracy_score
accuracy_score(y_true, y_pred)
-
Precision(精确度)
在介绍这个之前,先引入混肴矩阵的定义,混肴矩阵主要就是用来定义这些评价指标的。混淆矩阵如下图所示:
混淆矩阵
如上图所示,precision的定义维
p=TP/(TP+FP), 即预测正确的正例占所有预测为正例的样本的比例
sklearn中的函数为
from sklearn.metrics import precision_score
precision_score(y_true, y_pred, average='macro')#'macro'的方法是计算每个标签的指标,并找到它们的未加权平均值
- recall(召回率)
召回率的定义如下所示
R=TP/(TP+FN), 即预测正确,占所有正例比例
其实现如下:
from sklearn.metrics import recall_score
recall_score(y_true, y_pred, average='micro')
- F1 score
F1 score 可以被解释为精度和召回率的加权平均值,其中F1得分在最佳值为1,最差值为0。精度和召回对F1得分的相对贡献是相等的。其公式如下
F1 = 2 * (precision * recall) / (precision + recall), precision与recall的定义如上所示, F1 score是一个综合的指标,可以用来评估模型的好坏
其在sklearn中的实现代码如下
from sklearn.metrics import f1_score
f1_score(y_true, y_pred, average='micro')
回归算法的评估标准
回归算法预测主要是连续的值,故回归算法的评估标准常用的有三种,但是基本都是差值分布的。
-
平均绝对误差(MAE)
MAE.png
其中y是真实的值,有y_hat是预测出来的值。sklearn中的实现如下:
from sklearn.metrics import mean_absolute_error
mean_absolute_error(y_true, y_pred)
- MSE (均方误差)
其跟MAE基本一致,不过其计算的时候,在算|y_i-y_hat|的时候,加一个平方,即可
实现如下:
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)
- R方
R方主要是用来判断模型的拟合优度,越接近1,则说明效果越好,负值代表模型效果极差,无参考价值,主要的公式如下所示:
其中y- 代表的是均值。
在sklearn中的实现为:
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)
- 相关系数r
主要是用来判断预测的样本值得分布与真实得样本值分布之间得相关性。公式如下所示
带*得y表示预测得y得均值
sklearn中得实现如下所示
from scipy.stats import pearsonr
pccs = pearsonr(y_true, y_pre)
这种方法在预测年龄等连续得变量,相关性比较有更好得可观度
-
KL散度
该指标主要是用来衡量预测得值与真实得值之间分布得相似性,其主要基于熵得原理。越小表示越相关,主要公式如下:
KL散度
其主要在神经网络或者机器学习得算法中作为损失函数,经常与MAE配合使用。python中得实现如下:
import scipy.stats
KL = scipy.stats.entropy(x, y)