问题1 DataFrame能直接做训练集和测试集吗?
猜想
最近使用sklearn的模型的时候发现训练集可以直接传入pandas的DataFrame进行训练,而且进行预测的时候也可以直接传入DataFrame,我以为sklearn可以直接识别DataFrame中数据列的顺序,即使列的顺序是乱的也可以直接进行预测,于是做了个测试。
测试
这里训练集的x_train,测试集是x_test:
这个时候顺序是一样的,这个时候预测结果是2.6+:
然后把测试集的顺序乱一下:
这里把测试集中的列a和列c调换了一下位置,得出的结果是3.8+:
其实如果把列名乱填的话
结果也是3.8+:
所以说之前的想法是错误的
结论
如果想要往sklearn的模型中传入DataFrame的话,列名的顺序必须是一样的,应该是传入的时候调用的as_matrix()方法,直接传入的矩阵,列什么的sklearn并不会关心。
问题2 训练集和测试集列数一样但是顺序不同怎么办?
但是如果我的训练集和测试集都是DataFrame格式的,列数一样但是顺序不一样,想要放进sklearn里进行训练和预测,那该怎么办呢?
这个时候使用:
问题3 训练集的列数和测试集不一样怎么办?
还有一种情况是训练集的列数和测试集的不一样
像下面这个例子,训练集缺失了good_d,更多的的情况是缺很多列
训练集和测试集分别处理哑变量的情况下会出现这种问题,不知道大家是怎么解决的?
如果训练集中没有测试集中的列,是不是应该把测试集中对应的列删掉;
如果测试集中没有训练集中的列,通常这种情况是要把缺失的列补上并且填充一个0,那么怎么做呢?
我目前的解决方法是这样的,和解决问题2的方法类似。总感觉有点笨,不知道还有没有好的解决方案。
其他
DataFrame的filter方法是个选择特征列好方法,可以用正则表达式匹配需要选择的列,很好用。