对两个模型(逻辑回归和随机森林)在多个不平衡率的数据集中各个性能度量指标(训练集的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)