sklearn多分类准确率评估分类评估分类报告评估指标 案例

20211101


深思熟虑之后,研究团队确定了两种评估尺度:价格下降查全率(PDR)和预定反悔率(BR)。我们曾统计过,某间房间是否在某天被预定出去,以及预定的价格是多少。PDR和BR都能反映出这一点。
假设如果某间房没能以价格P成功预定,那么它也一定不会在比P更高的价格上预订出去。但是如果价格低于P,那么可能有被预定的机会。PDR就表示当实际价格高于模型的建议价格时,房间未被预定的比例。在下面的图表中,PDR为0.65晚中有3晚没有被预定出去)。

如果我们只有PDR,那么最终我们训练出的模型最后会把指导价格变为零!如果该房间某天被成功预订,价格为P,并且P≥指导价格,那么这个指导价格就没什么用了。预订反悔率就抓住了这之中的利润。BR按以下方法计算:对于所有被成功预订的日子,取零和预定价格与指导价格之间的百分比之中的最大值。然后从这些值中取中位数。
BR就是(145600)的中位数,5%。
https://zhuanlan.zhihu.com/p/46288070

20210127
PR曲线,最后一个阈值是没有的

二分类:

多分类:

一、什么是多类分类?

二、如何处理多类分类?

三、代码实践:

评估指标:混淆矩阵,accuracy,precision,f1-score,AUC,ROC,P-R(不能用)

1.混淆矩阵:

  1. accuracy,precision,reacall,f1-score:

  2. ROC图和AUC值:

4 . 多类分类问题不能用P-R曲线

5.其他评分函数 : score 和 classification_report

二分类:
之前做了二分类问题的评估总结,代码和注释 在我的github:https://github.com/Clarksh/python_data_analyse/blob/master/%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90%E5%AE%9E%E8%B7%B5/task4_%E6%A8%A1%E5%9E%8B%E8%AF%84%E4%BC%B0%EF%BC%88%E6%95%B4%E7%90%86%E7%89%88%EF%BC%89.ipynb

多分类:

那么多类分类下sklearn那些评估指标还能不能用呢?如果能用,为什么能用?应当如何使用?本文就是来解决这个问题。

参考:
https://blog.csdn.net/mixiaolemy/article/details/84529051
https://blog.csdn.net/YE1215172385/article/details/79443552
https://blog.csdn.net/zhanht/article/details/88669537

本文代码连接:https://github.com/Clarksh/python_data_analyse/blob/master/%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90%E5%AE%9E%E8%B7%B5/%E5%A4%9A%E5%88%86%E7%B1%BB%E7%9A%84%E8%AF%84%E4%BC%B0%E9%97%AE%E9%A2%98.ipynb

一、什么是多类分类?
多类分类(multiclass)是指具有两类以上的分类任务; 例如,分类一组可能是橘子,苹果或梨的水果图像。多类分类假设每个样品分配到一个且仅一个标签:水果可以是苹果或梨,但不能同时两个。
当然还有其他:
多标签分类(multilabel)为每个样本分配一组目标标签。这可以被认为是预测不相互排斥的数据点的属性,例如与文档相关的主题。一个文字可能是宗教,政治,金融或教育的任何一个或者同时或没有一个。
更多内容查看:https://blog.csdn.net/mixiaolemy/article/details/84529051

   要说明一点, scikit-learn中的所有分类器都是开箱即用的多类分类,在使用评估方法时相比于二分类问题,记得加一些处理和加上额外的参数就可以,详情看后面的代码。

二、如何处理多类分类?
-----》对标签编码成one-hot !!!

   假设测试样本个数为m,类别个数为n。预测得到测试样本的在各类别下的概率,得到一个[m, n]形状的概率矩阵P,将每个测试样本的标签转换为one-hot ,每个位置用来标记是否属于对应的类别,由此也可以获得一个[m, n]的标签矩阵L。
 将标签转换为one-hot,举个例子:
 0 -> 100
 1 -> 010
  2->001

然后接下来多类分类评估有两种办法,分别对应sklearn.metrics中参数average值为’micro’和’macro’的情况。两种方法求的值也不一样。
方法一:‘micro’:Calculate metrics globally by counting the total true positives, false negatives and false positives.
每种类别下,都可以得到m个测试样本为该类别的概率(矩阵P中的列)。所以,根据概率矩阵P和标签矩阵L中对应的每一列,可以计算出各个阈值下的假正例率(FPR)和真正例率(TPR),从而绘制出一条ROC曲线。这样总共可以绘制出n条ROC曲线。最后对n条ROC曲线取平均,即可得到最终的ROC曲线。

方法二:‘macro’:Calculate metrics for each label, and find their unweighted mean. This does not take label imbalance into account.
(没看很懂?):首先,对于一个测试样本:1)标签只由0和1组成,1的位置表明了它的类别(可对应二分类问题中的‘’正’’),0就表示其他类别(‘’负‘’);2)要是分类器对该测试样本分类正确,则该样本标签中1对应的位置在概率矩阵P中的值是大于0对应的位置的概率值的。基于这两点,将标签矩阵L和概率矩阵P分别按行展开,转置后形成两列,这就得到了一个二分类的结果。所以,此方法经过计算后可以直接得到最终的ROC曲线。

三、代码实践:
处理和建模:
注意的是:预测值y的三种形式:
#形式一:原始值(0或1或2),默认是返回形式二中概率最大的那个类别。
#形式二:各类概率值,比如 [ 8.79681649e-01 1.20307538e-01 1.08131372e-05] 每一个样本分别分三类的概率值。

形式三:one-hot值 是形式一的ont-hot

在这里插入图片描述
from sklearn.metrics import confusion_matrix, precision_score, accuracy_score,recall_score, f1_score,roc_auc_score
在这里插入图片描述
评估指标:混淆矩阵,accuracy,precision,f1-score,AUC,ROC,P-R(不能用)
1.混淆矩阵:
只能用原始数值,不能用one-hot数值

在这里插入图片描述
2. accuracy,precision,reacall,f1-score:
用原始数值和one-hot数值都行;accuracy不用加average=‘micro’(因为没有),其他的都要加上

在二分类中,上面几个评估指标默认返回的是 正例的 评估指标; 在多分类中 , 返回的是每个类的评估指标的加权平均值。


>>> import numpy as np
>>> from sklearn.metrics import accuracy_score
>>> y_pred = [0, 2, 1, 3]
>>> y_true = [0, 1, 2, 3]
>>> accuracy_score(y_true, y_pred)
0.5
>>> accuracy_score(y_true, y_pred, normalize=False)

在这里插入图片描述
3. ROC图和AUC值:
先从二分类角度理解 什么是ROC图和AUC值:
https://mp.weixin.qq.com/s/LwKiqYkZpW1jCLpGdov3SQ 这篇文章讲的很清楚。
然后多类分类下面怎么使用:
要用概率值(形式二) ,加参数 average=‘micro’ (不能用ont-hot (形式三) )
用概率值(形式二):变化阈值产生多个ROC值连成曲线
在这里插入图片描述
结果如图:
在这里插入图片描述
如果用one-hot(形式三) : 求AUC已经确定了(不用变化阈值),只有一个确定的ROC值
结果如图:只有折角那个点是ROC值
在这里插入图片描述
4 . 多类分类问题不能用P-R曲线
仅在二分类问题中可以用P-R曲线,看到文档里面写着 this implementation is restricted to the binary classification task
不过既然提到了,我们就来讲讲P-R曲线在二分类中的使用,还有和ROC曲线的区别:
(1)P-R曲线代码:
在这里插入图片描述
结果如图:
在这里插入图片描述
怎么来看P-R 图好不好?

用P-R曲线判定分类器效果,方法很简单,就看曲线和XY轴围成图形的面积,面积越大,分类器效果越好。 有时候也会分析和y=x的交点(不是很懂)

如何在P-R图中寻找最佳阈值?

选取合适的阈值点要根据实际需求,比如我们想要高的召回率R,那么我们就会牺牲一些准确率P,在保证R最高的情况下,P也不那么低。(比如在企业中对召回率的要求就比较严苛,毕竟关乎用户体验,能尽量返回结果)
要找到想要的P和R对应的阈值:找到对应索引就好
在这里插入图片描述
(2)P-R曲线 vs ROC曲线:
PR曲线的稳定性不如roc,在数据不平衡的情况下表现很差。
在这里插入图片描述
观察图能够发现,当正样本比例减小时,ROC曲线变化不明显,但是P-R曲线的纵坐标,即准确率出现了明显的衰减。
原因是,当样本严重倾斜时,我们假定召回率不变,那么表现较差的模型必然会召回更多的负样本,那么FP(假正例)就会迅速增加,准确率就会大幅衰减。
5.其他评分函数 : score 和 classification_report
(1)score : 返回的是accuracy平均值 ,是评判模型最直观的方法
在这里插入图片描述
(2)classification_report :综合评估,是评判模型便捷且全面的方法(参数digits控制精度)

在这里插入图片描述

from sklearn.metrics import classification_report
y_true = [0, 1, 2, 2, 2]
y_pred = [0, 0, 2, 2, 1]
target_names = ['class 0', 'class 1', 'class 2']
print(classification_report(y_true, y_pred, target_names=target_names))
             precision    recall  f1-score   support

    class 0       0.50      1.00      0.67         1
    class 1       0.00      0.00      0.00         1
    class 2       1.00      0.67      0.80         3

avg / total       0.70      0.60      0.61         5

20201228

# 导入鸢尾花数据集
iris = datasets.load_iris()
X = iris.data  # X.shape==(150, 4)
y = iris.target  # y.shape==(150, )

# 二进制化输出
y = label_binarize(y, classes=[0, 1, 2])  # shape==(150, 3)
n_classes = y.shape[1]  # n_classes==3

# 添加噪音特征,使问题更困难
random_state = np.random.RandomState(0)
n_samples, n_features = X.shape  # n_samples==150, n_features==4
X = np.c_[X, random_state.randn(n_samples, 200 * n_features)]  # shape==(150, 84)

# 打乱数据集并切分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.5,
                                                    random_state=0)
# X_train.shape==(75, 804), X_test.shape==(75, 804), y_train.shape==(75, 3), y_test.shape==(75, 3)

# 学习区分某个类与其他的类
classifier = OneVsRestClassifier(svm.SVC(kernel='linear', probability=True,
                                 random_state=random_state))
y_score = classifier.fit(X_train, y_train).decision_function(X_test)
# y_score.shape==(75, 3)

# 为每个类别计算ROC曲线和AUC
fpr = dict()
tpr = dict()
roc_auc = dict()
for i in range(n_classes):  #classes 多少个类别      也是一列对一列
      fpr[i], tpr[i], _ = roc_curve(y_test[:, i], y_score[:, i]) #每个类别对应一对 fpr 和tpr
#二分类的时候 二者的ROC曲线是同一个 
      roc_auc[i] = auc(fpr[i], tpr[i])

plt.figure()
lw = 2
plt.plot(fpr[2], tpr[2], color='darkorange',
          lw=lw, label='ROC curve (area = %0.2f)' % roc_auc[2])
plt.plot([0, 1], [0, 1], color='navy', lw=lw, linestyle='--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver operating characteristic example')
plt.legend(loc="lower right")
plt.show()
https://blog.csdn.net/xyz1584172808/article/details/81839230

roc 例子 案例
画图的时候 每一类的值对应其概率同样可以画出ROC

问题:同时输出的多个类别的概率 其实取阈值的时候 当是二分类的时候 只需要看
其中一个类别就可以了 比如 原始标签是[0 1 0 1 1] 输出的概率为[[0.2,0.8],[0.3,0.7],[0.4,0.6],[0.5,0.5],[0.6,0.4]]
当取阈值0.3的时候 假设只看一个类别 比如 零 则零预测错
也就是二分类的时候 两个类别的ROC是相同的 超过两个类别的时候 每个类别都分别对应一个ROC

输入真实标签相当于多标签多维数据 多标签对应的概率的多维数组

在这里插入图片描述
3个类别对应的ROC
20201229


#PR曲线案例
df=pd.read_csv(r'D:\code12temp\rongxiang\mulitllableA\宏当84万数据\确定卷积_纠正类别_my_model_epoch15结果数据保存.csv')
# y_test=df[['real_0','real_1']]
y_test=df[['real_0']]
y_test=y_test.to_numpy()
# y_score=df[['prob_0','prob_1']]
y_score=df[['prob_0']]
y_score=y_score.to_numpy()

                                               #一列对一列 只能一个类别一个类别的看
precision, recall, _ = precision_recall_curve(y_test, y_score)

ap=average_precision_score(y_test,y_score)

plt.step(recall, precision, color='b', alpha=0.2,
         where='post')
plt.fill_between(recall, precision, step='post', alpha=0.2,
                 color='b')

plt.xlabel('Recall')
plt.ylabel('Precision')
plt.ylim([0.0, 1.05])
plt.xlim([0.0, 1.0])
plt.title('2-class Precision-Recall curve: AP={0:0.2f}'.format(ap))
plt.show()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值