For循环迭代仅保存列表最后一个值的技术问题求助
解决循环中仅存储最后一个模型评估结果的问题
你这段代码的核心问题在于:pandas.DataFrame.append()不会原地修改原DataFrame,它会返回一个全新的DataFrame对象。你每次循环都把新生成的DataFrame赋值给model_valuation,但原始的result始终是空的——循环结束后,model_valuation自然只保留最后一次循环的结果(也就是SVM的评估数据)。
下面给出两种可行的修正方案:
方法1:直接更新原DataFrame
每次调用append后,把返回的新DataFrame重新赋值给result,让result持续累积所有模型的评估数据:
models = [KNN,NB,LR,SVM] result = pd.DataFrame() for i in models: i.fit(x_train, y_train) ypred = i.predict(x_test) # 将append后的新DataFrame重新赋值给result result = result.append({'Model': i, 'Accuracy': accuracy_score(y_test, ypred), 'Recall': recall_score(y_test, ypred), 'Precision': precision_score(y_test, ypred), 'Specificity': recall_score(y_test, ypred, pos_label=0), 'F1 score': f1_score(y_test, ypred)}, ignore_index=True)
方法2:先收集数据再生成DataFrame(更高效)
多次调用append的效率较低,更推荐先把每个模型的评估结果存入列表,最后一次性转换为DataFrame:
models = [KNN,NB,LR,SVM] results_list = [] for i in models: i.fit(x_train, y_train) ypred = i.predict(x_test) # 将当前模型的评估数据加入列表 results_list.append({'Model': i, 'Accuracy': accuracy_score(y_test, ypred), 'Recall': recall_score(y_test, ypred), 'Precision': precision_score(y_test, ypred), 'Specificity': recall_score(y_test, ypred, pos_label=0), 'F1 score': f1_score(y_test, ypred)}) # 一次性生成完整的结果DataFrame result = pd.DataFrame(results_list)
额外优化建议
如果想让Model列显示直观的模型名称(而非对象本身),可以把模型列表改成元组格式:
models = [("KNN", KNN), ("NB", NB), ("LR", LR), ("SVM", SVM)]
然后在循环中拆分名称和模型对象:
for name, model in models: model.fit(x_train, y_train) ypred = model.predict(x_test) results_list.append({'Model': name, # 其余评估指标不变 })
内容的提问来源于stack exchange,提问作者Nikhil sahoo
相关产品推荐
相关产品推荐

