视频中数据预处理x_train=standardscaler.transform(x_train) ,只对x_train做归一化

来源:4-8 scikit-learn中的Scaler

qq_慕姐45445

2019-03-12

视频中数据预处理x_train=standardscaler.transform(x_train) ,只对x_train做归一化,不需要对y_train做,是不是因为y是标签值(如果在回归计算时应对对y_train也归一化吧)。

写回答

3回答

liuyubobobo

2019-04-25

我测试了一下你的数据,问题出在LinearSVR上。


根据你的代码,你可以看一下,训练出的LinearSVR的r2值,无论是在训练数据集上,还是测试数据集上,都是负数。回忆一下课程里介绍的r^2值的定义,负数代表拟合效果极差,预测效果还不如直接使用平均数。


如果你看一下y_predict的具体值,会发现所有的y_predict都是4k左右。绘制出的曲线,是在4k的基础上的一个误差曲线。这就是图示左上角那个1e-9+4e3的意思。


看这个曲线,确实像是对y进行了某种归一化的结果。但我不知道它具体是怎么做的。我以前没有意识到过这个问题,也没有调查过这个问题,在LinearSVR的文档里也没有找到解释。


我尝试使用了一下SVR(kernel='linear')和LinearRegression,都能得到正常的结果。所以我也不确定是什么原因,甚至可能是sklearn实现的LinearSVR的bug(内部对y进行了转换,外部没转换回来)。当然,不排除是因为我不会用LinearSVR,但即使如此,我也倾向于认为这个LinearSVR封装的不合理。因为如果它对y进行了变化,这个变化完全没有必要让用户感知到,在算法内部可以很容易地将y转换回来。


anyway,我的结论,如果你一定是用线性SVM做这个回归分析,不要使用LinearSVR,使用SVR(kernel='linear')


继续加油!:)

0
1
qq_慕姐45445
非常感谢!
2019-04-28
共1条回复

qq_慕姐45445

提问者

2019-04-25

bobo老师您好,我用时间序列数据做分析,发现对x_train做归一化后与y_trian拟合一个模型,在用x_test 做预测,得到的y_predict 与y_test有一个数量级的截距,尽管拟合看起来差不多

//img.mukewang.com/szimg/5cc1b4120001bcfe11370877.jpg


//img.mukewang.com/szimg/5cc1b4b8000137c305730842.jpg

这里我先对数据做归一化,没有在pipe里面做应该也一样的吧。2副图我是分开打印才显出来的,否则只能看到一幅

0
4
qq_慕姐45445
回复
liuyubobobo
非常感谢bobo老师
2019-04-28
共4条回复

liuyubobobo

2019-03-13

对,标签值不能进行归一化!


以房价预测为例,y_train就是每一个房产对应的价格;以学生成绩预测为例,y_train就是每个学生的学习成绩。我们不对它进行归一化,最后我们的模型预测出来就是实际的房产价格,或者实际的学生成绩。这就是我们想要的!


如果对y_train进行了归一化,那么我们预测出来的,就是一个归一化以后的数值,我们还需要将这个数值反归一化,实际上进行了一个冗余的步骤:)(因为我们本来就想知道房产价格和学生成绩,为什么要归一化以后再反归一化呢?)


继续加油!:)

0
0

Python3入门机器学习 经典算法与应用  

Python3+sklearn,兼顾原理、算法底层实现和框架使用。

5850 学习 · 2437 问题

查看课程