从`sklearn.impute.SimpleImputer`中检索删除的列名

数据挖掘 scikit-学习 数据插补
2021-09-29 11:38:44

该类SimpleImputer采用 pandas 数据帧并返回未标记的 numpy 数组。这意味着可以SimpleImputer随意丢弃一些功能,但无法向调用者传达哪些功能已被丢弃

我一直在尝试想出一个解决方法,但它们都非常笨拙且不可靠。有什么我想念的吗?

3个回答

我今天也遇到了同样的问题,很遗憾你的帖子没有答案。我认为这个问题在 sklearn 文档中没有得到很好的解决。我可以向您展示我对这个问题的解决方法:

headers = X.columns.values
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

empty_train_columns =  []
for col in X_train.columns.values:
    # all the values for this feature are null
    if sum(X_train[col].isnull()) == X_train.shape[0]:
        empty_train_columns.append(col)
print(empty_train_columns)

这个想法是保留所有列名,并在拆分数据后检查训练集中的哪些列完全为空。如果我没记错的话,Imputer 尊重列顺序,例如,如果您使用基于决策树的模型,您可以将每个特征与其重要性相关联。

我对这段丑陋的代码不满意,但我找不到更优雅(和简单)的解决方案。

SimpleImputer 删除完全由缺失值组成的列。尝试关联原始列时确实令人不快;sklearn 开发人员一直在讨论这个问题:

https://github.com/scikit-learn/scikit-learn/issues/16426

如果您直接工作,文森特的回答很好:只需检测并删除有问题的所有缺失列,因为它们对您的模型没有任何贡献。如果您需要更自动化的东西(例如,您有一个高度缺失的列,在交叉验证中会导致一些训练折叠全部缺失),那么也许使用 a ColumnTransformer,其中columns参数是一个可调用的检查所有缺失的?然后,您可以使用 ColumnTransformer 的get_feature_names方法来查明何时/是否删除了列。

根据我的经验,它没有删除任何列。它将列名从实际列名替换为 1、2、3...

将实际列名放在插补之后

 imp = SimpleImputer(missing_values = np.nan, strategy = 'most_frequent')
 imp.fit(df)
 df = pd.DataFrame(imp.transform(df), columns = df.columns)