评估指标与评分(下):多分类指标及其他

1、多分类指标

前面已经深入讨论了二分类任务的评估,下面来看一下对多分类问题的评估指标。

多分类问题的所有指标基本上都来自二分类指标,但要对所有类别进行平均。

除了精度,常用的工具有混淆矩阵和分类报告

sklearn.metrics.confusion_metrix

sklearn.metrics.classification_report

from sklearn.metrics import confusion_matrix
from sklearn.metrics import classification_report
from sklearn.datasets import load_digits
from matplotlib import pyplot as plt
from sklearn.linear_model import LogisticRegression

建立不平衡数据集

digits = load_digits()

y = digits.target==9

划分数据集

X_train,X_test,y_train,y_test = train_test_split(digits.data,digits.target,random_state=0)

构建逻辑回归模型

lgr = LogisticRegression().fit(X_train,y_train)
pred = lgr.predict(X_test)

print("Confusion matrix:\n{}".format(confusion_matrix(y_test,pred)))

'''
Confusion matrix: [[37 0 0 0 0 0 0 0 0 0] [ 0 40 0 0 0 0 0 0 2 1] [ 0 1 40 3 0 0 0 0 0 0] [ 0 0 0 43 0 0 0 0 1 1] [ 0 0 0 0 37 0 0 1 0 0] [ 0 0 0 0 0 46 0 0 0 2] [ 0 1 0 0 0 0 51 0 0 0] [ 0 0 0 1 1 0 0 46 0 0] [ 0 3 1 0 0 0 0 0 43 1] [ 0 0 0 0 0 1 0 0 1 45]]
'''


将混淆矩阵转换为热图

import mglearn

images = mglearn.tools.heatmap(confusion_matrix(y_test,pred),xlabel="predict label",ylabel="true label",
xticklabels=digits.target_names,yticklabels=digits.target_names,
cmap=plt.cm.gray_r,fmt="%d")

plt.title("Confusion metrix")
plt.gca().invert_yaxis()

📣

通过热图我们可以看到:

对于类别0(数字0),它包含37个样本,均被正确分类到类别0
对于其他数字,比如类别2,它有3个样本被错误地分到了类别3,1个样本被错误地分配到类别1...

利用classification_report函数,计算每个类别的准确率、召回率、f1-分数

print("classification report:\n{}".format(classification_report(y_test,pred)))

'''
```
classification report:
precision recall f1-score support

0 1.00 1.00 1.00 37
1 0.89 0.93 0.91 43
2 0.98 0.91 0.94 44
3 0.91 0.96 0.93 45
4 0.97 0.97 0.97 38
5 0.98 0.96 0.97 48
6 1.00 0.98 0.99 52
7 0.98 0.96 0.97 48
8 0.91 0.90 0.91 48
9 0.90 0.96 0.93 47

accuracy 0.95 450
macro avg 0.95 0.95 0.95 450
weighted avg 0.95 0.95 0.95 450
```
'''

多分类问题中的不平衡数据集,最常用的指标就是:多分类版本的f-分数

  • 对于每个类别计算一个二分类f-分数,然后使用一下策略进行平均

“宏”(macro)平均:计算未加权的按类别f- 分数。它对所有类别给出相同的权重,无论类别中的样本量大小。

“加权”(weighted)平均:以每个类别的支持作为权重来计算按类别f- 分数的平均值。分类报告中给出的就是这个值。

“微”(micro)平均:计算所有类别中假正例、假反例和真正例的总数,然后利用这些计数来计算准确率、召回率和f- 分数。

⭐如果对每个样本等同看待,那么推荐使用“微”平均f1- 分数;如果对每个类别等同看待,那么推荐使用“宏”平均f1- 分数

print("Mico average f1 score:{:.3f}".format(f1_score(y_test,pred,average="micro")))

'''
Mico average f1 score:0.951
'''

2、回归指标

对回归问题可以像分类问题一样进行详细评估,例如,对目标值估计过高与目标值估计过低进行对比分析。但是,对于我们见过的大多数应用来说,使用默认R2 就足够了,它由所有回归器的score 方法给出。业务决策有时是根据均方误差或平均绝对误差做出的,这可能会鼓励人们使用这些指标来调节模型。但是一般来说,我们认为R2 是评估回归模型的更直观的指标。

3、在模型选择中使用评估指标

实际中我们通常希望,在使用GridSearchCV 或cross_val_score 进行模型选择时能够使用AUC等指标。

  • scikit-learn 提供了一种非常简单的实现方法,就是scoring 参数,它可以同时用于GridSearchCV 和cross_val_score。

(1)对于分类问题:
scoring 参数最重要的取值包括:accuracy(默认值)、roc_auc、average_precision(准确率- 召回率曲线下方的面积)、f1、f1_macro、f1_micro 和f1_weighted

(2)对于回归问题:
最常用的取值包括:r^2r2、mean_squared_error(均方误差)和mean_absolute_error(平均绝对误差)。

我们可以查看metrics.scorer 模块中定义的SCORER 字典。

分类问题的默认评分是精度

分类问题的默认评分是精度

但是我们可以改变GridSearchCV中用于选择最佳参数的指标

from sklearn.model_selection import GridSearchCV
from sklearn.svm import SVC

划分数据

X_train,X_test,y_train,y_test = train_test_split(digits.data,digits.target==9,random_state=0)

给出网格参数

pagram_grid = {"gamma":[0.0001,0.01,0.1,1,10]}

使用默认的精度

grid = GridSearchCV(SVC(),param_grid=pagram_grid)

grid.fit(X_train,y_train)

print("Defalut Accuracy:")
print("Best pagrams:{}".format(grid.best_params_))
print("Best cross-validation score(accuracy):{:.3f}".format(grid.best_score_))

print("Test set score:{:.3f}".format(grid.score(X_test,y_test)))

'''
Defalut Accuracy: Best pagrams:{'gamma': 0.0001} Best cross-validation score(accuracy):0.976 Test set score:0.973
'''

使用AUC评分来代替

使用AUC评分来代替

grid = GridSearchCV(SVC(),param_grid=pagram_grid,scoring='roc_auc')

grid.fit(X_train,y_train)

print("Grid Search with AUC:")
print("Best pagrams:{}".format(grid.best_params_))
print("Best cross-validation score(AUC):{:.3f}".format(grid.best_score_))

print("Test set score:{:.3f}".format(grid.score(X_test,y_test)))

'''
Grid Search with AUC: Best pagrams:{'gamma': 0.01} Best cross-validation score(AUC):0.998 Test set score:1.000
'''

在使用Accuracy时:选择的最优参数是gamma=0.0001 AUC:gamma=0.01

两者在交叉验证精度是很接近的,但使用AUC在测试集上的表现明显更优!

4、参考文献

《python机器学习基础教程》

posted @ 2022-05-28 19:48  朝南烟  阅读(828)  评论(0)    收藏  举报
body { color: #000; background-color: #e6e6e6; font-family: "Helvetica Neue",Helvetica,Verdana,Arial,sans-serif; font-size: 12px; min-height: 101%; background: url(https://images.cnblogs.com/cnblogs_com/caolanying/1841633/o_2009041…ly1geq8oc9owbj21hc0u0th5.jpg) fixed; } #home { margin: 0 auto; opacity: 0.8; width: 65%; min-width: 1080px; background-color: #fff; padding: 30px; margin-top: 50px; margin-bottom: 50px; box-shadow: 0 2px 6px rgba(100, 100, 100, 0.3); }