机器学习-SVM
来源:互联网 发布:三大龙脉 知乎 编辑:程序博客网 时间:2024/05/29 17:30
SVM
支持向量机是个二分类模型。给定给一个包含正例和反例的样本集合,svm的目的是寻找一个超平面来对样本根据正例和反例进行分割。保证最大间隔,间隔最大可以有效避免在分类面上的样本的误判率。网上也是对其推崇备至,认为不管什么任务,先跑跑SVM和RF。
对于超平面的求取,是一个凸二次规划问题,牵扯到对偶优化,在此不做详细解释。对于非线性超平面的求取,需要用到核函数。常用核函数例如:多项式核函数、高斯核核函数、线性核函数、高斯核函数、字符串核函数。上述方法叫做核方法。事实上,任何将计算表示为数据点内积的方法都可以用核方法进行非线性扩展。
对于使用哪一种核函数,具体问题具体分析,一些大牛的经验是:一般用线性核和高斯核,也就是Linear核与RBF核需要注意的是需要对数据归一化处理,很多使用者忘了这个小细节然后一般情况下RBF效果是不会差于Linear但是时间上RBF会耗费更多。下面是吴恩达的见解:
1、如果Feature的数量很大,跟样本数量差不多,这时候选用LR或者是Linear Kernel的SVM2. 如果Feature的数量比较小,
2、样本数量一般,不算大也不算小,选用SVM+Gaussian Kernel
3、如果Feature的数量比较小,而样本数量很多,需要手工添加一些feature变成第一种情况
由于噪音的存在,有可能有偏离正常位置很远的数据点存在,甚至类别1出现杂了类别2的区域中这样的异常值叫outliers。为处理这种情况,需要一个惩罚因子C(cost),它代表了对离群点带来的损失的重视程度,它的值越大,对目标函数的损失越大,意味着你非常不愿意放弃这些点。由使用者指定的一个值(libsvm中的参数C),是参数调优的重点所在。
SVM也能解决多分类问题:
1、一对多
也就是“一对其余”(One-against-All) 的方式,就是每次仍然解一个两类分类的问题。这样对于n个样本会得到n个分类器。但是这种方式可能会出现分类重叠现象或者不可分类现象,而且由于“其余”的数据集过大,这样其实就人为造成了“数据偏斜”的问题。
生成N个分类器,对应N个分类结果,最终的结果由N个分类结果中概率最大的决定。
2、一对一
每次选择一个类作为正样本,负样本只用选其余的一个类,这样就避免了数据偏斜的问题。训练出的分类个数是k*(k-1)/2,虽然分类器的个数比上面多了,但是训练阶段所用的总时间却比“一类对其余”方法少很多。
这种方法可能使多个分类器指向同一个类别,所以可以采用“投票”的方式确定哪个类别:哪个分类器获得的票数多就是哪个分类器。这种方式也会有分类重叠的现象,但是不会有不可分类的情况,因为不可能所有类别的票数都是0。但是也很容易发现这种方法是分类器的数目呈平方级上升。
3、DAG SVM
假设有1、2、3、4、5五个类,那么可以按照如下方式训练分类器( 这是一个有向无环图,因此这种方法也叫做DAG SVM)
这种方式减少了分类器的数量,分类速度飞快,而且也没有分类重叠和不可分类现象。
但是假如一开始的分类器回答错误,那么后面的分类器没有办法纠正,错误会一直向下累积。
为了减少这种错误累积,根节点的选取至关重要。