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()

多分类类别不均衡时权重如何设置_Test

📣

通过热图我们可以看到:

对于类别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机器学习基础教程》