sklearn决策树/随机森林多分类绘制ROC和PR曲线

有篇讲解原理的博文/论文(可看可不看):《为什么Decision Tree可以绘制出ROC曲线?》

一、数据,并要先one-hot多分类标签

from sklearn.preprocessing import label_binarize
y_test = label_binarize(y_test, classes=[0, 1, 2, 3, 4])
n_classes = y_test.shape[1]			# 几分类(我这里是5分类)

二、构建模型,注意OVR类的使用(OneVsRestClassifier)

# 实例化决策树,基尼指数,训练集训练
from sklearn.multiclass import OneVsRestClassifier

dtc = OneVsRestClassifier(DecisionTreeClassifier(criterion="gini",
                                                 min_samples_leaf=3, max_depth=15))
# clf为拟合好的模型
clf = dtc.fit(X=X_train, y=y_train)

# 概率分数y_score ,是一个shape为(测试集条数, 分类种数)的矩阵。
# 比如你测试集有200条数据,模型是5分类,那矩阵就是(200,5)。
# 矩阵的第(i,j)元素代表第i条数据是第j类的概率。
y_score = clf.predict_proba(X_test)  

三、绘图

第1个图 PR曲线
from sklearn.metrics import precision_recall_curve
# Plot the macro-averaged Precision-Recall curve
# For each class
precision = dict()
recall = dict()
average_precision = dict()
for i in range(n_classes):
    precision[i], recall[i], _ = precision_recall_curve(y_test[:, i],
                                                        y_score[:, i])
    average_precision[i] = average_precision_score(y_test[:, i], y_score[:, i])

# A "macro-average": quantifying score on all classes jointly
precision["macro"], recall["macro"], _ = precision_recall_curve(y_test.ravel(),
                                                                y_score.ravel())
average_precision["macro"] = average_precision_score(y_test, y_score,
                                                     average="macro")
print('Average precision score, macro-averaged over all classes: {0:0.2f}'
      .format(average_precision["macro"]))

# plt.figure()
# 因为我自己的数据是5分类,所以我为了放在一张图上,设置了2X3的格子
plt.subplot(2, 3, iter_)	
iter_ += 1

plt.step(recall['macro'], precision['macro'], where='post')

plt.xlabel('Recall')
plt.ylabel('Precision')
plt.ylim([0.0, 1.05])
plt.xlim([0.0, 1.0])
plt.title(
    'Average precision score, macro-averaged over all classes: AP={0:0.3f}'
        .format(average_precision["macro"]))
第2个图 ROC曲线(分别计算每一类下面面积为AUC值)
from sklearn.metrics import roc_curve, auc
fpr = dict()
tpr = dict()
roc_auc = dict()
for i in range(n_classes):
    fpr[i], tpr[i], _ = roc_curve(y_test[:, i], y_score[:, i])
    roc_auc[i] = auc(fpr[i], tpr[i])

# plt.figure()
# 因为我自己的数据是5分类,所以我为了放在一张图上,设置了2X3的格子
plt.subplot(2, 3, iter_)
iter_ += 1
lw = 1
colors = ['blue', 'red', 'green', 'black', 'yellow']
for i, color in zip(range(n_classes), colors):
    plt.plot(fpr[i], tpr[i], color=color, lw=lw,
             label='ROC curve of class {0} (area = {1:0.3f})'
             ''.format(i, roc_auc[i]))

plt.plot([0, 1], [0, 1], 'k--', lw=lw)
plt.xlim([-0.05, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver operating characteristic for multi-class data')
plt.legend(loc="lower right")
plt.show()
与上面不一样的是,也可以直接计算AUC值

auc()这个函数快被取消了,建议之后多用roc_auc_score,但是《sklearn:为什么roc_auc_score()和auc()有不同的结果? 博客园》

from sklearn.metrics import roc_auc_score
y_score = clf.predict_proba(X_test)
print(f"AUC={roc_auc_score(y_test, y_score, average='micro')}")	# 注意这里的y_test在多分类时也是需要one-hot过的

在这里插入图片描述


全部参考:

  • 14
    点赞
  • 103
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
随机森林模型多分类ROC曲线可以通过使用pROC包中的plot.roc函数来绘制。\[3\]该函数可以接受多类别的预测结果,并生成相应的ROC曲线。在绘制ROC曲线之前,需要将测试集的真实标签和模型的预测结果作为输入。可以使用sklearn.metrics.roc_curve函数计算每个类别的真阳性率和假阳性率。然后,将这些结果传递给plot.roc函数,即可绘制出多类别的ROC曲线。\[1\]另外,可以使用autplot函数来自动绘制随机森林模型的测试集性能。\[2\] #### 引用[.reference_title] - *1* [sklearn决策树/随机森林多分类绘制ROCPR曲线](https://blog.csdn.net/weixin_43469047/article/details/114707688)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [数据分享|R语言决策树随机森林分类电信公司用户流失churn数据和参数调优、ROC曲线可视化...](https://blog.csdn.net/tecdat/article/details/129392126)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [多分类RandomForest回归及ROC曲线绘制](https://blog.csdn.net/qq_42458954/article/details/120418071)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值