python - one-hot 编码的可用类别的一致性
问题描述
假设我有两个数据集,一个用于训练,一个用于预测。
在这两个数据集中,我有相同的分类变量,我希望使用 sklearn 进行一次热编码preprocessing.OneHotEncoder()
。
接下来,让我们看看变量 X 可能的唯一值:['a', 'b', 'c', 'd', 'e']
因此,变量 X 存在于训练和测试数据集中。但是,只有值'a'
和'b'
出现在训练集中,而只有'c'
和'd'
出现'e'
在测试集中。
因此,如果我将以下代码应用于这两个数据集:
enc1 = pre.OneHotEncoder()
to_encode = train_df.select_dtypes(include='object')
encoded = enc1.fit_transform(to_encode).toarray()
dum_df = pd.DataFrame(encoded, columns=enc1.get_feature_names(to_encode.columns))
train_df = train_df.join(dum_df)
train_df.drop(to_encode.columns, axis=1, inplace=True)
# And repeat, just replace train_df with test_df
我得到两个单热编码数据帧。但是,它们的维度会有所不同,因为训练集中的一些值没有出现在测试集中(反之亦然)。
假设我已经在训练集上训练了一个算法:
- 当我将测试集中的数据输入到机器学习算法中时会发生什么,该算法是在具有不同维度的训练集上训练的?
- 算法是否会关心某些数据列是否丢失?具体来说,我正在使用
XGBoost.XGBRegressor()
,但我也有兴趣知道是否有一个通用的答案。
解决方案
我认为 align 是您正在寻找的。如下例所示
train = pd.get_dummies(train) #assume it gives (1451, 221)
test = pd.get_dummies(test) #assume it gives (1459, 206)
# now doing alignment of train and test will do the trick
final_train, final_test = train.align(test, join='inner', axis=1) # inner join
推荐阅读
- docker - docker绑定一个端口,但是绑定另一个端口,服务访问失败
- electron - 如何在 Electron 中制作一个透明的加载 GIF 窗口?
- android - 是否可以编写脚本将 PWA 应用程序添加到主屏幕?
- python - Python断言列表中的所有元素不是无
- html - 如何使用图像替换 Navbar.brand?
- python - 使用 scons 0.98.1 和 python2.7 无法使用旧版本构建 gem5(stt/sdo/invisispec)
- javascript - TypeError:无法读取未定义的属性(读取“地图”)ReactJs从文件中获取数据
- c# - 比赛开始创建房间后,Photon Unity中所有人离开后房间会消失吗?
- asp.net-core - 为使用 HotChocolate 框架和 ASP.NetCore 5.0 构建的 GraphQL 端点设置 Windows 身份验证
- vue.js - Vue/Nuxt.js 图片幻灯片