Scikit-learn 中 OneHotEncoder 和 KNNImpute 之间的循环

Cyclical Loop Between OneHotEncoder and KNNImpute in Scikit-learn

我正在处理一个非常简单的数据集。它在分类和数字特征方面都有一些缺失值。因此,我正在尝试使用 sklearn.preprocessing.KNNImpute 来获得最准确的估算。但是,当我 运行 以下代码时:

imputer = KNNImputer(n_neighbors=120)

imputer.fit_transform(x_train)

我收到错误:ValueError: could not convert string to float: 'Private'

有道理,它显然不能处理分类数据。但是当我尝试使用 运行 OneHotEncoder 时:

encoder = OneHotEncoder(drop="first")

encoder.fit_transform(x_train[categorical_features])

它抛出错误:ValueError: Input contains NaN

我更愿意使用 KNNImpute 即使是分类数据,因为我觉得如果我只使用 ColumnTransform 并分别估算数字和分类数据,我会失去一些准确性.有没有办法让 OneHotEncoder 忽略这些缺失值?如果不是,使用 ColumnTransform 或更简单的输入法是否是解决此问题的更好方法?

提前致谢

issues/PRs 可以处理 OneHotEncoder 上的缺失值,但尚不清楚选项是什么。在此期间,这里有一个手动方法。

  • 用 pandas 或 SimpleImputer 用字符串“missing”填充分类缺失。
  • 然后使用OneHotEncoder
  • 使用 one-hot 编码器的 get_feature_names 来识别对应于每个原始特征的列,尤其是“缺失”指标。
  • 对于每一行和每个原始分类特征,当1在“缺失”列时,将0替换为np.nan;然后删除缺少的指标列。
  • 现在一切都应该设置为 运行 KNNImputer
  • 最后,如果需要,对估算的分类编码列进行后处理。 (简单的四舍五入可能会给你一个分类特征的全零行,但我不认为使用 KNNImputer 你可以连续得到超过一个 1。你可以 argmax 而不是精确地返回一个 1。 )