机器学习评估标准:回归与分类
一、回归模型的评估指标
y_true:验证集的实际类别;y_pred:验证集的预测类别
1. 绝对误差
绝对误差指预测点和真实点之间的距离之差的绝对值的平均值;
#绝对误差的实现
from sklearn.metrics import mean_absolute_error
mean_absolute_error(y_true,y_pred)
2. 均方误差
均方误差即预测点和实际点之间的距离之差的平方和的均值;
#均方误差的实现
from sklearn.metrics import mean_squared_error
mean_squared_error(y_true,y_pred)
二、分类模型的评估指标
分类模型的不同评估指标的侧重点不同,彼此可能还会存在冲突。
TP:预测为正实际为正 TN:预测为负,实际为负
FP:预测为正实际为负 FN:预测为负,实际为正
T/F:表示预测结果是否正确 P/N:表示预测结果是正或负样本
1. 准确率
衡量模型对于数据集中样本预测正确的比例,即预测正确的样本数量与参加预测的全部样本数量之比;
a c c u r a c y = 预测正确的样本总数 参 加 预 测 的 样 本 总 数 量 accuracy=\frac{\text{预测正确的样本总数}}{参加预测的样本总数量} accuracy=参加预测的样本总数量预测正确的样本总数
#准确率的实现
from sklearn.metrics import accuracy_score
Accuracy=accuracy_score(y_true,y_pred,normalize=True)
#normalize:默认值为True,返回正确分类的比例;若为False,则返回正确分类的样本数
2. 精度
所有预测为正例的样本(TP+FP)中真正为正例的样本(TP)的比率;就是你找到的信息中,真正是想要的有多少的衡量量,又称“查准率”
p
r
e
c
i
s
i
o
n
=
T
P
T
P
+
F
P
precision=\frac{TP}{TP+FP}
precision=TP+FPTP
#精度的实现
from sklearn.metrics import precision_score
Precision=precision_score(y_true,y_pred,average=None)
#评价值的平均值的计算方式;可以接收[None, 'binary' (default), 'micro','macro', 'samples', 'weighted']对于多类/多标签目标需要此参数
#None:直接返回各个类别的精度列表;macro:直接计算各个类别的精度值的平均;weight:可通过对每个类别的score进行加权求得;micro:多标签问题中,大类被忽略
3. 召回率(在犯罪检索等活动中较为重要)
所有为正例的样本(TP+FN)中真的正例(TP)的比率;用于评测是否把样本中的所有真的正例全部找出来,又称“查全率”
r
e
c
a
l
l
=
T
P
T
P
+
F
N
recall=\frac{TP}{TP+FN}
recall=TP+FNTP
#召回率的实现
from sklearn.metrics import recall_score
Recall=recall_score(y_true,y_pred,average=None)
#average的参数含义与precision_score相同
4. F1值
一般来说,精度与召回率是一对矛盾的值;当recall=precision时,是一个平衡点,是另一种度量方式,即为F1值(即精度和召回率的调和平均数)
对于P-R曲线,如果一个机器学习的曲线被另一个机器学习的曲线完全包住,则后者优于前者。
F
1
=
2
×
P
×
R
P
+
R
F1=\frac{2×P×R}{P+R}
F1=P+R2×P×R
#F1值的实现
from sklearn.metrics import f1_score
F1=f1_score(y_true,y_pred,pos_label=1,average=None) #average必需
对于以上的三个评价标准,可以使用一个整体使用函数:classification_report进行输出
from sklearn.metrics import classification_report
#target_names=['class 0','class 1','class 2']
classification_report(y_true,y_pred,target_names=None)
#target_names是字符列表形式,可以用来指定输出类别的名字
5. ROC曲线
很多学习器对测试样本产生一个实数值或是概率,然后将这个预测值和一个分类阈值进行比较,大于阈值取1,小于阈值取0。
我们根据学习器预测结果对样例进行排序,按此顺序逐个把样本作为正例预测,每次计算(纵轴:真正率TP;横轴:假正率FP),并绘图即可得到ROC曲线。并且如果一个机器学习的曲线被另一个机器学习的曲线完全包住,则前者优于后者。(如果两条ROC曲线相交,那么就要通过求解曲线围成的面积AUC)
步骤:
- 得到全部样本的概率输出(pred),根据每个测试样本属于正例的概率从大到小排序;
- 从高到低依次将pred作为阈值(threshold),如果预测概率大于等于阈值,则为正样本;否则为负样本;
- 每选取一次不同的阈值,就可以得到一组FP和TP,即ROC曲线上的一点,进而得到ROC曲线。
#ROC曲线的实现
from sklearn import metrics
metrics.roc_curve(y_true,y_pred,pos_label=1)
#pos_label是指正例的类别
6. AUC
ROC曲线和坐标轴围成的面积;
#AUC的实现
from sklearn.metrics import roc_auc_score
print roc_auc_score(y_true,y_pred_prob)
#y_true是验证集样本的实际类别;y_pred_prob是验证集样本的预测概率值
7. 混淆矩阵
评估分类模型好坏的形象化展示工具;如果混淆矩阵中非对角线元素全为0,则表示是一个完美的分类器。
#混淆矩阵的实现
from sklearn.metrics import confusion_matrix
print confusion_matrix(y_true,y_pred,labels=true)
#label字符类别形式,指定各个类别显示的名称,默认为None
混淆矩阵:第一行是实际值为0的这些值中,4个预测值为0,1个预测值是1,0个预测值是2;
第二行是实际值为1的这些值中,0个预测值为0,2个预测值是1,0个预测值是2;
第三行是实际值为2的这些值中,0个预测值为0,0个预测值是1,2个预测值是2;