分类模型相对是比较好评估的,一般来说我们在训练时会将训练数据分为训练集,验证集和测试集
三份或者训练集,测试集
两份.当模型训练完成,基于模型在测试集上的预测结果和真实结果,计算一些指标来评估模型的泛化能力.这些指标主要包括准确度(accuracy),精确度(precision),召回率(recall),F1,AUC.理论上来看,指标越大,模型的泛化能力越强.
这些指标按照内在逻辑可以分为两种
在介绍指标之前,不妨假设这是二分类问题,类别有正/负两种(或者1/0两种),先给出以下四种定义,用来划分测试集:
测试集中的样本一定会符合以上四种定义之一.
横轴预测,纵轴真值 | 预测为正 | 预测为负 | 不论预测 |
---|---|---|---|
实际为正 | TP | FN | P |
实际为负 | FP | TN | N |
如果没有特殊说明,这六种符号均表示符合对应定义的样本的数量.
除了precision, recall, F1等基于样例的评价指标,还有AUC(Area Under Curve)这种关于样本总体顺序的指标.
AUC是ROC曲线和y=0直线和x=1直线围的面积,换句话说就是ROC曲线下的面积.
ROC是输出概率分布的二分类器分类能力的一种图形化展示,通过改变阈值(为正的概率大于0.5则预测为正,否则为负,这里0.5就是阈值)画出召回率相对错误正类率的图像.
实际操作中就是
FPR反映的是真值为负的样例中有多少被错误地预测为正的.
为什么说ROC反映的是样本中样例顺序呢?因为ROC的每个点对应一个阈值,而这个阈值对应了按照预测概率升序排序后样本的一种分类方式(排名第几之后的样例全部预测为正). ROC的绘制可以描述为
为什么说AUC可以体现样本中样例顺序呢?因为按照预测概率升序排序后样本
我们不妨想象
除了上面的这些指标,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分类器损失 |