python两种方法求ROC曲线下面积(AUC)

该博客介绍了如何利用Python的RandomForestClassifier进行模型训练,并通过predict_proba()方法获取预测概率。接着,博主分别展示了两种计算ROC曲线下面积的方法:一是使用roc_auc_score函数,二是直接计算fpr和tpr并利用auc函数。内容涵盖了ROC曲线的重要性和在评估二分类模型性能中的应用。
摘要由CSDN通过智能技术生成

前置代码:(分数据就不多赘述了)

# 定义RF
rf = RandomForestClassifier(n_estimators=40, max_depth=5, random_state=0)
# 训练模型
rf_SDVData2.fit(X_train, Y_train)
# predict_proba()返回预测属于某标签的概率
pred = rf.predict_proba(X_test)[:, 1]

方法一

# roc_auc_score函数返回曲线下面积
roc_auc = roc_auc_score(Y_test, pred)

方法二

fpr_Nb, tpr_Nb, _ = roc_curve(df_data_sdv_Y_test, pred)
roc_auc = auc(fpr_Nb, tpr_Nb) 

(roc_auc为曲线下面积)

绘制多分类的ROC曲线可以使用micro-averaging和macro-averaging两种方法。 1. micro-averaging方法: micro-averaging方法将所有的TP、FP、FN的数量累加,再计算ROC曲线。对于多分类问题,我们可以将每个类别的TP、FP、FN数量累加起来,得到总的TP、FP、FN数量,然后计算ROC曲线。 以下是使用micro-averaging方法绘制多分类的ROC曲线的示例代码: ```python from sklearn.metrics import roc_curve, auc import matplotlib.pyplot as plt import numpy as np # y_true是真实标签,y_pred是预测标签概率 y_true = np.array([0, 1, 2, 0, 1, 2]) y_pred = np.array([[0.9, 0.05, 0.05], [0.05, 0.9, 0.05], [0.05, 0.05, 0.9], [0.8, 0.1, 0.1], [0.1, 0.8, 0.1], [0.1, 0.1, 0.8]]) # 计算ROC曲线AUC fpr = dict() tpr = dict() roc_auc = dict() n_classes = 3 for i in range(n_classes): fpr[i], tpr[i], _ = roc_curve(y_true == i, y_pred[:, i]) roc_auc[i] = auc(fpr[i], tpr[i]) # micro-averaging方法 fpr["micro"], tpr["micro"], _ = roc_curve(y_true.ravel(), y_pred.ravel()) roc_auc["micro"] = auc(fpr["micro"], tpr["micro"]) # Plot ROC curves plt.figure() plt.plot(fpr["micro"], tpr["micro"], label='micro-average ROC curve (area = {0:0.2f})' ''.format(roc_auc["micro"]), linewidth=2) colors = ['aqua', 'darkorange', 'cornflowerblue'] for i, color in zip(range(n_classes), colors): plt.plot(fpr[i], tpr[i], color=color, lw=2, label='ROC curve of class {0} (area = {1:0.2f})' ''.format(i, roc_auc[i])) plt.plot([0, 1], [0, 1], 'k--', lw=2) 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 for multi-class') plt.legend(loc="lower right") plt.show() ``` 2. macro-averaging方法: macro-averaging方法将每个类别的ROC曲线计算出来,然后对所有的ROC曲线取平均。对于多分类问题,我们可以将每个类别的TP、FP、FN数量分别计算ROC曲线,然后对所有的ROC曲线取平均。 以下是使用macro-averaging方法绘制多分类的ROC曲线的示例代码: ```python from sklearn.metrics import roc_curve, auc import matplotlib.pyplot as plt import numpy as np # y_true是真实标签,y_pred是预测标签概率 y_true = np.array([0, 1, 2, 0, 1, 2]) y_pred = np.array([[0.9, 0.05, 0.05], [0.05, 0.9, 0.05], [0.05, 0.05, 0.9], [0.8, 0.1, 0.1], [0.1, 0.8, 0.1], [0.1, 0.1, 0.8]]) # 计算ROC曲线AUC fpr = dict() tpr = dict() roc_auc = dict() n_classes = 3 for i in range(n_classes): fpr[i], tpr[i], _ = roc_curve(y_true == i, y_pred[:, i]) roc_auc[i] = auc(fpr[i], tpr[i]) # macro-averaging方法 all_fpr = np.unique(np.concatenate([fpr[i] for i in range(n_classes)])) mean_tpr = np.zeros_like(all_fpr) for i in range(n_classes): mean_tpr += np.interp(all_fpr, fpr[i], tpr[i]) mean_tpr /= n_classes fpr["macro"] = all_fpr tpr["macro"] = mean_tpr roc_auc["macro"] = auc(fpr["macro"], tpr["macro"]) # Plot ROC curves plt.figure() plt.plot(fpr["macro"], tpr["macro"], label='macro-average ROC curve (area = {0:0.2f})' ''.format(roc_auc["macro"]), linewidth=2) colors = ['aqua', 'darkorange', 'cornflowerblue'] for i, color in zip(range(n_classes), colors): plt.plot(fpr[i], tpr[i], color=color, lw=2, label='ROC curve of class {0} (area = {1:0.2f})' ''.format(i, roc_auc[i])) plt.plot([0, 1], [0, 1], 'k--', lw=2) 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 for multi-class') plt.legend(loc="lower right") plt.show() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值