在机器学习中,如果数据包含Categorical类型的数据,我们知道一种有效的处理方法就是使用One-Hot Encoding。Pandas提供get_dummies方法可以快速将categorical的数据转化为one-hot encoding的形式。
同时Scikit-learn library对于数据中包含列的顺序是敏感的,如果训练数据和测试数据包含的列的顺序是不同的,如下面的两个图所示。
训练数据one-hot encoding之后:
测试数据one-hot encoding之后:
此时使用训练数据训练好的模型,预测或者分类测试数据,这将是没有意义的。
所以出现了新的问题,如果训练数据和测试数据是两个分开的文档,例如train.csv 和test.csv文档。如何在one-hot encoding之后,使训练数据和测试数据具有相同的列顺序?
另一个问题是,如果训练数据和测试数据的某一个categorcal列的值不一样时,如何保证one-hot encoding之后,训练数据和测试数据具有相同的列? 例如:在训练数据中名为 "Car" 的列的值有“Honda, Toyota, Ford" 但是在测试数据中名为 "Car" 的列的值有”Honda, Toyota, Ford, BMW“
我们可以使用align command解决上述的两个问题。从而保证测试数据和训练数据具有相同的编码行为(encoding manner)
举个列子说明align如何使用:
首先从csv文档中读取训练数据和测试数据
train_df = pd.read_csv("train.csv")
test_df = pd.read_csv("test.csv")
然后使用get_dummies方法将训练数据和测试数据转化为one-hot encoding的形式
one_hot_train = pd.get_dummies(train_df)
one_hot_test = pd.get_dummies(test_df )
最后使用align方法处理训练和测试数据
train, test=one_hot_train .align(one_hot_test ,join='left',axis=1)
其中join='left' 和SQL中的left join实现形同的功能,意思是如果训练数据和测试数据中的列的个数不同时,只保留所有在训练数据中的列。当然也可以用join='inner',意思是保留同时存在于训练数据和测试数据中的列。










网友评论