• [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

  • 相关阅读:
    set转成toarray()
    list和set的拉拉扯扯的关系
    【转载】VNC和远程桌面的区别
    笔记本最小安装centos7 连接WiFi的方法
    mysql 索引优化 性能调优 锁
    PageHelper 自动去掉排序参数问题
    抽奖算法 百万次抽奖 单线程环境下 约 3.5 秒
    gitlab 安装和使用
    sharding sphere 分表分库 读写分离
    mycat 安装 分表 分库 读写分离
  • 原文地址:https://www.cnblogs.com/sherrlock/p/16100847.html
Copyright © 2020-2023  润新知