请问这段代码哪里有错误吗?为什么最后得出的结果不对?(现实中lg和rf、clf的性能相差明显,而Nemenyi检验得出的结果是rf和clf性能相差有显著性,反而与lg性能相差无显著性)
代码如下:
# 初始化分类器
lg=LogisticRegression(random_state=42)
rf = RandomForestClassifier(n_estimators=100, random_state=42)
clf = DecisionTreeClassifier(random_state=42)
# 交叉验证
skfolds=StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
# 性能指标列表
performance_scores = {
'lg': {'accuracy': [], 'precision': [], 'recall': [], 'f1': [], 'auc': []},
'rf': {'accuracy': [], 'precision': [], 'recall': [], 'f1': [], 'auc': []},
'clf': {'accuracy': [], 'precision': [], 'recall': [], 'f1': [], 'auc': []}
}
# 交叉验证过程
for train_index, test_index in skfolds.split(X, y):
X_train, X_test = X.iloc[train_index], X.iloc[test_index]
y_train, y_test = y.iloc[train_index], y.iloc[test_index]
# 随机过采样
ros = RandomOverSampler(random_state=42)
X_resampled, y_resampled = ros.fit_resample(X_train, y_train)
# 逻辑回归模型训练和评估
lg.fit(X_resampled, y_resampled)
y_pred1 = lg.predict(X_test)
y_score1 = lg.predict_proba(X_test)[:, 1]
fpr1, tpr1, _ = metrics.roc_curve(y_test, y_score1)
roc_auc1 = metrics.auc(fpr1, tpr1)
performance_scores['lg']['accuracy'].append(accuracy_score(y_test, y_pred1))
performance_scores['lg']['precision'].append(precision_score(y_test, y_pred1))
performance_scores['lg']['recall'].append(recall_score(y_test, y_pred1))
performance_scores['lg']['f1'].append(f1_score(y_test, y_pred1))
performance_scores['lg']['auc'].append(roc_auc1)
# 随机森林模型训练和评估
rf.fit(X_resampled, y_resampled)
y_pred2 = rf.predict(X_test)
y_score2 = rf.predict_proba(X_test)[:, 1]
fpr2, tpr2, _ = metrics.roc_curve(y_test, y_score2)
roc_auc2 = metrics.auc(fpr2, tpr2)
performance_scores['rf']['accuracy'].append(accuracy_score(y_test, y_pred2))
performance_scores['rf']['precision'].append(precision_score(y_test, y_pred2))
performance_scores['rf']['recall'].append(recall_score(y_test, y_pred2))
performance_scores['rf']['f1'].append(f1_score(y_test, y_pred2))
performance_scores['rf']['auc'].append(roc_auc2)
# 决策树模型训练和评估
clf.fit(X_resampled, y_resampled)
y_pred3 = clf.predict(X_test)
y_score3 = clf.predict_proba(X_test)[:, 1]
fpr3, tpr3, _ = metrics.roc_curve(y_test, y_score3)
roc_auc3 = metrics.auc(fpr3, tpr3)
performance_scores['clf']['accuracy'].append(accuracy_score(y_test, y_pred3))
performance_scores['clf']['precision'].append(precision_score(y_test, y_pred3))
performance_scores['clf']['recall'].append(recall_score(y_test, y_pred3))
performance_scores['clf']['f1'].append(f1_score(y_test, y_pred3))
performance_scores['clf']['auc'].append(roc_auc3)
# 进行Nemenyi检验
for metric in performance_scores['lg']:
# 将两个模型的该性能指标得分转换为数组
scores_lg = np.array(performance_scores['lg'][metric])
scores_rf = np.array(performance_scores['rf'][metric])
scores_clf = np.array(performance_scores['clf'][metric])
# 执行Friedman检验
# 将数据存储在numpy数组中
df = np.array([scores_lg, scores_rf, scores_clf])
# 进行Friedman检验
friedman_stat, p_value = friedmanchisquare(*df)
print("Friedman检验统计量:", friedman_stat)
print("Friedman检验P值:", p_value)
# 如果Friedman检验显著,执行Nemenyi后验检验
if p < 0.05:
data = np.array([scores_lg, scores_rf, scores_clf])
nemenyi_results = posthoc_nemenyi(data.T)
print("Nemenyi后验检验结果:")
print(nemenyi_results)
else:
print("Friedman检验结果不显著,无需进行Nemenyi后验检验")
# 如果Friedman检验显著,执行Nemenyi后验检验
results =sp.posthoc_nemenyi_friedman (df.T )
print(results)
检验结果:
lg模型性能:
rf模型性能:
clf模型性能: