机器学习

如何保证训练数据和测试数据具有相同的one-hot encodi

2018-11-14  本文已影响0人  泡泡_e661

在机器学习中,如果数据包含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',意思是保留同时存在于训练数据和测试数据中的列。

如果喜欢,就给个赞👍吧! 谢谢!!!

上一篇 下一篇

猜你喜欢

热点阅读