采纳答案成功!
向帮助你的同学说点啥吧!感谢那些助人为乐的人
视频中数据预处理x_train=standardscaler.transform(x_train) ,只对x_train做归一化,不需要对y_train做,是不是因为y是标签值(如果在回归计算时应对对y_train也归一化吧)。
我测试了一下你的数据,问题出在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')
继续加油!:)
非常感谢!
bobo老师您好,我用时间序列数据做分析,发现对x_train做归一化后与y_trian拟合一个模型,在用x_test 做预测,得到的y_predict 与y_test有一个数量级的截距,尽管拟合看起来差不多
这里我先对数据做归一化,没有在pipe里面做应该也一样的吧。2副图我是分开打印才显出来的,否则只能看到一幅
你的x_test有没有做同等的归一化?
做了,老师。我要不要把代码贴出来,不过数据是本地的
把你的数据和代码发我一份吧。我有时间看一下怎么回事儿。liuyubobobo@gmail.com
对,标签值不能进行归一化!
以房价预测为例,y_train就是每一个房产对应的价格;以学生成绩预测为例,y_train就是每个学生的学习成绩。我们不对它进行归一化,最后我们的模型预测出来就是实际的房产价格,或者实际的学生成绩。这就是我们想要的!
如果对y_train进行了归一化,那么我们预测出来的,就是一个归一化以后的数值,我们还需要将这个数值反归一化,实际上进行了一个冗余的步骤:)(因为我们本来就想知道房产价格和学生成绩,为什么要归一化以后再反归一化呢?)
登录后可查看更多问答,登录/注册
Python3+sklearn,兼顾原理、算法底层实现和框架使用。
2.4k 19
3.4k 17
2.9k 15
1.6k 15
1.4k 14