如何为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
相关产品推荐
相关产品推荐

