分类模型相对是比较好评估的,一般来说我们在训练时会将训练数据分为训练集,验证集和测试集
三份或者训练集,测试集
两份.当模型训练完成,基于模型在测试集上的预测结果和真实结果,计算一些指标来评估模型的泛化能力.这些指标主要包括准确度(accuracy),精确度(precision),召回率(recall),F1,AUC.理论上来看,指标越大,模型的泛化能力越强.
这些指标按照内在逻辑可以分为两种
在介绍指标之前,不妨假设这是二分类问题,类别有正/负两种(或者1/0两种),先给出以下四种定义,用来划分测试集:
测试集中的样本一定会符合以上四种定义之一.
横轴预测,纵轴真值 | 预测为正 | 预测为负 | 不论预测 |
---|---|---|---|
实际为正 | TP | FN | P |
实际为负 | FP | TN | N |
如果没有特殊说明,这六种符号均表示符合对应定义的样本的数量.
我们不妨想象,一个分类器把所有样本都预测为正,则召回率很高;如果它只把样本中最有可能为正的一个预测为正,其他都为负,则准确度很高.所以精确度和召回率都不能独自完全描述一个模型的准确程度.而F1是准确度和召回率的调和平均,是综合准确度和召回率的一种指标,反映的是预测对的正样本和预测错的样本数的比例.
$$ F1 = \frac{1}{\frac{\frac{1}{precision} + \frac{1}{recall}}{2}} = 2 * \frac {precision * recall}{precision + recall} = \frac{2 * TP}{2 * TP + FN + FP}$$除了precision, recall, F1等基于样例的评价指标,还有AUC(Area Under Curve)这种关于样本总体顺序的指标.
AUC是ROC曲线和y=0直线和x=1直线围的面积,换句话说就是ROC曲线下的面积.
ROC是输出概率分布的二分类器分类能力的一种图形化展示,通过改变阈值(样例的预测概率大于阈值则预测样例为正,否则为负.比如概率大于0.5则预测为正,否则为负,这里0.5就是阈值)画出召回率相对错误正类率的图像.
实际操作中就是
FPR反映的是真值为负的样例中有多少被错误地预测为正的.
为什么说ROC反映的是样本中样例顺序呢?因为ROC的每个点对应一个阈值,而这个阈值对应了按照预测概率升序降序后样本(我们叫做sorted sample)的一种分类方式(排名第几之前的样例全部预测为正).
通过sorted sample,ROC的绘制可以描述为
因为ROC曲线是通过连接这些点绘制的,所以ROC曲线一定介于
而绿线下的面积呢? $$ \frac{1}{N} \sum_{i=1}^{N-1} TPR_i \\ = \frac{1}{N} \sum_{i=1}^N \frac{pos_i -i}{P} - \frac{pos_N-N}{NP} \\ = \frac{\bar{pos} - \frac{N+1}{2}}{P} - \frac{1}{N} $$
其中$\bar{pos}$为负样例在sorted sample的平均位置.
AUC可以体现样本中正负样例的相对顺序
我们不妨想象
类似于ROC曲线下面积的计算,
对比AUC和P-R曲线下面积,前者和负样例的平均位置成正比,后者和正样例的平均位置成正比.
前者是负样例的平均位置在当前情况下和把所有负样例都排在所有正样例之前情况下(最差情况)之差和正样例数的比值.AUC在正负样本任何比例下,都可以取值从0到1.
而后者,在最好情况下,为$1 - \frac{P-1}{P+N}$,数值大小和正负样本比例有关.
两者更深层次的区别,目前想不到,还望学友不吝赐教。
可以参考刘铁岩老师的learning2rank.
NDCG和AUC的不同之处在于NDCG中一般用$log_2 {pos_i + 1}$的discount来惩罚负样例拍在正样例前,因为该discount函数是凸函数,所以NDCG对小的pos_i,也就是负样例的预测概率比太多的正样例的预测概率都高,惩罚更强.
Rank Correlation是基于样例对之间的相对顺序的.同样可以参考刘铁岩老师的learning2rank
除了上面的这些指标,sklearn还提供了一些其他接口来做分类模型的评估
接口 | 说明 |
---|---|
metrics.accuracy_score(y_true, y_pred[, …]) |
模型准确度(Accuracy) |
metrics.auc(x, y[, reorder]) |
使用梯形法则计算曲线下面积(AUC) |
metrics.average_precision_score(y_true, y_score) |
计算平均精确率(AP) |
metrics.brier_score_loss(y_true, y_prob[, …]) |
计算Brier得分 |
metrics.classification_report(y_true, y_pred) |
构建主要分类指标的文本报告 |
metrics.cohen_kappa_score(y1, y2[, labels, …]) |
Cohen's kappa: 一个衡量内部注释者协议的统计量 |
metrics.confusion_matrix(y_true, y_pred[, …]) |
计算混淆矩阵来评估分类的准确性 |
metrics.f1_score(y_true, y_pred[, labels, …]) |
计算F1得分 |
metrics.fbeta_score(y_true, y_pred, beta[, …]) |
计算F-beta得分 |
metrics.hamming_loss(y_true, y_pred[, …]) |
计算平均海明损失 |
metrics.hinge_loss(y_true, pred_decision[, …]) |
计算平均hinge损失 |
metrics.jaccard_similarity_score(y_true, y_pred) |
Jaccard相似系数评分 |
metrics.log_loss(y_true, y_pred[, eps, …]) |
对数损失,又名逻辑损失或交叉熵损失 |
metrics.matthews_corrcoef(y_true, y_pred[, …]) |
计算马修斯相关系数(MCC) |
metrics.precision_recall_curve(y_true, …) |
针对不同的概率阈值计算精度(precision),召回率对 |
metrics.precision_recall_fscore_support(…) |
计算精度,召回率,f1,support对 |
metrics.precision_score(y_true, y_pred[, …]) |
计算精度 |
metrics.recall_score(y_true, y_pred[, …]) |
计算召回 |
metrics.roc_auc_score(y_true, y_score[, …]) |
计算特征曲线(ROC AUC)下预测分数的计算区域 |
metrics.roc_curve(y_true, y_score[, …]) |
计算ROC |
metrics.zero_one_loss(y_true, y_pred[, …]) |
0-1分类器损失 |
使用哪种或哪些指标来评估模型时,需要考虑模型的应用.
In [ ]:
In [ ]: