⭐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) # 测试集预测分类概率
#此处使用的是决策树预测算法,此处仅参考思路即可
根据预测值计算出AUC值(预测值类型:可以是0/1,也可以是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
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)
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()
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()