深入机器学习2:浅析为什么SVR预测值都相同
前言
本系列靠很多参考资料支撑,随缘更新,主要的目的是帮我自己复习梳理一下知识,顺便分享一下自己的理解。
必备说明
本系列写起来很费劲,需要打公式,还需要自己理解。所以,如果有打错字请理解,如果有说错,请务必指出,欢迎大家一起讨论学习。
目录结构
1. 问题的发生:
今天,在写代码的时候,用到了支持向量回归模型,但是结果发现,预测的值居然几乎相差不大,效果非常差,见下图:
2. 思考方向1:核函数
这个现象把我问住了,因为在我的理解了SVR应该就像SVM一样,十分的强大才对。
我的SVR模型代码为:
SVR( kernel='rbf',C=0.01)
我首先怀疑的是,核函数没有选择好,于是我又改用了其它的核函数,结果如下图:
**可以看到的是,结果都不好,预测值几乎都相同。**说明,核函数并不是影响值相同的因素。
3. 思考方向2:C值
排除掉核函数后,就只剩下为数不多可以影响结果的模型参数,其中一个就是C值。
于是,我针对RBF核函数,采取了C=0.1\1\10\100
四种值来运行上面的代码,结果分别如下图:
好家伙,原来就是你小子作怪。
找到了影响的参数,那么我非常想要知道,为什么会发生这样的事情。
4. 为什么发生?C值的作用
我想起之前分享的一篇文章详解正则表达式
中,提及了一点:当逻辑回归中没有正则项时,w值会因为损失函数值越小越好,而趋近于无穷。
于是,我有一个想法,当C值越来越小,是不是意味着模型的w值会越来越趋近于0,那么模型最后只剩下一个bias值,自然输出就是固定的了。
有了这个想法后,我就打开自己关于SVR的笔记(由于主要学的是SVM,相信很大多和我一样其实对SVR只是了解,而不熟悉),发现了一个公式:
**这个公式来自西瓜书关于SVR优化目标的推导。**其实,已经不难发现,当C值越小,右边的项值也越小,那么优化目标就变为了:
min ||w||
而w值自然越趋近于0越好了,也不难知道,最后的预测值相同的原因就是输出的都是bias。
为了证实这一点,我又把我的代码修改了一下,把每次的bias打印出来:
[32.00348518]
而这个bias对应的图为:
另外,C右边的一项含义是:**当点超过我们的容忍范围时,才计入损失中。**而C值表示其权重。
那么,假设我们的模型已经学习好了(但是还在学习中),但是有些点肯定是没有学习到的,即有些点(记为A类点)在我们的容忍范围之外,此时,c值越大,这些A类点所占比例越大,那么模型就会继续调整,争取把这些A类点也学到。
这意味着什么,意味着训练越来越好,越来越容易过拟合。
验证这个猜想,我继续修改代码,把C值放大,并且换一种方式画图(此时的代码来自别人的博客,我之前的是自己的数据):
5. 总结(省时间环节):
经过上面的讨论,不难看出:
- 预测值相同,是因为C值没有设置好,与选择的核函数关系不太大
- C值越大,越容易过拟合
- C值越小,输出的值越容易趋近于相同值,这个相同值是bias截距,因为此时w趋近于0
参考博客:
https://blog.csdn.net/manjhOK/article/details/80367624