Python scikit-learn循环生成12个随机森林并按数据集命名的实现问题
实现方案
核心思路
推荐用字典存储所有模型,既符合Python最佳实践,也能快速按名称调取对应模型,不需要动态生成全局变量(容易引发命名冲突、难调试)。
修正后代码
from imblearn.under_sampling import RandomUnderSampler from sklearn.ensemble import RandomForestClassifier from sklearn.model_selection import train_test_split import pandas as pd # 你的原始数据和名称列表 data = [df_AFC,df_AF,df_ESF,df_EXF,df_F,df_GF,df_KRFC,df_KRF,df_MF,df_PF,df_SFC,df_SF] name = ['AFC','AF','ESF','EXF','F','GF','KRFC','KRF','MF','PF','SFC','SF'] # 用字典存储模型,key为模型名,value为训练好的模型对象 models = {} for df, model_suffix in zip(data, name): x = df.drop('class', axis=1) y = df['class'] # 欠采样处理 rus = RandomUnderSampler(sampling_strategy=1, random_state=41) x_res, y_res = rus.fit_resample(x, y) # 低方差特征过滤 注意:必须接收返回值,否则过滤不生效 x_res = remove_low_variance(x_res, threshold=0.1) # 数据集拆分 x_train, x_test, y_train, y_test = train_test_split(x_res, y_res, test_size=0.2, random_state=42) # 模型训练 model = RandomForestClassifier(n_estimators=500, random_state=42) model.fit(x_train, y_train) # 存入字典,key格式为model_后缀 models[f"model_{model_suffix}"] = model
调用方式
和你期望的调用逻辑基本一致,只需要从字典里取对应模型即可:
y_train_pred_AFC = models["model_AFC"].predict(unknown) y_train_pred_AF = models["model_AF"].predict(unknown) # 其余模型以此类推
如果你一定要直接使用model_AFC这种全局变量(不推荐)
可以用全局变量字典动态赋值,替换上面的字典存储逻辑即可:
for df, model_suffix in zip(data, name): # 前面的训练逻辑不变 model.fit(x_train, y_train) # 动态生成全局变量 globals()[f"model_{model_suffix}"] = model
之后就可以直接调用model_AFC.predict(unknown),但该方式不推荐,变量不会被IDE提示,调试难度更高。
额外优化建议
- 可以在循环中增加每个模型的测试集评估逻辑,训练完成直接输出精度、F1等指标,方便快速对比不同数据集的模型效果
- 如果需要后续复用模型,可以用
joblib.dump(models, "all_rf_models.pkl")把所有模型批量保存,下次使用直接加载即可 - 可以把数据预处理、训练、评估的逻辑封装成函数,避免循环内代码过于冗余
内容的提问来源于stack exchange,提问作者tassaneel
相关产品推荐
相关产品推荐

