首页 > 解决方案 > Scikit-learn 中 OneHotEncoder 和 KNNImpute 之间的循环循环

问题描述

我正在使用一个非常简单的数据集。它在分类和数字特征中都有一些缺失值。因此,我正在尝试使用 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分类数据,因为我觉得如果我只使用 aColumnTransform并单独使用数字和分类数据进行估算,我会失去一些准确性。有什么办法可以OneHotEncoder忽略这些缺失值?如果不是,使用ColumnTransform或更简单的 imputer 是解决此问题的更好方法吗?

提前致谢

标签: pythonmachine-learningscikit-learnpreprocessor

解决方案


有一些未解决的问题/PR 可以处理 上OneHotEncoder的缺失值,但目前尚不清楚选项是什么。在此期间,这是一种手动方法。

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

推荐阅读