qq_57489989 2024-04-24 03:21 采纳率: 100%
浏览 9
已结题

绘制多分类任务的roc曲线时只画出了一类的roc,其它的auc显示为nan

如题,其它类没有roc,auc为nan,而且由predict_proba()预测的概率没有归一化


```python
import numpy as np 
import seaborn as sns
import pandas as pd 
import gc
import os
import matplotlib.pyplot as plt
import xgboost as xgb
from sklearn.model_selection import StratifiedKFold
from sklearn.model_selection import train_test_split
from sklearn.metrics import f1_score,roc_auc_score
from sklearn.preprocessing import label_binarize
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score
from sklearn.ensemble import AdaBoostClassifier
import warnings
import time
from sklearn.metrics import roc_curve, auc, precision_score, recall_score
#jet表
jet = pd.read_csv('complex_train_R04_jet.csv')
print('jet.shape:',jet.shape)
train_num = jet.shape[0]
gc.collect()
feature = [i for i in jet.columns if i not in ['event_id', 'jet_id',  'label']]
x= jet[feature].copy().reset_index(drop=True)
label_map = {21:0,1:1,4:2,5:3}
y = jet['label'].copy()
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.3)

#随机森林

seed = 9999
# 构建随机森林模型
rf_model = RandomForestClassifier(n_estimators=100, random_state=seed, verbose=2)
    
# 在训练集上训练模型
rf_model.fit(x_train,y_train)
    
#在测试集上预测
pred_test_rf = rf_model.predict_proba(x_test)

true_labels_binary_rf = label_binarize(y_test, classes=[0, 1, 2, 3])


fpr = dict()
tpr = dict()
roc_auc = dict()
for i in range(4): # 遍历每个类别
    fpr[i], tpr[i], _ = roc_curve(true_labels_binary_rf[:, i], pred_test_rf[:, i])
    roc_auc[i] = auc(fpr[i], tpr[i])
    print(roc_auc[i])
# 绘制每个类别的 ROC 曲线
for i in range(4):
    plt.plot(fpr[i], tpr[i], lw=2,
             label='ROC curve of class {0} (area = {1:0.2f})'
             ''.format(i, roc_auc[i]))

plt.legend()

img

上图为特征集

img


图为roc曲线

  • 写回答

10条回答 默认 最新

  • 妄北y 嵌入式领域优质创作者 2024-04-24 08:25
    关注

    以下参考免费微信小程序:皆我百晓生 作答,并由妄北y整理回复。

    看起来你的代码中存在一些问题,导致无法正确计算多分类任务的ROC曲线和AUC值。下面我会逐一解释这些问题,并提供相应的解决方案。

    1. 概率没有归一化: 你的代码中使用了predict_proba()方法,但是在计算ROC曲线和AUC值之前,需要确保预测概率已经归一化。在多分类任务中,每个类别的预测概率应该是独立的,并且它们的和应该为1。

    2. 使用predict_proba()而不是predict(): 在多分类任务中,你需要使用predict_proba()方法而不是predict(),因为predict()方法返回的是预测的类别标签,而不是预测概率。

    3. 计算每个类别的ROC曲线和AUC值: 在多分类任务中,你需要为每个类别计算ROC曲线和AUC值。你的代码中已经尝试这样做了,但是可能由于概率没有归一化或者类别标签处理不当,导致AUC值为NaN。

    为了解决这些问题,你可以尝试以下步骤:

    1. 确保使用predict_proba()方法: 保持使用predict_proba()方法,因为它返回的是每个类别的预测概率。

    2. 使用label_binarize()方法处理真实标签: 你的代码中已经使用了label_binarize()方法,这是正确的。确保classes参数包含所有可能的类别标签。

    3. 计算每个类别的ROC曲线和AUC值: 你的代码中已经尝试计算每个类别的ROC曲线和AUC值,但是可能由于概率没有归一化导致AUC值为NaN。确保预测概率已经归一化。

    4. 绘制ROC曲线: 你的代码中已经尝试绘制ROC曲线,但是可能由于AUC值为NaN导致无法正确显示。确保在绘制ROC曲线之前,计算得到的AUC值是有效的。

    下面是修改后的代码:

    import numpy as np
    import seaborn as sns
    import pandas as pd
    import gc
    import os
    import matplotlib.pyplot as plt
    import xgboost as xgb
    from sklearn.model_selection import StratifiedKFold
    from sklearn.model_selection import train_test_split
    from sklearn.metrics import f1_score, roc_auc_score
    from sklearn.preprocessing import label_binarize
    from sklearn.ensemble import RandomForestClassifier
    from sklearn.metrics import accuracy_score
    from sklearn.ensemble import AdaBoostClassifier
    import warnings
    import time
    from sklearn.metrics import roc_curve, auc, precision_score, recall_score
    
    # ... 省略其他代码 ...
    
    # 在测试集上预测
    pred_test_rf = rf_model.predict_proba(x_test)
    
    # 真实标签
    y_test_unique = np.unique(y_test)
    y_test_bin = label_binarize(y_test, classes=y_test_unique)
    
    # 计算每个类别的ROC曲线和AUC值
    n_classes = y_test_bin.shape[1]
    fpr = dict()
    tpr = dict()
    roc_auc = dict()
    for i in range(n_classes):
        fpr[i], tpr[i], _ = roc_curve(y_test_bin[:, i], pred_test_rf[:, i])
        roc_auc[i] = auc(fpr[i], tpr[i])
    
    # 绘制每个类别的ROC曲线
    for i in range(n_classes):
        plt.plot(fpr[i], tpr[i], lw=2,
                 label='ROC curve of class {0} (area = {1:0.2f})'.format(i, roc_auc[i]))
    
    plt.legend()
    plt.show()
    

    请注意,上述代码仅提供了一个基本的解决方案,你可能需要根据你的具体需求进行调整。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(9条)

报告相同问题?

问题事件

  • 系统已结题 5月2日
  • 已采纳回答 4月24日
  • 创建了问题 4月24日

悬赏问题

  • ¥15 使用ue5插件narrative时如何切换关卡也保存叙事任务记录
  • ¥20 软件测试决策法疑问求解答
  • ¥15 win11 23H2删除推荐的项目,支持注册表等
  • ¥15 matlab 用yalmip搭建模型,cplex求解,线性化处理的方法
  • ¥15 qt6.6.3 基于百度云的语音识别 不会改
  • ¥15 关于#目标检测#的问题:大概就是类似后台自动检测某下架商品的库存,在他监测到该商品上架并且可以购买的瞬间点击立即购买下单
  • ¥15 神经网络怎么把隐含层变量融合到损失函数中?
  • ¥15 lingo18勾选global solver求解使用的算法
  • ¥15 全部备份安卓app数据包括密码,可以复制到另一手机上运行
  • ¥20 测距传感器数据手册i2c