You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 08:45:02