我在两个单独的文件中训练和测试数据。
OneHotEncoder 根据不同的值为训练和测试数据提供不同数量的特征。但是分类器要求测试和训练数据的特征数量应该相等,我该如何解决这个问题?
我在两个单独的文件中训练和测试数据。
OneHotEncoder 根据不同的值为训练和测试数据提供不同数量的特征。但是分类器要求测试和训练数据的特征数量应该相等,我该如何解决这个问题?
一种热编码是一种将 3 个类别的输出标签转换为 [0, 1, 0] 或 3 为 [0, 0, 1] 的输出标签的方法。
如果您使用 scikit learn 将值转换为一个热编码器,那么在训练时您应该使用
enc = OneHotEncoder()
enc.fit(x_train)
如果您使用 scikit 学习将值转换为一个热编码器,那么在测试时您应该使用
enc.transform(x_test)
我们在测试中使用转换函数的原因是我们必须考虑标签值,我们在训练时转换数据的基础是标签值。因为在测试时我们没有得到该列的所有标签
一种热编码只是一种症状。问题的原因是您的因子 valible 在测试和训练数据中的水平不同。
在这里你应该分清。仅仅是抽样的问题吗?您将测试数据创建为(例如)原始数据的 20% 样本。某些基数较小的级别可能无法进入样本。如果是这种情况,您必须注意对所有级别进行采样并为每个级别获取 20% 的数据。
另一个问题是,如果您的因素 valible 不是静态的,并且随着时间的推移可能会出现新的 lavel。这里真的有可能在“看不见的数据”中遇到新的水平。
处理这个问题的一种可能方法是根据一些准备好的平均数据来训练一个明确的未知级别。在预处理阶段,所有新级别都被识别并映射到这个未知级别。
定期刷新模型以包括最近出现的级别。
在将数据拆分为训练集和测试集之前,需要进行数据预处理(包括从分类特征创建虚拟变量)。这将解决您的问题。
你没有太多关于你想要做什么的细节——所以如果我说的无关紧要,那就跳过它;但是,我会尽量避免您的测试集包含的类别少于训练集的事实。如果这种情况发生在多个类别中,也许您应该尝试将一些类别组合成更一般的类别(例如,如果变量包含“上班方式”,您可以合并“公共汽车”、“电车”、“地铁”进入“公共交通”)。另外,为什么不尝试交叉验证而不是使用静态测试集呢?(使用 scikit-learn 进行交叉验证的有用链接)