Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Scikit学习中OneHotEncoder和KNIMPUTE之间的循环循环_Python_Machine Learning_Scikit Learn_Preprocessor - Fatal编程技术网

Python Scikit学习中OneHotEncoder和KNIMPUTE之间的循环循环

Python Scikit学习中OneHotEncoder和KNIMPUTE之间的循环循环,python,machine-learning,scikit-learn,preprocessor,Python,Machine Learning,Scikit Learn,Preprocessor,我正在使用一个非常简单的数据集。它在分类和数字特征中都缺少一些值。正因为如此,我尝试使用sklearn.preprocessing.knimpute来获得最准确的插补。但是,当我运行以下代码时: imputer = KNNImputer(n_neighbors=120) imputer.fit_transform(x_train) 我收到错误:ValueError:无法将字符串转换为float:“Private” 这是有道理的,它显然不能处理分类数据。但当我尝试运行OneHotEncoder

我正在使用一个非常简单的数据集。它在分类和数字特征中都缺少一些值。正因为如此,我尝试使用sklearn.preprocessing.knimpute来获得最准确的插补。但是,当我运行以下代码时:

imputer = KNNImputer(n_neighbors=120)

imputer.fit_transform(x_train)
我收到错误:
ValueError:无法将字符串转换为float:“Private”

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

encoder = OneHotEncoder(drop="first")

encoder.fit_transform(x_train[categorical_features])
它抛出错误:
ValueError:Input包含NaN

我更喜欢使用
KNIMPUTE
,即使是分类数据,因为如果我只使用
列变换
并分别使用数字和分类数据进行插补,我觉得会失去一些准确性。有没有办法让OneHotEncoder忽略这些缺失的值?如果不是,使用
ColumnTransform
或更简单的插补器是否是解决此问题的更好方法


提前感谢

在处理OneHotEncoder上缺少的值时存在一些问题/PRs,但目前还不清楚该选项是什么。在此期间,这里有一个手动方法

  • 用pandas填充分类缺失,或用字符串“missing”填充
    SimpleImputer
  • 然后使用OneHotEncoder
  • 使用一个热编码器的
    get_feature_names
    识别与每个原始特征对应的列,尤其是“缺失”指示器
  • 对于每一行和每一个原始分类特征,当1位于“缺失”列时,将0替换为
    np.nan
    ;然后删除缺少的指示符列
  • 现在,一切都应该设置为运行
    KNIMPUTER
  • 最后,如果需要,对输入的分类编码列进行后处理。(简单地四舍五入可能会为分类功能获得一个全零行,但我不认为使用
    KNIMPUTER
    您可以在一行中获得多个1。您可以使用argmax取而代之,只返回一个1。)

使用
KNIMPUTE
填充一个热编码类别通常会产生0到1之间的值(除非
n_neights=1
);你可以用吗?如果是这样,您希望如何对缺少的值进行编码:作为一个新列,还是全部为零?@BenReiniger只要我将值四舍五入到0和1之间就可以了,对吗?对于问题的第二部分,我认为对于缺少的分类变量,默认为0是最好的。然而,我希望有一种方法可以在
OneHotEncoder()
中忽略这些NAs,这样我也可以在分类变量中计算这些NAs。真的没有办法吗?谢谢,伙计,这真的帮了大忙,我很感激