一:前言

🎈ROC曲线
  • ROC曲线(receiver operating characteristic curve),
  • 是反映灵敏性和特效性连续变量的综合指标;
  • 是用构图法揭示敏感性和特异性的相互关系;
  • 它通过将连续变量设定出多个不同的临界值,从而计算出一系列敏感性和特异性;
  • ROC曲线是根据一系列不同的二分类方式(分界值或决定阈),以真正例率(True Positive Rate,TPR 也就是灵敏度)为纵坐标,假正例率(False Positive Rate,FPR,1-特效性)为横坐标绘制的曲线。
🎈AUC
  • AUC(Area Under Curve)被定义为ROC曲线下与坐标轴围成的面积;
  • 面积的数值不会大于1;
  • 又由于ROC曲线一般都处于y=x这条直线的上方,所以AUC的取值范围在0.5和1之间;
  • AUC越接近1.0,检测方法真实性越高;等于0.5时,则真实性最低,无应用价值。
🎈数据集:car.data

UCI Car Evaluation Data Set

6个属性及标签介绍如图(多分类问题):
官网截图

二:绘制ROC曲线

绘制ROC曲线,需要fpr(x轴)、tpr(y轴)

  • fpr:假正例率
  • tpr:真正例率

知乎截图(可参考学习~):ROC曲线简介知乎截图

1. 二值化处理(one-hot编码)

如果标签是二值,跳过这一步;如果不是,需要二值化处理(one-hot编码)
⭐roc_auc_score是根据真实值(必须是二值的)。
所以需要对标签值作如下二值化处理

n_class = len(data['accept'].unique())   #accept是标签列
y_test_one_hot = label_binarize(y_test, classes=np.arange(n_class))  # 将标签值映射成one-hot编码
#print(y_test_one_hot.shape)    # 结果是(519, 4)
y_test_one_hot_hat = clf.predict_proba(x_test)  # 测试集预测分类概率
#此处使用的是决策树预测算法,此处仅参考思路即可

2. 计算fpr,tpr ,auc

根据预测值计算出AUC值(预测值类型:可以是0/1,也可以是proba值)

  • 得到proba预测值 (有预测值跳过这一步)
y_test_one_hot_hat = clf.predict_proba(x_test)  #测试集预测分类的概率 
# predict_proba返回的是一个 n 行 k 列的数组, 第 i 行 第 j 列上的数值是模型预测 第 i 个预测样本为某个标签的概率,并且每一行的概率和为1。
#参考:https://blog.csdn.net/u011630575/article/details/79429757
from sklearn import metrics

fpr, tpr, _ = metrics.roc_curve(y_test_one_hot.ravel(), y_test_one_hot_hat.ravel())
#y_test_one_hot:one-hot  测试集(编码后)的真实值y
#y_test_one_hot_hat: one-hot  测试集(编码后)的预测值y
  • 计算不同average下的AUC值
from sklearn import metrics

print ('Micro AUC:\t', metrics.auc(fpr, tpr))    # AUC ROC意思是ROC曲线下方的面积(Area under the Curve of ROC)
print( 'Micro AUC(System):\t', metrics.roc_auc_score(y_test_one_hot, y_test_one_hot_hat, average='micro'))

auc = metrics.roc_auc_score(y_test_one_hot, y_test_one_hot_hat, average='macro')
print ('Macro AUC:\t', auc)

3. 绘制曲线图demo

(有了fpr、tpr、auc直接copy就行~)

import matplotlib.pyplot as plt

'''
计算获得fpr、tpr、auc,上述步骤中有
假装已经得到~
'''

plt.figure(figsize=(8, 7), dpi=80, facecolor='w')    # dpi:每英寸长度的像素点数;facecolor 背景颜色
plt.xlim((-0.01, 1.02))  # x,y 轴刻度的范围
plt.ylim((-0.01, 1.02))
plt.xticks(np.arange(0, 1.1, 0.1))  #绘制刻度
plt.yticks(np.arange(0, 1.1, 0.1))
plt.plot(fpr, tpr, 'r-', lw=2, label='AUC=%.4f' % auc)  # 绘制AUC 曲线
plt.legend(loc='lower right')    # 设置显示标签的位置
plt.xlabel('False Positive Rate', fontsize=14)   #绘制x,y 坐标轴对应的标签
plt.ylabel('True Positive Rate', fontsize=14)
plt.grid(b=True, ls=':')  # 绘制网格作为底板;b是否显示网格线;ls表示line style
plt.title(u'DecisionTree ROC curve And  AUC', fontsize=18)  # 打印标题
plt.show()

4. 结果

ROC曲线

三:全部Demo

(Demo来自实验作业呀~)

import pandas as pd
import numpy as np
from sklearn.tree import DecisionTreeClassifier
from sklearn import metrics
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import label_binarize  # 将label二值化
import matplotlib.pyplot as plt

data = pd.read_csv('car.data', header=None)  # header=None没有标题
print(data.shape)
n_columns = len(data.columns)  # 获取数据集的列数
columns = ['buy', 'maintain', 'doors', 'persons', 'boot', 'safety', 'accept']
new_columns = dict(zip(np.arange(n_columns), columns))  # 将列名与整数影射
data.rename(columns=new_columns, inplace=True)  # 替换数据集中的列名columns中的值
for col in columns:
    # Categorical方法,获取list的类别,codes方法赋给每个类别对应的类别的编码值
    data[col] = pd.Categorical(data[col]).codes

x = data.loc[:, columns[:-1]]  # 得到样本特征y = data[ 'accept']#取到标签值
y = data['accept']
x, x_test, y, y_test = train_test_split(x, y, test_size=0.3)
clf = DecisionTreeClassifier(criterion='gini', max_depth=12, min_samples_split=5, max_features=5)
clf.fit(x, y)
y_hat = clf.predict(x)  # 在训练集上进行预测
print('训练集精确度:', metrics.accuracy_score(y, y_hat))  # 评估成绩
y_test_hat = clf.predict(x_test)  # 测试集预测
print('测试集精确度:', metrics.accuracy_score(y_test, y_test_hat))  # 评估绘制曲线
n_class = len(data['accept'].unique())
y_test_one_hot = label_binarize(y_test, classes=np.arange(n_class))  # 将标签值映射成one-hot编码
y_test_one_hot_hat = clf.predict_proba(x_test)  # 测试集预测分类概率

# 计算fpr ,tpr及面积
fpr, tpr, _ = metrics.roc_curve(y_test_one_hot.ravel(), y_test_one_hot_hat.ravel())
print('Micro AUC:\t', metrics.auc(fpr, tpr))  # AUC ROC意思是ROC曲线下方的面积(Area under the Curve of ROC)
print('Micro AUC(System):\t', metrics.roc_auc_score(y_test_one_hot, y_test_one_hot_hat, average='micro'))

auc = metrics.roc_auc_score(y_test_one_hot, y_test_one_hot_hat, average='macro')
print('Macro AUC:\t', auc)

plt.figure(figsize=(8, 7), dpi=80, facecolor='w')
plt.xlim((-0.01, 1.02))
plt.ylim((-0.01, 1.02))
plt.xticks(np.arange(0, 1.1, 0.1))
plt.yticks(np.arange(0, 1.1, 0.1))
plt.plot(fpr, tpr, 'r-', lw=2, label='AUC=%.4f' % auc)
plt.legend(loc='lower right')
plt.xlabel('False Positive Rate', fontsize=14)
plt.ylabel('True Positive Rate', fontsize=14)
plt.grid(b=True, ls=':')
plt.title(u'DecisionTree ROC curve And AUC', fontsize=18)
plt.show()

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐