机器学习实战第二版---第四节:支持向量机SVM

SVM

  • 前言--使用SVM一般套路
  • 线性SVM
  • 非线性SVM
  • SVM回归

前言–使用SVM一般套路

svm是在机器神经网络没有火之前,永远嘀神,对于svm的使用只要按照以下手法:
#使用svm一般套路:先线性核函数-》如果训练集不大试一试RBF-》还可以使用交叉验证和网格搜索尝试其他核函数
‘’’
有这么多的核函数,该如何决定使用哪一个呢?有一个经验法则是,永远先从线性核函数开始尝试(要记住,LinearSVC比SVC(kernel=“linear”)快得多),特别是训练集非常大或特征非常多的时候。如果训练集不太大,你可以试试高斯RBF核,大多数情况下它都非常好用。如果你还有多余的时间和计算能力,可以使用交叉验证和网格搜索来尝试一些其他的核函数,特别是那些专门针对你的数据集数据结构的核函数。

‘’’

线性SVM

iris = datasets.load_iris()
X = iris["data"][:, (2, 3)] # petal length, petal width
y = (iris["target"] == 2).astype(np.float64) # Iris virginica

'''
pipeline:每一步都用元组( ‘名称’,步骤)来表示。现在来创建流水线。
流水线的功能:
跟踪记录各步骤的操作(以方便地重现实验结果)
对各步骤进行一个封装
确保代码的复杂程度不至于超出掌控范围
'''
#线性svm
svm_clf = Pipeline([
 ("scaler", StandardScaler()),
 ("linear_svc", LinearSVC(C=1, loss="hinge")),
 ])
svm_clf.fit(X, y)
# print(svm_clf.predict([[5.5, 1.7]]))
#或者不掉库用SVC(kernel='linear',C=1)  SGDC(loss='hinge',alpha=1/(m*C))

非线性SVM

1.构造多项式特征
2.核函数:多项式内核

'''
非线性SVM分类:添加多项式项,使得可以分割非线性
使用卫星数据
PolynomialFeatures构造多项式特征
'''
X, y = make_moons(n_samples=100, noise=0.15)
polynomial_svm_clf = Pipeline([
 ("poly_features", PolynomialFeatures(degree=3)),("scaler", StandardScaler()),
 ("svm_clf", LinearSVC(C=10, loss="hinge"))#c惩罚参数
 ])
polynomial_svm_clf.fit(X, y)

'''
SVC:
C:惩罚参数:
默认值为1,惩罚参数是由于松弛变量而加入的,它表征的是对错误分类的惩罚程度,也就是不允许分类出错的程度。C越大,表明越不允许分类出错,但是C越大越可能过拟合。C太小的话趋于0的话,分类将不会关注分类是否正确的问题,只要求间隔 越大越好,此时分类也没有意义。

Kernel:核函数:

作用:核函数的引入是为了解决线性不可分的问题,讲分类点映射的高维空间中以后,转化为可线性分割的问题

kernel=‘linear’时,为线性核,C越大分类效果越好,但可能会过拟合;
kernel='rbf'时,为高斯核,gamma值越小,分类界面越连续;gamma值越大,分类界面越“散”,分类效果越好,但可能会过拟合;
kernel='poly':多项式核
kernel=sigmoid’:Sigmoid核函数 
kernel=‘precomputed’:核矩阵
decision_function_shape参数:

decision_function_shape='ovr'时,为one v rest,即一个类别与其他ov类别进行划分;
decision_function_shape='ovo'时,为one v one,即将类别两两进行划分,用二分类的方法模拟多分类的结果;
degree 参数
               多项式poly函数的维度,默认是3,选择其他核函数时会被忽略
gamma 参数
              ‘rbf’,‘poly’ 和‘sigmoid’的核函数参数。默认是’auto’,则会选择1/n_features
coef0参数

          核函数的常数项。对于‘poly’和‘sigmoid’有用

probability参数
              是否采用概率估计?默认为False
shrinking参数
          是否采用shirinking heuristic方法,默认为true
tol参数
        停止训练的误差值大小,默认为1e-3
cache_size参数
          核函数cache缓存大小,默认为200
class_weight参数
        类别的权重,字典形式传递,设置第几类的参数C为weight*C(C-SVC中的C)
verbose参数
        允许冗余输出
max_iter参数
         最大迭代册数,-1为无限制
random_state参数
      数据洗牌时的种子值,int值

'''
#多项式内核

poly_kernel_svm_clf = Pipeline([
 ("scaler", StandardScaler()),
 ("svm_clf", SVC(kernel="poly", degree=3, coef0=1, C=5))
 ])
poly_kernel_svm_clf.fit(X, y)
#使用网格搜索可以提取完美超惨
'''
相似性 特征:解决非线性问题的另一种技术是添加相似特征,这些特征经过相似
函数计算得出,相似函数可以测量每个实例与一个特定地标之间的相似
度。
'''

#使用相似特征提取---高斯RBF内核
rbf_kernel_svm_clf = Pipeline([
 ("scaler", StandardScaler()),
 ("svm_clf", SVC(kernel="rbf", gamma=5, C=0.001))
 ])
'''
增加gamma值会使钟形曲线变得更窄(见图5-
8的左图),因此每个实例的影响范围随之变小:决策边界变得更不规
则,开始围着单个实例绕弯。反过来,减小gamma值使钟形曲线变得更
宽,因而每个实例的影响范围增大,决策边界变得更平坦。所以γ就像
是一个正则化的超参数:模型过拟合,就降低它的值,如果欠拟合则提
升它的值(类似超参数C)。
'''
rbf_kernel_svm_clf.fit(X, y)

SVM回归

'''
SVM回归:尽可能让更多的实例位于街道上,同时限制间隔违厘数
'''

svm_poly_reg = SVR(kernel="poly", degree=2, C=100, epsilon=0.1)
svm_poly_reg.fit(X, y)

全部代码:

'''
SVM:可以理解为在类之间拟合可能的最宽街道,也称大间隔分类
街道以外的实例不会对分类造成影响,而完全由位于街道边缘的实例所决定(支持向量)

'''
#硬间隔:所有的实例都不在街道上并且在正确分类的一边,很难拿捏
#软间隔:目标尽可能在保持街道宽度和(实例位于间隔上,甚至是错误的一遍)寻找平衡

import numpy as np
from sklearn import datasets
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import LinearSVC
from sklearn.datasets import make_moons
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import PolynomialFeatures
from sklearn.svm import SVC
from sklearn.svm import SVR
#使用svm一般套路:先线性核函数-》如果训练集不大试一试RBF-》还可以使用交叉验证和网格搜索尝试其他核函数
'''
有这么多的核函数,该如何决定使用哪一个呢?有一个经验法
则是,永远先从线性核函数开始尝试(要记住,LinearSVC比
SVC(kernel="linear")快得多),特别是训练集非常大或特征非常多
的时候。如果训练集不太大,你可以试试高斯RBF核,大多数情况下它
都非常好用。如果你还有多余的时间和计算能力,可以使用交叉验证和
网格搜索来尝试一些其他的核函数,特别是那些专门针对你的数据集数
据结构的核函数。

'''
iris = datasets.load_iris()
X = iris["data"][:, (2, 3)] # petal length, petal width
y = (iris["target"] == 2).astype(np.float64) # Iris virginica

'''
pipeline:每一步都用元组( ‘名称’,步骤)来表示。现在来创建流水线。
流水线的功能:
跟踪记录各步骤的操作(以方便地重现实验结果)
对各步骤进行一个封装
确保代码的复杂程度不至于超出掌控范围
'''
#线性svm
svm_clf = Pipeline([
 ("scaler", StandardScaler()),
 ("linear_svc", LinearSVC(C=1, loss="hinge")),
 ])
svm_clf.fit(X, y)
# print(svm_clf.predict([[5.5, 1.7]]))
#或者不掉库用SVC(kernel='linear',C=1)  SGDC(loss='hinge',alpha=1/(m*C))

'''
非线性SVM分类:添加多项式项,使得可以分割非线性
使用卫星数据
PolynomialFeatures构造多项式特征
'''
X, y = make_moons(n_samples=100, noise=0.15)
polynomial_svm_clf = Pipeline([
 ("poly_features", PolynomialFeatures(degree=3)),("scaler", StandardScaler()),
 ("svm_clf", LinearSVC(C=10, loss="hinge"))#c惩罚参数
 ])
polynomial_svm_clf.fit(X, y)

'''
SVC:
C:惩罚参数:
默认值为1,惩罚参数是由于松弛变量而加入的,它表征的是对错误分类的惩罚程度,也就是不允许分类出错的程度。C越大,表明越不允许分类出错,但是C越大越可能过拟合。C太小的话趋于0的话,分类将不会关注分类是否正确的问题,只要求间隔 越大越好,此时分类也没有意义。

Kernel:核函数:

作用:核函数的引入是为了解决线性不可分的问题,讲分类点映射的高维空间中以后,转化为可线性分割的问题

kernel=‘linear’时,为线性核,C越大分类效果越好,但可能会过拟合;
kernel='rbf'时,为高斯核,gamma值越小,分类界面越连续;gamma值越大,分类界面越“散”,分类效果越好,但可能会过拟合;
kernel='poly':多项式核
kernel=sigmoid’:Sigmoid核函数 
kernel=‘precomputed’:核矩阵
decision_function_shape参数:

decision_function_shape='ovr'时,为one v rest,即一个类别与其他ov类别进行划分;
decision_function_shape='ovo'时,为one v one,即将类别两两进行划分,用二分类的方法模拟多分类的结果;
degree 参数
               多项式poly函数的维度,默认是3,选择其他核函数时会被忽略
gamma 参数
              ‘rbf’,‘poly’ 和‘sigmoid’的核函数参数。默认是’auto’,则会选择1/n_features
coef0参数

          核函数的常数项。对于‘poly’和‘sigmoid’有用

probability参数
              是否采用概率估计?默认为False
shrinking参数
          是否采用shirinking heuristic方法,默认为true
tol参数
        停止训练的误差值大小,默认为1e-3
cache_size参数
          核函数cache缓存大小,默认为200
class_weight参数
        类别的权重,字典形式传递,设置第几类的参数C为weight*C(C-SVC中的C)
verbose参数
        允许冗余输出
max_iter参数
         最大迭代册数,-1为无限制
random_state参数
      数据洗牌时的种子值,int值

'''
#多项式内核

poly_kernel_svm_clf = Pipeline([
 ("scaler", StandardScaler()),
 ("svm_clf", SVC(kernel="poly", degree=3, coef0=1, C=5))
 ])
poly_kernel_svm_clf.fit(X, y)
#使用网格搜索可以提取完美超惨
'''
相似性 特征:解决非线性问题的另一种技术是添加相似特征,这些特征经过相似
函数计算得出,相似函数可以测量每个实例与一个特定地标之间的相似
度。
'''

#使用相似特征提取---高斯RBF内核
rbf_kernel_svm_clf = Pipeline([
 ("scaler", StandardScaler()),
 ("svm_clf", SVC(kernel="rbf", gamma=5, C=0.001))
 ])
'''
增加gamma值会使钟形曲线变得更窄(见图5-
8的左图),因此每个实例的影响范围随之变小:决策边界变得更不规
则,开始围着单个实例绕弯。反过来,减小gamma值使钟形曲线变得更
宽,因而每个实例的影响范围增大,决策边界变得更平坦。所以γ就像
是一个正则化的超参数:模型过拟合,就降低它的值,如果欠拟合则提
升它的值(类似超参数C)。
'''
rbf_kernel_svm_clf.fit(X, y)

'''
SVM回归:尽可能让更多的实例位于街道上,同时限制间隔违厘数
'''

svm_poly_reg = SVR(kernel="poly", degree=2, C=100, epsilon=0.1)
svm_poly_reg.fit(X, y)

你可能感兴趣的:(python,机器学习)