python - 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 是解决此问题的更好方法吗?
提前致谢
解决方案
有一些未解决的问题/PR 可以处理 上OneHotEncoder
的缺失值,但目前尚不清楚选项是什么。在此期间,这是一种手动方法。
- 用 pandas 或
SimpleImputer
字符串“missing”填充分类缺失。 - 那就用
OneHotEncoder
吧。 - 使用 one-hot 编码器
get_feature_names
来识别与每个原始特征对应的列,特别是“缺失”指示符。 - 对于每一行和每个原始分类特征,当 1 在“缺失”列中时,将 0 替换为
np.nan
; 然后删除缺少的指标列。 - 现在一切都应该设置好运行
KNNImputer
。 - 最后,如果需要,对估算的分类编码列进行后处理。(简单的四舍五入可能会让你得到一个分类特征的全零行,但我认为
KNNImputer
你不能连续得到一个以上的 1。你可以用 argmax 来准确地取回一个 1。)
推荐阅读
- python - 从 Python 以 .cpp 格式保存 LGBM 模型
- javascript - 为什么 parseInt(x,0) 与 parseInt(x, 10) 相同?
- django - 在 django allauth 中解决错误未授权/rest-auth/registration/
- create-react-app - 在构建时运行 Netlify 变量 api 密钥,从 github 存储库中隐藏密钥
- sql - 我如何询问/组合 2 个 SQL SELECTS 并将结果放入 php 变量中?[关闭]
- python - 裁剪后如何检测和对齐倾斜的图像
- mongodb - mongodb查询慢,怎么会这样?
- c++ - 如何在 C++ 中的 std::list 中访问 std::function
- typescript - 从对象键动态创建类型
- hibernate - Springdata/JPQL——如何将元素从列表中放入子选择值