wzy-1642 2024-04-24 13:35 采纳率: 16.7%
浏览 2
已结题

Nemenyi检验Python代码错误

对两个模型(逻辑回归和随机森林)在多个不平衡率的数据集中各个性能度量指标(训练集的acc、auc、precision、recall、f1已经得出具体数值)是否有显著差异性进行Nemenyi检验。
出现这个错误的原因是什么?以及该怎么解决?

acc_score_list1, roc_auc_list1, precision_score_list1, recall_score_list1, f1_score_list1 = [], [], [], [], []
acc_score_list2, roc_auc_list2, precision_score_list2, recall_score_list2, f1_score_list2 = [], [], [], [], []

lg = LogisticRegression(random_state=42)
rf = RandomForestClassifier(n_estimators=100, random_state=42)

skfolds = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
for train_index, test_index in skfolds.split(X, y):
    X_train = X.iloc[train_index]
    y_train = y.iloc[train_index]
    X_test = X.iloc[test_index]
    y_test = y.iloc[test_index]
    X_resampled, y_resampled = ros.fit_resample(X_train, y_train)
    
    lg.fit(X_resampled, y_resampled)
    y_pred1 = lg.predict(X_test)
    
    rf_classifier = rf.fit(X_resampled, y_resampled)
    y_pred2 = rf_classifier.predict(X_test)


    #lg
    y_score1 = lg.predict_proba(X_test)[:,1]
    fpr1, tpr1, threshold1 = roc_curve(y_test,y_score1)
    roc_auc1 = auc(fpr1,tpr1)
    acc_score1 = accuracy_score(y_test,y_pred1)
    precision_score1 = precision_score(y_test,y_pred1)
    recall_score1 = recall_score(y_test,y_pred1)
    f1_score1 = f1_score(y_test, y_pred1)
    
    acc_score_list1.append(acc_score1)
    precision_score_list1.append(precision_score1)
    recall_score_list1.append(recall_score1)
    f1_score_list1.append(f1_score1)
    roc_auc_list1.append(roc_auc1)

    #rf
    y_score2 = rf.predict_proba(X_test)[:,1]
    fpr2, tpr2, threshold2 = roc_curve(y_test,y_score2)
    roc_auc2 = auc(fpr2,tpr2)
    acc_score2 = accuracy_score(y_test,y_pred2)
    precision_score2 = precision_score(y_test,y_pred2)
    recall_score2 = recall_score(y_test,y_pred2)
    f1_score2 = f1_score(y_test, y_pred2)
    
    acc_score_list2.append(acc_score2)
    precision_score_list2.append(precision_score2)
    recall_score_list2.append(recall_score2)
    f1_score_list2.append(f1_score2)
    roc_auc_list2.append(roc_auc2)

acc_score_list = [acc_score_list1, acc_score_list2] # add to a single list
roc_auc_list = [roc_auc_list1, roc_auc_list2]
precision_score_list = [precision_score_list1, precision_score_list2]
recall_score_list = [recall_score_list1, recall_score_list2]
f1_score_list = [f1_score_list1, f1_score_list2]

from scipy.stats import rankdata
# 将性能度量指标存储为字典
performance_metrics = {
'Accuracy': [acc_score_list1, acc_score_list2],
'Precision': [precision_score_list1, precision_score_list2],
'Recall': [recall_score_list1, recall_score_list2],
'F1': [f1_score_list1, f1_score_list2],
'AUC': [roc_auc_list1, roc_auc_list2]
}
# 计算每个模型在每个指标上的平均排名
avg_ranks = {}
for metric, scores in performance_metrics.items():
    avg_ranks[metric] = [rankdata(score) for score in scores]
# 计算平均排名
avg_ranks_combined = {}
for metric, ranks in avg_ranks.items():
    avg_ranks_combined[metric] = np.mean(ranks, axis=0)
# 进行Nemenyi检验
from scikit_posthocs import posthoc_nemenyi
import pandas as pd
# 将平均排名转换为DataFrame
avg_ranks_df = pd.DataFrame(avg_ranks_combined)
# 进行Nemenyi检验
nemenyi_results = posthoc_nemenyi(avg_ranks_df)
       
# 打印检验结果
print("Nemenyi Test Results:")
print(nemenyi_results)

img

  • 写回答

5条回答 默认 最新

  • 阿里嘎多学长 2024-04-24 13:35
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    图片内容

    图片中显示了一个Python代码执行时的错误信息,具体为:

    ValueError
    Traceback (most recent call last)
    ...
    File ...scikit_posthocs.py:453, in posthoc_nemenyi(a, val_col, group_col, dist, sort)
    ...
    File ...scikit_posthocs.py:71, in _convert_to_df(a, val_col, group_col, val_id, group_id)
    ...
    ValueError: Specify correct column names using 'group_col' and 'val_col' args
    

    问题概括

    问题是在进行Nemenyi检验时,遇到了一个ValueError,提示需要使用正确的列名作为group_colval_col参数。

    问题出现原因

    错误信息表明在调用posthoc_nemenyi函数时,传递给该函数的数据a没有包含正确的列名。这可能是因为在创建用于Nemenyi检验的DataFrame时,没有正确地指定用于分组和值的列。

    问题解决方案

    为了解决这个问题,我们需要确保在调用posthoc_nemenyi函数时,传递给它的DataFrame包含用于分组和值的列,并且这些列名需要通过group_colval_col参数明确指定。

    提供代码

    以下是修改后的代码示例,它创建了一个包含正确列名的DataFrame,并进行了Nemenyi检验:

    import pandas as pd
    from scipy.stats import rankdata
    from scikit_posthocs import posthoc_nemenyi
    
    # 假设 performance_metrics 是一个包含模型性能指标的字典
    # 计算每个模型在每个指标上的平均排名
    avg_ranks = {metric: [rankdata(scores[0] + scores[1]) for scores in scores_list] for metric, scores_list in performance_metrics.items()}
    
    # 计算平均排名
    avg_ranks_combined = {metric: np.mean(ranks, axis=0) for metric, ranks in avg_ranks.items()}
    
    # 将平均排名转换为DataFrame,确保包含正确的列名
    avg_ranks_df = pd.DataFrame({
        'Model': ['LogisticRegression'] * len(avg_ranks['Accuracy']) + ['RandomForestClassifier'] * len(avg_ranks['Accuracy']),
        'Average Rank': list(avg_ranks['Accuracy']) + list(avg_ranks['Precision'])  # 以此类推,添加所有指标的平均排名
    })
    
    # 进行Nemenyi检验,指定正确的列名
    nemenyi_results = posthoc_nemenyi(avg_ranks_df, val_col='Average Rank', group_col='Model')
    
    # 打印检验结果
    print("Nemenyi Test Results:")
    print(nemenyi_results)
    

    示例代码运行方式

    运行这段代码需要有Python环境,并且安装了pandas, numpy, scipy, scikit_posthocs等库。可以通过命令行或者IDE运行。

    示例代码预期运行结果

    如果代码正确执行,将不会抛出错误,并且会打印出Nemenyi检验的结果,包括各模型间是否有显著差异性的信息。结果的具体形式取决于posthoc_nemenyi函数的实现和返回值。

    本回答被专家选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(4条)

报告相同问题?

问题事件

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

悬赏问题

  • ¥15 路由器考试怎么办,有懂行的吗 ,eNSP
  • ¥20 前端 二进制文件流图片转化异常
  • ¥15 github上的这个C语言项目如何跑起来
  • ¥15 java 判断某个数 区间是否存在
  • ¥15 appium控制多个雷电模拟器问题
  • ¥15 C# iMobileDevice
  • ¥15 谁会做这个啊#ensp#Boson NetSim
  • ¥15 如何编写针对TPS6503320FRGE型号的电源管理芯片的编程代码?
  • ¥15 设计简单目录管理系统,要满足以下内容
  • ¥15 关于九十度混合耦合器信号分析问题