zoukankan      html  css  js  c++  java
  • SVM 与SVR

    支持向量机(SVM)本身是针对二分类问题提出的,而SVR(支持向量回归)是SVM(支持向量机)中的一个重要的应用分支。SVR回归与SVM分类的区别在于,SVR的样本点最终只有一类,它所寻求的最优超平面不是SVM那样使两类或多类样本点分的“最开”,而是使所有的样本点离着超平面的总偏差最小。

    ​ SVM是要使到超平面最近的样本点的“距离”最大;

    ​ SVR则是要使到超平面最远的样本点的“距离”最小。

    img

    SVM/SVR图示

    ​ 回归就像是寻找一堆数据的内在的关系。不论这堆数据有几种类别组成,得到一个公式,拟合这些数据,当给个新的坐标值时,能够求得一个新的值。所以对于SVR,就是求得一个面或者一个函数,可以把所有数据拟合了(就是指所有的数据点,不管属于哪一类,数据点到这个面或者函数的距离最近)

    ​ 统计上的理解就是:使得所有的数据的类内方差最小,把所有的类的数据看作是一个类。

    ​ 传统的回归方法当且仅当回归f(x)完全等于y时才认为是预测正确,需计算其损失;而支持向量回归(SVR)则认为只要是f(x)与y偏离程度不要太大,既可认为预测正确,不用计算损失。具体的就是设置一个阈值α,只是计算 |f(x) - y| > α 的数据点的loss。如图:支持向量回归表示只要在虚线内部的值都可认为是预测正确,只要计算虚线外部的值的损失即可。

    img

    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
    来源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 相关阅读:
    ruby2.2.2在msvc2010上编译
    msvc2010生成的指令序列有问题,可能跟pgo有关
    Could not load file or assembly 'Oracle.DataAccess' or one of its dependencies. An attempt was made to load a program with an incorrect format.
    正则总结
    实现点击按钮全选功能
    轮播图(省代码方法)
    js实现复制URL功能
    字符串的常用方法
    两种文件上传的实现-Ajax和form+iframe
    jquery中attr和prop的区别
  • 原文地址:https://www.cnblogs.com/louieowrth/p/12544054.html
Copyright © 2011-2022 走看看