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。 )
我正在处理一个非常简单的数据集。它在分类和数字特征方面都有一些缺失值。因此,我正在尝试使用 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。 )