一、线性支持向量机
①基本模型(转化为最优化问题):
②使用拉格朗日乘子法可以获得其对偶问题:
③对偶问题:
满足KKT条件:
④求解α:(SMO算法)
违背了KKT条件,就会距离目标函数的优化越来越远,当目标函数的优化目标是取最大值时,目标函数在违背KKT条件下的实例下的函数值就会减小;当目标函数的优化目标是最小值时,目标函数在违背KKT条件下的实例下的函数值就会变大。对偶化的目标函数的优化方向是取最大值,所以说目标函数在当前违背KKT条件下的实例的函数值是减小的。
SMO高效性:
仅考虑αi和αj,
得到关于αi的单变量二次规划问题(仅有约束:αi≥0),具有闭式解,不用调用数值优化方法即可高效计算得到αi和αj
⑤求解b:
采用所有支持向量的求解均值以提高鲁棒性:
二分类:
>>> from sklearn import svm
>>> X = [[0, 0], [1, 1]]
>>> y = [0, 1]
>>> # 训练模型
>>> clf = svm.SVC(gamma='scale')
>>> clf.fit(X, y)
SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,
decision_function_shape='ovr', degree=3, gamma='scale', kernel='rbf',
max_iter=-1, probability=False, random_state=None, shrinking=True,
tol=0.001, verbose=False)
>>> # 模型预测
>>> clf.predict([[2., 2.]])
array([1])
>>> # 获得支持向量
>>> clf.support_vectors_
array([[ 0., 0.],
[ 1., 1.]])
>>> # 获得支持向量的索引
>>> clf.support_
array([0, 1]...)
>>> # 为每一个类别获得支持向量的数量
>>> clf.n_support_
array([1, 1]...)
多分类:
>>> X = [[0], [1], [2], [3]]
>>> Y = [0, 1, 2, 3]
>>> clf = svm.SVC(gamma='scale', decision_function_shape='ovo')
>>> clf.fit(X, Y)
SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,
decision_function_shape='ovo', degree=3, gamma='scale', kernel='rbf',
max_iter=-1, probability=False, random_state=None, shrinking=True,
tol=0.001, verbose=False)
>>> dec = clf.decision_function([[1]])
>>> dec.shape[1] # 4 classes: 4*3/2 = 6
6
>>> clf.decision_function_shape = "ovr"
>>> dec = clf.decision_function([[1]])
>>> dec.shape[1] # 4 classes
4
二、非线性支持向量机
对偶问题:
常用核函数(核函数都是半正定的):
核函数
>>> linear_svc = svm.SVC(kernel='linear')
>>> linear_svc.kernel
'linear'
>>> rbf_svc = svm.SVC(kernel='rbf')
>>> rbf_svc.kernel
'rbf'
三、软间隔
效果图:
四、支持向量回归SVR(推导过程同上)
引入两个松弛变量:
>>> from sklearn import svm
>>> X = [[0, 0], [2, 2]]
>>> y = [0.5, 2.5]
>>> clf = svm.SVR()
>>> clf.fit(X, y)
SVR(C=1.0, cache_size=200, coef0=0.0, degree=3, epsilon=0.1, gamma='auto_deprecated',
kernel='rbf', max_iter=-1, shrinking=True, tol=0.001, verbose=False)
>>> clf.predict([[1, 1]])
array([ 1.5])
五、半监督SVM
优化目标:
六、使用诀窍
- 惩罚系数C的设置:在合理的情况下, C 的默认选择为 1 。如果您有很多混杂的观察数据, 您应该要去调小它。 C 越小,就能更好地去正规化估计。
当C值较大时,LinearSVC和LinearSVR对C值较不敏感,即当C值大于特定阈值后,模型效果将会停止提升。同时,较大的C值将会导致较长的训练时间,Fan
et al.(2008)的论文显示,训练时间的差距有时会达到10倍。 - 数据标准化:支持向量机算法本身不能够很好地支持非标准化的数据,所以建议将数据标准化。
- 数据不均衡问题:在 SVC ,如果分类器的数据不均衡(例如,很多正例很少负例),设置 class_weight=‘balanced’ 与/或尝试不同的惩罚系数 C 。
- 底层实现的随机性:SVC和NuSVC的底层实现仅使用随机数生成器来打乱数据顺序进行概率估计(当probability被设置为True时)。这种随机性可以用random_state参数来控制。如果将probability设为False,这些估计器就不是随机的,random_state对结果没有影响。
- L1正则化:使用由 LinearSVC(loss=‘l2’, penalty=‘l1’, dual=False) 提供的 L1 惩罚去产生稀疏解,也就是说,特征权重的子集不同于零,这样做有助于决策函数。 随着增加 C 会产生一个更复杂的模型(有更多的特征被选择)。可以使用 l1_min_c 去计算 C 的数值,去产生一个”null” 模型(所有的权重等于零)
七、优点与缺点
优点:
1.在高维空间中非常高效.
2.即使在数据维度比样本数量大的情况下仍然有效.
3.在决策函数(称为支持向量)中使用训练集的子集,因此它也是高效利用内存的.
4.通用性: 不同的核函数与特定的决策函数一一对应.常见的 kernel 已经提供,也可以指定定制的内核.
缺点:
1.如果特征数量比样本数量大得多,在选择核函数 核函数 时要避免过拟合, 而且正则化项是非常重要的.
2.支持向量机不直接提供概率估计,这些都是使用昂贵的五次交叉验算计算的.