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

