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

Python中Random Forest调参后提取特征重要性报AttributeError求助

错误原因
  • 直接报错的核心原因:X_train是numpy.ndarray类型,只有Pandas DataFrame对象才有columns属性,numpy数组无该属性,调用X_train.columns直接触发属性错误。
  • 隐藏逻辑问题:你之前的Pipeline包含SelectKBest特征筛选步骤,最终输入随机森林的是筛选后的7000个特征,但你后续单独训练rf_best时直接使用原始未筛选的X_train,得到的特征重要性和Pipeline实际用到的特征完全不匹配,结果无实际意义。
解决方案

方案1:保留当前单独训练rf_best的逻辑

如果你确认需要用原始全部特征训练随机森林,不需要对齐Pipeline的处理逻辑,按你是否保留原始特征名分两种写法:

有原始特征名列表

如果你之前的X_train是从Pandas DataFrame转换而来,且保留了原始的特征名列表(比如存在feature_names变量中),直接替换index参数即可:

feature_importances = pd.DataFrame(
    rf_best.feature_importances_, 
    index=feature_names,
    columns=['importance']
).sort_values('importance', ascending=False)

无原始特征名列表

如果没有保留原始特征名,用特征索引作为标识即可:

feature_importances = pd.DataFrame(
    rf_best.feature_importances_, 
    index=[f"特征_{i}" for i in range(X_train.shape[1])],
    columns=['importance']
).sort_values('importance', ascending=False)

方案2:对齐Pipeline处理逻辑(更推荐)

如果要获取Pipeline中经过过采样、特征筛选后输入最优随机森林的特征重要性,不需要单独重新训练模型,直接从已拟合的Pipeline中提取对应组件即可:

# 提取Pipeline中的特征选择器和调优得到的最优随机森林模型
kbest_selector = rf_hyperparameter.named_steps['chi_square']
best_rf = rf_hyperparameter.named_steps['estimator'].best_estimator_

# 获取被特征选择器保留的特征索引
selected_idx = kbest_selector.get_support(indices=True)
# 有原始特征名就用下面的语句替换
# selected_names = feature_names[selected_idx]
selected_names = [f"特征_{i}" for i in selected_idx]

# 生成特征重要性表
feature_importances = pd.DataFrame(
    best_rf.feature_importances_,
    index=selected_names,
    columns=['importance']
).sort_values('importance', ascending=False)

内容的提问来源于stack exchange,提问作者keno

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 20:24:04