[Python][SVM][机器学习笔记]SVM的sklearn实现及技术细节
调库
import numpy as np
from sklearn.multiclass import OutputCodeClassifier
from sklearn.svm import LinearSVC
from sklearn.svm import SVC
from sklearn import svm, datasets
本文主要使用SVC,因为SVC较容易获得模型中的参数。
构造函数常用参数列表
C
:float, default=1.0
惩罚因子、正则化参数。
调大则模型对噪音的接受能力变小,对训练集可以更精确地拟合,但可能发生过拟合,称为硬边界;调小则模型对噪音的能力增大,对训练集的拟合效果变差,但更容易泛化,称为软边界。kernel
:{‘linear’, ‘poly’, ‘rbf’, ‘sigmoid’, ‘precomputed’} or callable, default=’rbf’
核函数类型
根据先验知识进行选择,如果问题比较线性可分则不需要使用核方法选linear,图像分类使用RBF,文字不适用RBF,具体问题具体分析,可以尝试不同的kernel,以实际准确度而定。degree
:int, default=3
使用多项式核函数的时候指定多项式的度,值越大则模型的容量越大,越容易发生过拟合gamma
:{‘scale’, ‘auto’} or float, default=’scale’
核系数\(\gamma\),使用rbf,poly和sigmoid的时候需要指定。默认参数scale时值为1 / (n_features * X.var()),指定为auto时值为1 / n_features。另外在rbf中\(\gamma = \frac{1}{2\sigma^2}\)。probability
:bool, default=False
若需要使用predict_porba(X)
方法则需要设为True。decision_function_shape
:{‘ovo’, ‘ovr’}, default=’ovr’
多分类策略,ovo是one vs one,svm分类器只能分类两种类别,ovr 是one vs rest,通过ovo实现多分类,具体过程可以看这篇博客。使用ovr时SVC分类器可以当作多分类来使用。
常用成员函数
decision_function(X)
计算decision_function的值
注意X是多个sample组成的列表,返回值是多个值组成的列表fit(X, y[, sample_weight])
拟合,训练
X是多个sample,Y是多个label,注意两者需一一对应predict(X)
给出分类结果predict_proba(X)
给出分类的概率分布
返回值是每个sample一个列表,列表表示概率分布score(X, y[, sample_weight])
测量精确度(预测正确样本数/总样本数)
线性SVM实例
源项目是使用ovo实现三分类,这块代码是把其中两类打包,然后进行二分类。
class_0_y_train = [1 if i==0 else 0 for i in self.Y_train]
class_0 = SVC(kernel = 'linear', C=1e5, decision_function_shape='ovo')
#C=1e5时可以认为是硬边界,若希望软边界则可以尝试小于1的值
class_0.fit(self.X_train, class_0_y_train)
predict_y_train = class_0.predict(self.X_train)
predict_y_test = class_0.predict(self.X_test)
多项式SVM实例
class_0_y_train = [1 if i==0 else 0 for i in self.Y_train]
class_0 = SVC(kernel = 'poly',degree=2, C=C, decision_function_shape='ovo')
class_0.fit(self.X_train, class_0_y_train)
predict_y_train = class_0.predict(self.X_train)
predict_y_test = class_0.predict(self.X_test)
rbf核SVM实例
class_0_y_train = [1 if i==0 else 0 for i in self.Y_train]
class_0 = SVC(kernel = 'rbf',gamma=0.5, C=C, decision_function_shape='ovo')
class_0.fit(self.X_train, class_0_y_train)
predict_y_train = class_0.predict(self.X_train)
predict_y_test = class_0.predict(self.X_test)
sigmoid核SVM实例
class_0_y_train = [1 if i==0 else 0 for i in self.Y_train]
class_0 = SVC(kernel = 'sigmoid',gamma='auto', C=C, decision_function_shape='ovo')
class_0.fit(self.X_train, class_0_y_train)
predict_y_train = class_0.predict(self.X_train)
predict_y_test = class_0.predict(self.X_test)
ovo实现三分类并计算合成的分类器的精确度
因为是我们手搓的三分类器,没有直接预测和计算精确度的函数,则按照ovr策略进行预测并统计错误次数。
df_train_0 = class_0.decision_function(self.X_train)
df_train_1 = class_1.decision_function(self.X_train)
df_train_2 = class_2.decision_function(self.X_train)
error_train = 0
for i in range(0,len(self.X_train)):
df_0 = df_train_0[i]
df_1 = df_train_1[i]
df_2 = df_train_2[i]
if df_0>df_1 and df_0 > df_2:
if self.Y_train[i] != 0:
error_train=error_train+1
if df_1>df_0 and df_1 > df_2:
if self.Y_train[i] != 1:
error_train=error_train+1
if df_2>df_1 and df_2 > df_0:
if self.Y_train[i] != 2:
error_train=error_train+1
train_loss = error_train/len(self.X_train)
参考资料
[1] https://scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.html