我在pandas数据框(X)上运行了一个sk-learn分类器。由于缺少一些数据,我像这样使用sk-learn的输入器:
imp=Imputer(strategy='mean',axis=0)
X=imp.fit_transform(X)
然而,在这样做之后,我的特征数量减少了,大概是因为输入器只得到空列的rid。
这很好,除了输入器将我的数据帧转换为numpy数组之外,因此我丢失了列/特征名称。我稍后需要它们来识别重要的特性(使用clf.feature_importances_
)。
我如何知道clf中特性的名称?Feature_importances_,如果我的初始数据帧的一些列已经被输入器删除?
你可以这样做:
invalid_mask = np.isnan(imp.statistics_)
valid_mask = np.logical_not(invalid_mask)
valid_idx, = np.where(valid_mask)
现在您有有效列的旧索引(这些列在矩阵X中拥有的索引)。您可以通过这些索引从旧x的功能名称列表中获得功能名称。
这比想象的要困难得多。答案是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()
[...]