如何解决机器学习分类编码后的训练和测试集中的不匹配问题?
当我初步开始实施机器学习时,我遇到了一个问题,即在one-hot编码之后,训练和测试集数据中的列数是不相等的,但问题是,在训练数据集上训练我的模型之后,由于列数不同,不能预测测试集。
所以在做了一些研究并通过我的经验之后,我对这个问题提出了以下三种解决方案:
Pandas factorize
您可以使用pd.factorize,而不是使用pandas get_dummies,它与get_dummies语法几乎相似,但它们之间的主要区别是,不是将get_dummies返回n列,而是只返回一列。
例:
df[‘column_name'] = pd.factorize(df[‘column_name'])[0]
就我个人而言,它是我的首选之一,特别是如果该列有太多类别供我的机器处理。
合并两个数据集和组合数据集上的编码
现在,如果您真的想要执行get_dummies或pd.factorize之外的其他任何操作(有时候它可能会影响效率和准确性),那么我们首先需要确保训练和测试数据集包含相同的列和更重要的是以正确的顺序。
然后做这个 -
在训练和测试数据中创建一个新列,并分别为其分配1和0。
然后将这两个数据集合并成一个新的数据集。
这里需要注意的一个非常重要的一点是,我们在连接时没有指定轴,这意味着我们是沿着行进行组合的。因此,这将做的是将测试集与“train”列下的“train”列相结合,作为demarkation(所有的行都属于训练集,而那些为0的则属于测试部分)。
现在对所需列执行所需的编码,并将其保存到新的数据集中。
df=pd.get_dummies(combined['shop_id'])
使用组合数据集对新数据集进行Concat
combined=pd.concat([combined,df],axis=1)
现在是时候分开这两个数据集,我们现在已经完成了包含相同列数的训练和测试集。
train_df=combined[combined["train"]==1]
test_df=combined[combined["train"]==0]
train_df.dtop(["train"],axis=1,inplace=true)
test_df.dtop(["train"],axis=1,inplace=true)
实施PCA
另一种方法是在分别对两组进行编码之后使用PCA,然后应用PCA截断测试集,使其与训练集的列数相等。
我个人认为,使用PCA会造成麻烦,使用PCA会导致数据丢失,从而影响模型。