评估指标与评分(下):多分类指标及其他
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- 分数。
:star:如果对每个样本等同看待,那么推荐使用“微”平均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机器学习基础教程》