模型评估:评价指标-附sklearn API

模型评估

有三种不同的方法来评估一个模型的预测质量:

  • estimator的score方法:sklearn中的estimator都具有一个score方法,它提供了一个缺省的评估法则来解决问题。
  • Scoring参数:使用cross-validation的模型评估工具,依赖于内部的scoring策略。见下。
  • 通过测试集上评估预测误差:sklearn Metric函数用来评估预测误差。

评价指标(Evaluation metrics)

评价指标针对不同的机器学习任务有不同的指标,同一任务也有不同侧重点的评价指标。

主要有分类(classification)、回归(regression)、排序(ranking)、聚类(clustering)、热门主题模型(topic modeling)、推荐(recommendation)等。

1 分类评价指标

分类有二分类和多分类,二分类主要“是”和“不是”的问题,可以扩展到多分类,如逻辑回归->SoftMax。

1.1 准确率

分类中,使用模型对测试集进行分类,分类正确的样本个数占总样本的比例:
a c c u r a c y = n c o r r e c t N t o t a l accuracy= \frac{n_{correct}}{N_{total}} accuracy=Ntotalncorrect
问题:

  1. **不同类别样本无区分:**各个类平等对待,而实际中会针对不同类有所区分,例如医疗上侧重正例的召回(假阴性:不要漏诊疾病),垃圾邮件侧重垃圾邮件的精度(假阳性:正常邮件不被误分)。
  2. 数据不平衡:对于数据分布不平衡情况下,个别类别样本过多,其他类别样本少,大类别主导了准确率的计算。(平均准确率解决此问题)

SKlearn API

from sklearn.metrics import accuracy_score
# y_pred是预测标签
y_pred, y_true=[1,2,3,4], [2,2,3,4]
accuracy_score(y_true=y_true, y_pred=y_pred)

1.2 平均准确率

针对不平衡数据,对n个类,计算每个类别i的准确率,然后求平均:
a v e r a g e _ a c c u r a c y = ∑ a c c u r a c y i n average\_accuracy = \frac{\sum accuracy_i}{n} average_accuracy=naccuracyi
缺点:某些类别样本数很少,测试集中该类别的准确率方差会很大(统计变量偏离程度:高)。

from sklearn.metrics import average_precision_score
# y_pred是预测标签
y_pred, y_true =[1,0,1,0], [0,0,1,0]
average_precision_score(y_true=y_true, y_score=y_pred)

1.3 对数损失(Log-loss)

针对分类输出不是类别,而是类别的概率,使用对数损失函数进行评价。这也是逻辑回归的分类函数,下面是二分类的损失函数。
L o g _ l o s s = − 1 N ∑ i = 1 N y i log ⁡ p i + ( 1 − y i ) log ⁡ ( 1 − p i ) Log\_loss = -\frac{1}{N} \sum_{i=1}^N y_i \log p_i + (1-y_i) \log(1-p_i) Log_loss=N1i=1Nyilogpi+(1yi)log(1pi)
y i y_i yi表示第i个样本类别0或1。 p i p_i pi表示其输入类别1的概率。其实就是真实值域预测值得交叉熵,包含了真实分布的熵加上假设与真实分布不同的分布的不确定性,最小化交叉熵,便是最大化分类器的准确率。

from sklearn.metrics import log_loss
y_true, y_pred = [0,0,1,1], [[0.9,0.1],[0.8,0.2],[0.3,0.7],[0.01,0.99]]
print(log_loss(y_true,y_pred))

1.4 基于混淆矩阵的评估度量

1.4.1 混淆矩阵

混淆矩阵通过计算各种分类度量,指导模型的评估。

Predicted: 0Predicted: 1
Actual: 0TNFP
Actual: 1FNTP
  • 真阳性(True Positive,TP):指被分类器正确分类的正例数据
  • 真阴性(True Negative,TN):指被分类器正确分类的负例数据
  • 假阳性(False Positive,FP):被错误地标记为正例数据的负例数据
  • 假阴性(False Negative,FN):被错误地标记为负例数据的正例数据
from sklearn.metrics import confusion_matrix
# y_pred是预测标签
y_pred, y_true =[1,0,1,0], [0,0,1,0]
confusion_matrix(y_true=y_true, y_pred=y_pred)

1.4.2 精确率(Precision)

所有分正确的正样本/所有预测为正类的样本数。
P r e c i s i o n = T P / ( T P + F P ) Precision = TP/ (TP+FP) Precision=TP/(TP+FP)

1.4.3 召回率(Recall)

所有分正确的正样本/所有的正样本数:
R e c a l l = T P / ( T P + F N ) Recall = TP/ (TP+FN) Recall=TP/(TP+FN)

1.4.4 F1-score

精确率和召回率两者一般同时使用,F1-score中和了二者的评估:
F 1   s c o r e = 2 ∗ P r e c i s i o n ∗ R e c a l l P r e c i s i o n + R e c a l l F1\ score = \frac{2*Precision*Recall}{Precision + Recall} F1 score=Precision+Recall2PrecisionRecall
sklearn中classification_report可以直接输出各个类的precision recall f1-score support

from sklearn.metrics import classification_report
# y_pred是预测标签
y_pred, y_true =[1,0,1,0], [0,0,1,0]
print(classification_report(y_true=y_true, y_pred=y_pred))

1.5 AUC(Area under the Curve(Receiver Operating Characteristic, ROC))

Auc是ROC(Receiver Operating Characteristic)曲线下的面积。在此再次召唤出混淆矩阵:

Predicted: 0Predicted: 1
Actual: 0TNFP
Actual: 1FNTP

TPR(True Positive Rate)

分类器分类正确的正样本个数占总正样本个数的比例:
T P R = T P / ( T P + F N ) TPR = TP/ (TP+FN) TPR=TP/(TP+FN)

FPR(False Positive Rate)

分类器分类错误的负样本个数占总负样本个数的比例:
F P R = F P / ( T N + F P ) FPR = FP/(TN + FP) FPR=FP/(TN+FP)

ROC曲线

描述分类器的True Positive Rate与False Positive Rate之间的变化关系。

img

绘制ROC曲线。

import matplotlib.pyplot as plt 
from sklearn.metrics import roc_curve, auc
# y_test:实际的标签, dataset_pred:预测的概率值。
fpr, tpr, thresholds = roc_curve(y_test, dataset_pred)
roc_auc = auc(fpr, tpr)  
#画图,只需要plt.plot(fpr,tpr),变量roc_auc只是记录auc的值,通过auc()函数能计算出来  
plt.plot(fpr, tpr, lw=1, label='ROC(area = %0.2f)' % (roc_auc))
plt.xlabel("FPR (False Positive Rate)")
plt.ylabel("TPR (True Positive Rate)")
plt.title("Receiver Operating Characteristic, ROC(AUC = %0.2f)"% (roc_auc))
plt.show()

AUC

AUC即为ROC曲线下的面积,同时证明AUC与Wilcoxon-Mann-Witney Test是等价的。其计算公式:
A U C = ∑ i ∈ p o s i t i v e   C l a s s R a n k i − M ( 1 + M ) 2 M ∗ N AUC = \frac{\sum_{i \in positive \ Class} Rank_i - \frac{M(1+M)}{2}}{M * N} AUC=MNipositive ClassRanki2M(1+M)
M为正类样本的数目,N为负类样本的数目, R a n k i Rank_i Ranki是样本i模型预测概率的排名。

from sklearn.metrics import roc_auc_score
# y_test:实际的标签, dataset_pred:预测的概率值。
roc_auc_score(y_test, dataset_pred)

2. 回归评价指标

回归是对连续的实数值进行预测,而分类中是离散值。

2.1 RMSE

RMSE(root mean square error,平方根误差),定义为:
R M S E = ∑ i = 1 n ( y i − y i ^ ) 2 n RMSE = \sqrt{\frac{\sum_{i=1}^n (y_i - \hat{y_i})^2 }{n}} RMSE=ni=1n(yiyi^)2
其中, y i y_i yi是真实值, y i ^ \hat{y_i} yi^是预测值,n是样本数量,使用了欧式距离。

缺点:平均值是非鲁棒的,对于异常点敏感,如果某个异常点误差大,整个RMSE就会比较大。

2.2 均方差(mean squared error)

M A E ( y , y ^ ) = 1 n s a m p l e s ∑ i = 1 n ( y i − y i ^ ) 2 MAE(y,\hat{y}) = \frac{1}{n_{samples}} \sum_{i=1}^n (y_i - \hat{y_i})^2 MAE(y,y^)=nsamples1i=1n(yiyi^)2

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

2.3 平均绝对误差(mean_absolute_error)

$$

MAE(y,\hat{y}) = \frac{1}{n_{samples}} \sum_{i=1}^n |y_i - \hat{y_i}|

$$

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

2.4 中值绝对误差(Median absolute error)

M e d i a n A E = m e d i a n ( ∣ y i − y ^ i ∣ ) MedianAE=median(|y_i− \hat{ y}_i|) MedianAE=median(yiy^i)

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

2.5 R2 决定系数(r2_score)

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} R2=1i=1n(yiyˉi)2i=1n(yiyi^)2

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

问题

  1. 目标是什么?
  2. 使用什么评价指标?
  3. 提升多少才算真正的提升?
  4. 指标采用平均值,基于评价指标满足高斯分布的假设,那么评价指标是否满足高斯分布?

sklearn 评价指标

ScoringFunctionComment
Classification
‘accuracy’metrics.accuracy_score
‘average_precision’metrics.average_precision_score
‘f1’metrics.f1_scorefor binary targets
‘f1_micro’metrics.f1_scoremicro-averaged
‘f1_macro’metrics.f1_scoremacro-averaged
‘f1_weighted’metrics.f1_scoreweighted average
‘f1_samples’metrics.f1_scoreby multilabel sample
‘neg_log_loss’metrics.log_lossrequires predict_proba support
‘precision’ etc.metrics.precision_scoresuffixes apply as with ‘f1’
‘recall’ etc.metrics.recall_scoresuffixes apply as with ‘f1’
‘roc_auc’metrics.roc_auc_score
Clustering
‘adjusted_rand_score’metrics.adjusted_rand_score
Regression
‘neg_mean_absolute_error’metrics.mean_absolute_error
‘neg_mean_squared_error’metrics.mean_squared_error
‘neg_median_absolute_error’metrics.median_absolute_error
‘r2’metrics.r2_score
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

百川AI

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值