支持向量机(SVM)本身是针对二分类问题提出的,而SVR(支持向量回归)是SVM(支持向量机)中的一个重要的应用分支。SVR回归与SVM分类的区别在于,SVR的样本点最终只有一类,它所寻求的最优超平面不是SVM那样使两类或多类样本点分的“最开”,而是使所有的样本点离着超平面的总偏差最小。
SVM是要使到超平面最近的样本点的“距离”最大;
SVR则是要使到超平面最远的样本点的“距离”最小。
SVM/SVR图示
回归就像是寻找一堆数据的内在的关系。不论这堆数据有几种类别组成,得到一个公式,拟合这些数据,当给个新的坐标值时,能够求得一个新的值。所以对于SVR,就是求得一个面或者一个函数,可以把所有数据拟合了(就是指所有的数据点,不管属于哪一类,数据点到这个面或者函数的距离最近)
统计上的理解就是:使得所有的数据的类内方差最小,把所有的类的数据看作是一个类。
传统的回归方法当且仅当回归f(x)完全等于y时才认为是预测正确,需计算其损失;而支持向量回归(SVR)则认为只要是f(x)与y偏离程度不要太大,既可认为预测正确,不用计算损失。具体的就是设置一个阈值α,只是计算 |f(x) - y| > α 的数据点的loss。如图:支持向量回归表示只要在虚线内部的值都可认为是预测正确,只要计算虚线外部的值的损失即可。
SVR超平面示意
在实际的SVR应用时所用到的方法以sklearn中为例:
sklearn.svm.SVR(kernel='rbf', degree=3, gamma='auto_deprecated', coef0=0.0, tol=0.001, C=1.0, epsilon=0.1, shrinking=True, cache_size=200, verbose=False, max_iter=-1)
根据不同训练集、特征集,其中的参数的值的变化所得到的结果也会有不同,下面简单了解一下SVR中的参数的意义及部分参数所参考的值:
kernel: type: string;optional(default=‘rbf’)
算法中所使用的核函数类型,其中有(‘linear’, ‘poly’, ‘rbf’, ‘sigmoid’,‘precomputer’,默认使用‘rbf’)
degree:type:int, optional(default=3)
多项式核函数的次数,默认为3,所以当核函数为‘poly’时用到,其它核函数忽略
gamma:type:float, optional(default=‘auto’)
核函数的系数, 在核函数为‘rbf’, ‘poly’, ‘sigmoid’时使用,其他核函数忽略。gamma的值必须大于0, 随着gamma的增大,对于测试集分类效果越差,对于训练集分类效果好,并且使模型的复杂度提高,泛化能力(对未知数的预测能力)较差,从而出现过拟合的情况。
coef0:type:float, optional(default=0.0)
核函数中的独立项,只在核函数为‘poly’跟‘sigmoid’时使用。
tol:type:float, optional(default=1e-3)
停止判断的公差
C:type:float, optional(default=1.0)
错误项的惩罚因子:表征有多重视离群点,C越大越重视,也就是越不想丢掉这些离群点。C值大时对误差分类的惩罚增大,C值小时对误差分类的惩罚减小。当C趋近于无穷大时,表示不允许分类误差的存在;当C趋于0时,表示不再关注分类是否正确。
epsilon:type:float, optional(default=0.1)
pass
shrinking:type:boolean,optional(default=True)
是否使用收缩启发式
cache_size:type:float, optional
内核缓存的大小
verbose:type:bool, default:False
启用详细输出。如果启用,在多线程环境下可能无法正常工作
max_iter:type:int, optional(default=-1)
解算器内迭代的硬性限制,默认为-1(无限制)
在上面的参数中不难看出,其中一半的参数均与核函数有关,那么问题来了,什么是核函数?核函数在SVR中作为一个什么角色?起到了什么作用?
在SVM/SVR中,如果没有核映射思想的引入,那么SVM/SVR就是一种加了距离限制的PLA(感知机,有兴趣的可自行百度)
准确的来说,核函数在机器学习中更应该是一种技巧,这种技巧主要体现在不需要明确的指定核映射的具体形式。核映射一般有三总情况:1.在不增减维度的情况下做变换,2.涉及到维度的增减,3.两种情况都包含。
核函数一般有多项式核、高斯径向基核、指数径向基核、多隐层感知核、傅立叶级数核、样条核等,在回归模型中,不同的核函数对拟合的结果会有较大的影响。
针对于非线性支持向量回归机,通常做法就是将低维数据映射到高维的空间,在高维空间中找到线性可分的超平面,最后再把高维空间的超平面映射回低维空间,这样就可以实现SVM的分类或者SVR的回归。但是,将低维的数据映射到高维的空间,在高维空间做计算,计算量特别大,尤其是当维度很高的情况下,而且也会容易过拟合。
核函数就是为了解决这个问题产生的,用核函数代替线性方程中的线性项可以使原来的线性算法非线性化,即能做非线性回归,此时引进核函数达到了升维的目的,也可以有效的控制过拟合。通俗的讲就是应用核函数就是在低维时就对数据做了计算,这个计算可以看做是将低维空间的数据映射到高维空间中做的计算(就是一个隐式变换)。
除核函数外,还有一个比较重要的概念就是损失函数:
损失函数是学习模型在学习过程中对误差的一种度量,一般在模型学习前已经选定,不同的学习问题对应的损失函数也不同,同一学习问题选取的损失函数不同得到的模型也会不同。
在SVR中对于损失函数构成的模型,有些权重很大,有些权重很小,这样就会容易导致过拟合(就是过分拟合了训练数据集),而过拟合则是因为样本太多的特征被包含进来,很多与项目本身无关的特征也被包含进来。
解决过拟合问题有很多方式,常见的有以下几种:
1).喂数据,也就是给足够多的数据,只有数据多了,数据的很多特征才会更加明显的体现出来,训练的模型也会不断的修正,特征的作用也会体现的越来越大。
2).特征降维,越多的特征导致训练集的维度越高,降维就是把高维空间的数据投影到低维空间中(保存下来的特征是数据量大的)。主要有:PCA降维(主成分分析,无监督)、反向特征消除、随机森林/组合树、LDA(线性判别分析,有监督)、LLE(局部线性嵌入)、Laplacian Eigenmaps(拉普拉斯特征映射)等
3).针对具体的负荷预测,对电量值进行标准化或者归一化。可以时特征训练集能够快速的收敛,可以使特征值域范围变小,有利于提高精度。
作者:罗汉堂主
链接:https://www.jianshu.com/p/399ddcac2178
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。