【超详细】机器学习sklearn之分类模型评估 混淆矩阵、ROC曲线、召回率与精度、F1分数

学习目标:

机器学习之分类模型的评估

学习内容:

学习分类模型评估的方法:
1、混淆矩阵
2、分类结果汇总
3、ROC曲线
4、召回率与精度
5、F1分数

基本知识:

一、评估分类器性能的度量
1、真正(true positive, TP)或f++,对应的是被分类模型正确预测的正样本数。
2、假负(false negative, FN)或f±对应的是被分类模型错误预测为负类的正样本数。
3、假正(false positive, FP)或f-+, .对应的是被分类模型错误预测为正类的负样本数。
4、真负(ture negative, TN)或f–, 对应的是被分类模型正确预测的负样本数。
在这里插入图片描述
在这里插入图片描述

实验步骤:

一、混淆矩阵

1、导入鸢尾花数据集

from sklearn.datasets import load_iris
iris = load_iris()

2、二分法拆分数据

from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test = train_test_split(iris.data,iris.target,test_size = 0.3,random_state = 666)

3、构建决策树模型

from sklearn.tree import DecisionTreeClassifier
dt = DecisionTreeClassifier()
dt.fit(x_train, y_train)

结果为:

DecisionTreeClassifier()

4、模型预测

dt.predict(x_test)

结果为:

array([1, 2, 1, 2, 0, 1, 1, 2, 1, 1, 1, 0, 0, 0, 2, 1, 0, 2, 2, 2, 1, 0,
       2, 0, 1, 1, 0, 1, 2, 2, 0, 0, 1, 2, 1, 1, 2, 2, 0, 1, 2, 2, 1, 1,
       0])

5、模型评估

from sklearn.metrics import classification_report#导入混淆矩阵对应的库
print(classification_report(y_test,dt.predict(x_test)))

结果为:

                precision    recall  f1-score   support

           0       1.00      1.00      1.00        12
           1       1.00      1.00      1.00        18
           2       1.00      1.00      1.00        15

    accuracy                           1.00        45
   macro avg       1.00      1.00      1.00        45
weighted avg       1.00      1.00      1.00        45

6、输出训练集上的混淆矩阵

#混淆矩阵
from sklearn.metrics import confusion_matrix
cm = confusion_matrix(y_train,dt.predict(x_train))
cm

结果为:

array([[38,  0,  0],
       [ 0, 32,  0],
       [ 0,  0, 35]], dtype=int64)
#自定义类别顺序输出混淆矩阵
confusion_matrix(y_train,dt.predict(x_train),labels = [2,1,0])

结果为:

array([[35,  0,  0],
       [ 0, 32,  0],
       [ 0,  0, 38]], dtype=int64)

7、用热力图展示混淆矩阵

#用热力图展示混淆矩阵
%matplotlib inline
import matplotlib.pyplot as plt
import seaborn as sns
sns.heatmap(cm,cmap = sns.color_palette("Blues"),annot = True)

结果如图:
在这里插入图片描述
**【注意】:**在热力图中需要提前电脑安装matplotlib库,否则无法使用热力图
安装matplotlib库方法:打Anaconda => Anaconda Prompt => 输入 pip install matplotlib
等待安装完成即可。

**

二分类结果汇总

**
在这里插入图片描述

from sklearn.metrics import classification_report
a = classification_report(y_train,
                          dt.predict(x_train),
                          digits = 3,#小数点后保留的位数
                          labels = [2,1,0],#类别的排序
                          target_names = ['第2类','第1类','第0类'],#类别的名称
                          output_dict = False)#结果是否以字典的形式输出
print(a)

结果为:
在这里插入图片描述

三、ROC曲线

1、导入所需要的库
数据集如下:
在这里插入图片描述

from sklearn.metrics import roc_curve
#录入数据
import numpy as np
y_true = np.array([1,1,0,1,1,0,0,0,1,0])
y_score = np.array([0.9,0.8,0.7,0.6,0.55,0.54,0.53,0.51,0.50,0.40])

2、调用roc_curve 求出fpr与tpr

fpr,tpr,thresholds = roc_curve(y_true,y_score)

3、打印结果

print(fpr,tpr,thresholds,sep = '\n')

结果为:

[0.  0.  0.  0.2 0.2 0.8 0.8 1. ]
[0.  0.2 0.4 0.4 0.8 0.8 1.  1. ]
[1.9  0.9  0.8  0.7  0.55 0.51 0.5  0.4 ]

4、修改参数drop_intermediate 值为False

fpr1,tpr1,thresholds1 = roc_curve(y_true,y_score,drop_intermediate = False)

输出结果:

print(fpr1,tpr1,thresholds1,sep = '\n')

结果:

[0.  0.  0.  0.2 0.2 0.2 0.4 0.6 0.8 0.8 1. ]
[0.  0.2 0.4 0.4 0.6 0.8 0.8 0.8 0.8 1.  1. ]
[1.9  0.9  0.8  0.7  0.6  0.55 0.54 0.53 0.51 0.5  0.4 ]

5、绘制ROC曲线

plt.plot(fpr1,tpr1,'r*-')
plt.plot([0,1],[0,1])
plt.plot("FPR")
plt.plot("TPR")
plt.title("ROC Curve")

在这里插入图片描述
6、计算ROC曲线下的面积
在这里插入图片描述

from sklearn.metrics import roc_auc_score
roc_auc_score(y_true,y_score)

结果为:

0.76

四、召回率与精度

模型评估:
在这里插入图片描述
1、导入所需的库

import numpy as np
from sklearn.metrics import precision_recall_curve

2、录入数据

y_true = np.array([0,0,0,0,0,1,1,1,1,1])
y_scores = np.array([0.1,0.2,0.25,0.4,0.6,0.2,0.45,0.6,0.75,0.8])

3、召回率与精度的计算

precision,recall,thresholds = precision_recall_curve(y_true,y_scores)
len(precision),len(recall),len(thresholds)

结果为:

(8, 8, 7)
thresholds

结果为:

array([0.2 , 0.25, 0.4 , 0.45, 0.6 , 0.75, 0.8 ])

召回率:

precision

结果为:

array([0.55555556, 0.57142857, 0.66666667, 0.8       , 0.75      ,
       1.        , 1.        , 1.        ])

精度:

recall

结果为:

array([1. , 0.8, 0.8, 0.8, 0.6, 0.4, 0.2, 0. ])

#plt.grid()

plt.scatter(thresholds,precision[:-1])

结果为:
在这里插入图片描述
召回率散点图:

plt.scatter(thresholds,recall[:-1])

结果为:
在这里插入图片描述
精度散点图:

plt.scatter(recall,precision)

在这里插入图片描述

plt.plot(recall,precision,'r-*')

在这里插入图片描述
4、多值预测问题需要转化为二值预测问题进行评估

from sklearn.preprocessing import binarize
y = binarize(iris.target.reshape(-1,1))

5、输出预测的平均精确率

from sklearn.metrics import average_precision_score
average_precision = average_precision_score(y_true,y_scores)
average_precision

结果为:

0.8211111111111111

*

五、F1分数

1、导入所需的库

from sklearn.metrics import f1_score
from sklearn.neural_network import MLPClassifier
mlp = MLPClassifier()
mlp.fit(iris.data,iris.target)

2、进行F1分数计算

f1_score(iris.target,mlp.predict(iris.data),average = 'micro')
0.9733333333333334
f1_score(iris.target,mlp.predict(iris.data),average = 'macro')
0.9732905982905983
f1_score(iris.target,mlp.predict(iris.data),average = 'weighted')
0.9732905982905984
  • 10
    点赞
  • 89
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
使用多分类混淆矩阵绘制ROC曲线的方法如下: 1. 首先,你需要计算每个类别的真阳性率(True Positive Rate,TPR)和假阳性率(False Positive Rate,FPR)。TPR表示被正确分类为正例的样本占该类别实际正例样本的比例,而FPR表示被错误分类为正例的样本占该类别实际负例样本的比例。 2. 接下来,你需要绘制多分类混淆矩阵。多分类混淆矩阵是一个N×N的矩阵,其中N是类别的数量。矩阵的每个元素表示将一个类别的样本预测为另一个类别的数量。 3. 根据多分类混淆矩阵,你可以计算每个类别的TPR和FPR。对于每个类别,TPR等于该类别的真阳性数除以该类别的真阳性数加上该类别的假阴性数,而FPR等于该类别的假阳性数除以该类别的假阳性数加上该类别的真阴性数。 4. 绘制ROC曲线ROC曲线是以FPR为横轴,TPR为纵轴的曲线。对于每个类别,你可以绘制一个点,横坐标为该类别的FPR,纵坐标为该类别的TPR。最后,你可以将所有类别的点连接起来,得到ROC曲线。 下面是一个使用多分类混淆矩阵绘制ROC曲线的示例代码: ```python import numpy as np import matplotlib.pyplot as plt # 假设有3个类别 num_classes = 3 # 假设有一个3×3的多分类混淆矩阵 confusion_matrix = np.array([[10, 2, 3], [1, 15, 4], [2, 3, 12]]) # 计算每个类别的TPR和FPR tpr = np.diag(confusion_matrix) / np.sum(confusion_matrix, axis=1) fpr = (np.sum(confusion_matrix, axis=0) - np.diag(confusion_matrix)) / (np.sum(confusion_matrix) - np.sum(confusion_matrix, axis=1)) # 绘制ROC曲线 plt.plot(fpr, tpr, marker='o') plt.xlabel('False Positive Rate') plt.ylabel('True Positive Rate') plt.title('Receiver Operating Characteristic (ROC) Curve') plt.show() ``` 这段代码假设有3个类别,并给出了一个3×3的多分类混淆矩阵作为示例。你可以根据你的实际情况修改类别数量和混淆矩阵的值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值