scikit learn 填补非 NaN 的值

1 投票
2 回答
1675 浏览
提问于 2025-04-17 22:47

我正在尝试为一个矩阵中的不同占位符填充值,这些占位符表示空值。比如说,我想在一个numpy的二维数组中,每当出现“?”时就填充一个值。

为此,我创建了一个Imputer,代码如下:

from sklearn import preprocessing
imputer = preprocessing.Imputer(missing_values="?", strategy='mean', axis=0, copy=False)
data = imputer.fit_transform(data)  

但是我遇到了这个错误:

/usr/local/lib/python2.7/dist-packages/sklearn/preprocessing/imputation.pyc in _get_mask(X, value_to_mask)
     27 def _get_mask(X, value_to_mask):
     28     """Compute the boolean mask X == missing_values."""
---> 29     if value_to_mask == "NaN" or np.isnan(value_to_mask):
     30         return np.isnan(X)
     31     else:

NotImplementedError: Not implemented for this type

我是不是对missing_values的设置理解错了?

我原以为它可以是任何字符串,而不仅仅是“NaN”,这似乎是scikit-learn的源代码所暗示的。

2 个回答

0

你在用哪个版本的sklearn呢?
从0.20版本开始,Imputer这个功能已经不再推荐使用了,建议你用SimpleImputer来代替。

from sklearn.impute import SimpleImputer
imputer = SimpleImputer(missing_values=np.nan, strategy='mean', verbose=0)

imputer = imputer.fit(X[:, 1:3])           # assume you want to impute 2 columns
X[:, 1:3] = imputer.transform(X[:, 1:3])
3

这里说的类型 "integer or string" 实际上是指“可以是一个整数,或者是字符串 'NaN'”。传给 fit/fit_transform 的输入应该还是数字。(之所以把 "NaN" 作为字符串传入,是因为如果直接用 np.nan,可能会让人困惑,因为 np.nan 和它自己不相等,也就是说 np.nan == np.nan 的结果是 False。)

撰写回答