该类SimpleImputer
采用 pandas 数据帧并返回未标记的 numpy 数组。这意味着可以SimpleImputer
随意丢弃一些功能,但无法向调用者传达哪些功能已被丢弃
我一直在尝试想出一个解决方法,但它们都非常笨拙且不可靠。有什么我想念的吗?
该类SimpleImputer
采用 pandas 数据帧并返回未标记的 numpy 数组。这意味着可以SimpleImputer
随意丢弃一些功能,但无法向调用者传达哪些功能已被丢弃
我一直在尝试想出一个解决方法,但它们都非常笨拙且不可靠。有什么我想念的吗?
我今天也遇到了同样的问题,很遗憾你的帖子没有答案。我认为这个问题在 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)