之前我们进行过 SVM 原理的推导,本文记录 Sklearn 支持向量机库相关内容。
- 分类的算法库,主要包含 LinearSVC,NuSVC 和 SVC 三个类
- 回归算法库,包含SVR,NuSVR 和 LinearSVR 三个类,相关模块都包裹在 sklearn.svm 模块中。对于SVC,NuSVC 和 LinearSVC 三个分类的库,SVC 和 NuSVC 差不多,区别仅仅在于对损失的度量方式不同,而LinearSVC从名字就可以看出,他是线性分类,也就是不支持各种低维到高维的核函数,仅仅支持线性核函数,对线性不可分的数据不能使用。
其中和原始形式不同的 α^{\vee} , α^{\vee} 为拉格朗日系数向量,K(x_i, x_j) 为我们要使用的核函数。
class sklearn.svm.LinearSVC(self,
penalty='l2', loss='squared_hinge', dual=True, tol=1e-4,
C=1.0, multi_class='ovr', fit_intercept=True,
intercept_scaling=1, class_weight=None, verbose=0,
random_state=None, max_iter=1000)
参数 | 含义 |
---|---|
penalty | 正则化参数,L1 和 L2 两种参数可选,仅 LinearSVC 有。默认是 L2 正则化,如果我们需要产生稀疏的话,可以选择 L1 正则化,这和线性回归里面的 Lasso 回归类似 |
loss | 损失函数,有 hinge 和 squared_hinge 两种可选,前者又称为 L1 损失,后者称为 L2 损失,默认是 squared_hinge,其中 hinge 是SVM的标准损失,squared_hinge 是 hinge的平方 |
dual | 是否转化为对偶问题求解,默认是 True。这是一个布尔变量,控制是否使用对偶形式来优化算法 |
tol | 残差收敛条件,默认是0.0001,与 LR 中的一致 |
C | 惩罚系数,用来控制损失函数的惩罚系数,类似于LR中的正则化系数。默认为1,一般需要通过交叉验证来选择一个合适的C,一般来说,噪点比较多的时候,C需要小一些 |
multi_class | 负责多分类问题中分类策略制定,有 ovr 和 crammer_singer 两种参数值可选,默认值是ovr,ovr的分类原则是将待分类中的某一类当作正类,其他全部归为负类,通过这样求取得到每个类别作为正类时的正确率,取正确率最高的那个类别为正类;crammer_singer 是直接针对目标函数设置多个参数值,最后进行优化,得到不同类别的参数值大小 |
fit_intercept | 是否计算截距,与LR模型中的意思一致 |
class_weight | 与其他模型中参数含义一样,也是用来处理不平衡样本数据的,可以直接以字典的形式指定不同类别的权重,也可以使用balanced参数值。如果使用 balanced,则算法会自己计算权重,样本量少的类别所对应的样本权重会高,当然,如果你的样本类别分布没有明显的偏倚,则可以不管这个系数,选择默认的None |
verbose | 是否冗余,默认为False |
random_state | 随机种子的大小 |
max_iter | 最大迭代次数,默认为1000 |
惩罚系数
class sklearn.svm.NuSVC(self, nu=0.5, kernel='rbf', degree=3, gamma='auto_deprecated',
coef0=0.0, shrinking=True, probability=False, tol=1e-3,
cache_size=200, class_weight=None, verbose=False, max_iter=-1,
decision_function_shape='ovr', random_state=None)
参数 | 含义 |
---|---|
nu | 训练误差部分的上限和支持向量部分的下限,取值在 $(0,1)$ 之间,默认是 0.5,它和惩罚系数 $C$ 类似,都可以控制惩罚的力度 |
degree | 当核函数是多项式核函数(poly)的时候,用来控制函数的最高次数。(多项式核函数是将低维的输入空间映射到高维的特征空间),这个参数只对多项式核函数有用,是指多项式核函数的阶数 $n$。如果给的核函数参数是其他核函数,则会自动忽略该参数 |
gamma | 核函数系数,默认是 auto,即特征维度的倒数。核函数系数,只对rbf poly sigmoid 有效 |
coef0 | 核函数常数值 ($y = kx + b$ 的 b 值),只有 poly 和 sigmoid 函数有,默认值是0 |
max_iter | 最大迭代次数,默认值是 -1 ,即没有限制 |
probability | 是否使用概率估计,默认是 False |
decision_function_shape | 与 multi_class 参数含义类似,可以选择 ovo 或者 ovr(0.18版本默认是 ovo,0.19版本为 ovr) OvR(one vs rest)的思想很简单,无论你是多少元分类,我们都可以看做二元分类,具体的做法是,对于第K类的分类决策,我们把所有第K类的样本作为正例,除第K类样本以外的所有样本作为负类,然后在上面做二元分类,得到第K类的分类模型。 OvO(one vs one)则是每次在所有的T类样本里面选择两类样本出来,不妨记为T1类和T2类,把所有的输出为 T1 和 T2 的样本放在一起,把 T1作为正例,T2 作为负例,进行二元分类,得到模型参数,我们一共需要 T(T-1)/2 次分类。从上面描述可以看出,OvR 相对简单,但是分类效果略差(这里是指大多数样本分布情况,某些样本分布下OvR 可能更好),而 OvO 分类相对精确,但是分类速度没有 OvR 快,一般建议使用 OvO 以达到较好的分类效果 |
chache_size | 缓冲大小,用来限制计算量大小,默认是200M,如果机器内存大,推荐使用500MB甚至1000MB |
kernel | 核函数,核函数是用来将非线性问题转化为线性问题的一种方法,默认是 rbf 核函数 |
class sklearn.svm.SVC(self, C=1.0, kernel='rbf', degree=3, gamma='auto_deprecated',
coef0=0.0, shrinking=True, probability=False,
tol=1e-3, cache_size=200, class_weight=None,
verbose=False, max_iter=-1, decision_function_shape='ovr',
random_state=None)
class sklearn.svm.LinearSVR(self, epsilon=0.0, tol=1e-4, C=1.0,
loss='epsilon_insensitive', fit_intercept=True,
intercept_scaling=1., dual=True, verbose=0,
random_state=None, max_iter=1000)
参数 | 含义 |
---|---|
epsilon | 距离误差epsilon,即回归模型中的 epsilon,训练集中的样本需要满足: |
loss | 损失函数,有 hinge 和 squared_hinge 两种可选,前者又称为 L1 损失,后者称为 L2 损失,默认是 squared_hinge,其中 hinge 是 SVM 的标准损失,squared_hinge 是 hinge 的平方 |
dual | 是否转化为对偶问题求解,默认是True。这是一个布尔变量,控制是否使用对偶形式来优化算法 |
tol | 残差收敛条件,默认是0.0001,与LR中的一致 |
C | 惩罚系数,用来控制损失函数的惩罚系数,类似于LR中的正则化系数。默认为1,一般需要通过交叉验证来选择一个合适的C,一般来说,噪点比较多的时候,C需要小一些 |
fit_intercept | 是否计算截距,与LR模型中的意思一致 |
verbose | 是否冗余,默认为False |
random_state | 随机种子的大小 |
max_iter | 最大迭代次数,默认为1000 |
class sklearn.svm.NuSVR(self, nu=0.5, C=1.0, kernel='rbf', degree=3,
gamma='auto_deprecated', coef0=0.0, shrinking=True,
tol=1e-3, cache_size=200, verbose=False, max_iter=-1)
参数 | 含义 |
---|---|
nu | 训练误差部分的上限和支持向量部分的下限,取值在 (0,1) 之间,默认是 0.5,它和惩罚系数 $C$ 类似,都可以控制惩罚的力度 |
degree | 当核函数是多项式核函数(poly)的时候,用来控制函数的最高次数。(多项式核函数是将低维的输入空间映射到高维的特征空间),这个参数只对多项式核函数有用,是指多项式核函数的阶数 n。如果给的核函数参数是其他核函数,则会自动忽略该参数 |
gamma | 核函数系数,默认是 auto,即特征维度的倒数。核函数系数,只对 rbf poly sigmoid 有效 |
coef0 | 核函数常数值( $y = kx + b$ 的b值),只有 poly 和 sigmoid 函数有,默认值是0 |
chache_size | 缓冲大小,用来限制计算量大小,默认是200M,如果机器内存大,推荐使用500MB甚至1000MB |
kernel | 核函数,核函数是用来将非线性问题转化为线性问题的一种方法,默认是“rbf”核函数 |
class sklearn.svm.SVC(self, kernel='rbf', degree=3, gamma='auto_deprecated',
coef0=0.0, tol=1e-3, C=1.0, epsilon=0.1, shrinking=True,
cache_size=200, verbose=False, max_iter=-1)
函数 | 含义 |
---|---|
decision_function(x) | 获取数据集X到分离超平面的距离 |
fit(X , y) | 在数据集 $(X,y)$上使用 SVM 模型 |
get_params(deep) | 获取模型的参数 |
predict(X) | 预测数值型X的标签 |
score(X,y) | 返回给定测试集合对应标签的平均准确率 |
函数 | 含义 |
---|---|
support_ | 以数组的形式返回支持向量的索引 |
support_vectors_ | 返回支持向量 |
n_support_ | 每个类别支持向量的个数 |
dual_coef | 支持向量系数 |
coef_ | 每个特征系数(重要性),只有核函数是 LinearSVC 的是可用,叫权重参数,即 $w$ |
intercept_ | 截距值 (常数值),称为偏置参数,即 $b$ |
# import svm
from sklearn import svm
# train data: Feature List
train_data = ...
# test data: Feature List
test_data = ...
# label data: Label List
train_label = ...
# build classifier
predictor = svm.SVC(gamma='scale', C=1.0, decision_function_shape='ovr', kernel='poly',degree=4)
# train
predictor.fit(train_data, train_label)
# test
test_results = predictor.predict(test_data)