首页 > 解决方案 > OrdinalEncoder 和保持 Nans

问题描述

我有一个使用以下命令创建的 2d numpy 数组:

array = dataset.to_numpy()
X = array[:, 1:]

我想使用 OrdinalEncoder,但是我想估算 X 中的一些 Nans。我无法运行 OrdinalEncoder,因为它不喜欢 Nans,而且在编码之前我无法运行 KNNImputer。

我知道我可以用“?”之类的东西替换 Nan,然后 OrdinalEncoder() 就可以了,但是我必须通过并替换“?”的数字。转身回南。这意味着循环遍历 OrdinalEncoder 内部以找出“?”是什么。被映射到每一列,然后对该列进行替换。

难道没有更好的方法来做到这一点吗?我试图让掩蔽工作,但无法弄清楚。我需要对 X 而不是数据集进行操作。

标签: pythonnumpyscikit-learn

解决方案


评论太长了,但是如果您不介意进行一些复制,则可以简单地将NaNs 暂时从数组中移出。

array = dataset.to_numpy()
X = array[:, 1:]

nan_free_mask = ~np.isnan(X)
nan_free_X = X[nan_free_mask]

nan_free_encoded = OrdinalEncoder.fit_transform(nan_free_X, ...)
X_encoded = X.copy()
X_encoded[nan_free_mask] = nan_free_encoded
X_encoded = KNNImputer(...).fit_transform(X_encoded)

nan你用任何一个替换的想法也没有错?。你只需要记住它发生在哪里。据我所知,OrdinalEncoder 不会对您的数据进行洗牌,但我可能是错的:

array = dataset.to_numpy()
X = array[:, 1:]

nan_mask = np.isnan(X)
X[nan_mask] = '?'
X_encoded = OrdinalEncoder.fit_transform(X, ...)
X_encoded[nan_mask] = np.nan  # restore NaN
X_encoded = KNNImputer(...).fit_transform(X_encoded)

再说一次,您可能已经想到了这一点……如果是这样,请更新问题并指定您尝试过的内容。


推荐阅读