我在pandas数据帧(X)上运行sk-learn分类器。由于缺少一些数据,我使用sk-learn的imputer这样:
imp=Imputer(strategy='mean',axis=0)
X=imp.fit_transform(X)
然而,在这样做之后,我的功能数量减少了,大概是因为imputer只是得到了空列的rids。
这很好,除了imputer将我的数据帧转换成numpy ndarray,因此我丢失了列/功能名称。我稍后需要它们来识别重要的功能(使用clf.feature_importances_
)。
如果我的初始数据框的某些列已被影片删除,我怎么知道clf.feature_importances_中的功能名称?
答案 0 :(得分:2)
你可以这样做:
invalid_mask = np.isnan(imp.statistics_)
valid_mask = np.logical_not(invalid_mask)
valid_idx, = np.where(valid_mask)
现在您有了有效列的旧索引(这些列在矩阵X中具有的索引)。您可以从旧X的功能名称列表中获取这些索引的功能名称。
答案 1 :(得分:0)
这比应该做的难。答案是SimpleImputer应该得到一个参数add_indicator = True。然后,在拟合之后,simple_imputer.indicator_获取另一个类型为sklearn.impute.MissingIndicator的转换器的值。反过来,它将具有一个变量features_,其中包含要素。
所以大概是这样的:
simple_imputer = SimpleImputer(add_indicator=True)
simple_imputer.fit(X)
print(simple_imputer.indicator_.features_)
我已经在SimpleImputer周围实现了一个瘦包装器,称为SimpleImputerWithFeatureNames,它为您提供了功能名称。在github上可用。
>> import openml_speed_dating_pipeline_steps as pipeline_steps
>> imputer = pipeline_steps.SimpleImputerWithFeatureNames()
>> imputer.fit(X_train[numeric_features])
>> imputer.get_feature_names()
[...]