python - NaN 在 scikit-learn 的 OneHotEncoder 中给出 ValueError
问题描述
这是我的代码
import pandas as pd
import numpy as np
from sklearn.preprocessing import OneHotEncoder
train = pd.DataFrame({
'users':['John Johnson','John Smith','Mary Williams']
})
test = pd.DataFrame({
'users':[None,np.nan,'John Smith','Mary Williams']
})
ohe = OneHotEncoder(sparse=False,handle_unknown='ignore')
ohe.fit(train)
train_transformed = ohe.fit_transform(train)
test_transformed = ohe.transform(test)
print(test_transformed)
我希望 OneHotEncoder 能够处理测试数据集中的 np.nan,因为
handle_unknown='ignore'
但它给出了ValueError。它虽然能够处理 None 值。为什么它失败了?我该如何绕过它(除了 Imputer)?
从文档(https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.OneHotEncoder.html)看来,这就是 handle_unknown 的用途。
解决方案
您必须先清空缺失值。handle_unknown='ignore'
不涉及 NaN 值,但不涉及新类别ohe
。
您可以将 NaN 视为一个不同的类别,如下所示:
train = train.fillna("NaN")
test = test.fillna("NaN")
推荐阅读
- powershell - powershell : 不支持给定路径的格式
- asp.net-mvc - 如何使用引导程序输入行名然后在部分中行
- graphics - (D)SFML自动更新形状位置
- r - 在 Linux 中更改 R 库目录
- python - Python强制变量不要通过引用传递
- python - 如何使用 Matplotlib 在 Python 中实现此图
- c++ - c ++结构作为映射键和运算符重载
- javascript - 将锚链接固定到卡片底部
- code-signing - SignTool 错误:无法访问指定的时间戳服务器
- boto3 - '使用 Minio 和 Dask 我得到 s3.ServiceResource' 对象没有属性 'create_client'