[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

posted @ 2022-04-04 22:32  溡沭  阅读(375)  评论(0编辑  收藏  举报