如何用Random Forest与Pandas实现特征重要性筛选及问题修复
解决SelectFromModel筛选特征时numpy数组无columns属性的问题
嘿,我完全懂你现在的困扰——当X_train是numpy数组时,确实没办法直接调用.columns属性,毕竟numpy数组本身就不带这个特性。不过别着急,我给你几个实用的解决方案,帮你顺利拿到筛选后的特征列名:
方法1:提前保存原始特征名(最推荐)
既然你的数据集原本有84个数值列,那肯定一开始是从DataFrame来的对吧?那在转成numpy数组之前,先把列名存下来就好啦:
# 假设你最初的训练数据是DataFrame格式的df_train feature_names = df_train.columns.tolist() # 先把所有列名存成列表 # 再将数据转换成numpy数组 X_train = df_train.drop('target', axis=1).values # 假设目标列是'target' y_train = df_train['target'].values # 初始化并训练SelectFromModel from sklearn.feature_selection import SelectFromModel from sklearn.ensemble import RandomForestClassifier sel = SelectFromModel(RandomForestClassifier(n_estimators=100)) sel.fit(X_train, y_train) # 根据筛选结果匹配原始列名 selected_feat = [name for idx, name in enumerate(feature_names) if sel.get_support()[idx]] print("筛选出的重要特征:", selected_feat)
这个方法的核心是提前保留原始特征名的映射关系,这样筛选后能直接对应到真实的列名,后续分析也更清晰。
方法2:将numpy数组转回DataFrame并指定列名
如果已经把数据转成numpy数组了,也可以再转回DataFrame,记得指定原始的列名:
# 假设你已经有原始特征名列表feature_names import pandas as pd X_train_df = pd.DataFrame(X_train, columns=feature_names) # 用你原本想使用的方式获取选中特征 selected_feat = X_train_df.columns[sel.get_support()].tolist() print("筛选出的重要特征:", selected_feat)
这里要注意,必须要有原始的特征名列表,不然转回DataFrame后列名会是默认的0、1、2...,没法对应到真实数据。
方法3:临时生成列名(应急用,不推荐)
如果你不小心没保存原始列名,临时可以给特征生成命名,但这个方法只能知道是哪几个位置的特征,没法对应真实列名,适合应急:
import pandas as pd # 生成临时列名,比如feature_1到feature_84 temp_feature_names = [f"feature_{i+1}" for i in range(X_train.shape[1])] X_train_df = pd.DataFrame(X_train, columns=temp_feature_names) selected_feat = X_train_df.columns[sel.get_support()].tolist() print("筛选出的特征(临时命名):", selected_feat)
另外,解释下你之前尝试的pd.DataFrame(columns=[(sel.get_support())])为什么不行:sel.get_support()返回的是一个布尔数组(比如array([True, False, True,...])),你直接把这个数组当成列名,会生成一个名叫[ True False ... ]的单列DataFrame,完全不是你想要的结果,所以得用布尔索引去匹配对应的列名才行。
内容的提问来源于stack exchange,提问作者Mojtaba Vasou
相关产品推荐
相关产品推荐

