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

如何为RandomForestRegressor添加交叉验证以查看特征重要性

随机森林回归+K折交叉验证+特征重要性汇总

下面是给你的代码添加K折交叉验证的完整解决方案,同时优化了特征重要性的分析——单模型的特征重要性容易受数据划分影响,交叉验证下的平均重要性结果更稳定可靠:

修改后的完整代码

import pandas as pd
from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import KFold
from sklearn.metrics import r2_score, mean_absolute_error
import matplotlib.pyplot as plt

# 读取数据
df = pd.read_csv(dataset_path + file_name)
X = df.drop(['target'], axis=1)
y = df['target']

# 设置K折交叉验证参数
k = 5  # 可根据需求调整折数
kf = KFold(n_splits=k, shuffle=True, random_state=42)  # 打乱数据保证各折分布均匀,固定随机种子确保结果可复现

# 初始化存储变量
fold_performance = []
feature_importance_records = []

# 循环执行K折训练与评估
for fold_num, (train_idx, val_idx) in enumerate(kf.split(X), 1):
    print(f"第 {fold_num} 折训练中...")
    # 划分当前折的训练/验证集
    X_train, X_val = X.iloc[train_idx], X.iloc[val_idx]
    y_train, y_val = y.iloc[train_idx], y.iloc[val_idx]
    
    # 训练随机森林回归模型
    clf = RandomForestRegressor(random_state=42, n_jobs=-1)
    model = clf.fit(X_train, y_train)
    
    # 验证集预测,记录模型性能指标
    y_pred = model.predict(X_val)
    r2 = r2_score(y_val, y_pred)
    mae = mean_absolute_error(y_val, y_pred)
    fold_performance.append({"折数": fold_num, "R²得分": r2, "平均绝对误差": mae})
    
    # 收集当前折的特征重要性
    fold_importance = pd.Series(model.feature_importances_, index=X.columns, name=f"第{fold_num}折")
    feature_importance_records.append(fold_importance)

# 输出交叉验证性能汇总
performance_df = pd.DataFrame(fold_performance)
print("\n===== 交叉验证性能汇总 =====")
print(performance_df)
print(f"\n平均R²: {performance_df['R²得分'].mean():.4f} | 平均MAE: {performance_df['平均绝对误差'].mean():.4f}")

# 汇总所有折的特征重要性,计算平均值
all_importances = pd.concat(feature_importance_records, axis=1)
all_importances['平均重要性'] = all_importances.mean(axis=1)

# 按平均重要性排序并可视化
sorted_importances = all_importances.sort_values(by='平均重要性', ascending=False)
sorted_importances['平均重要性'].plot(kind='bar', figsize=(8,6), title='特征平均重要性(K折交叉验证)')
plt.ylabel('重要性权重')
plt.show()

# 可选:查看各折特征重要性的波动情况
# sorted_importances.plot(kind='bar', figsize=(12,6), title='各折特征重要性对比')
# plt.show()

关键改动说明

  • KFold配置:开启shuffle=True避免数据排序导致的分布偏差,固定random_state保证实验可重复。
  • 每折流程:在循环中完成「划分数据集→训练模型→验证性能→记录特征重要性」的完整流程,既验证模型泛化能力,又收集多轮特征重要性数据。
  • 特征重要性优化:将所有折的特征重要性合并后取平均值,消除单轮数据划分带来的偶然误差,结果更具参考性。
  • 性能指标:选用回归任务常用的R²和MAE指标,直观反映模型在不同数据子集上的表现。

内容的提问来源于stack exchange,提问作者nic.o

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 05:15:40