机器学习之支持向量机

支持向量机模型

  支持向量机(support vector machines, SVM)是一种二分类模型,它的基本模型是定义在特征空间上的间隔最大的线性分类器,间隔最大使它有别于感知机;SVM还包括核技巧,这使它成为实质上的非线性分类器。SVM的的学习策略就是间隔最大化,可形式化为一个求解凸二次规划的问题,也等价于正则化的合页损失函数的最小化问题。SVM的的学习算法就是求解凸二次规划的最优化算法。

SVM之sklearn实现

线性SVM模型:

from sklearn.svm import LinearSVC
LinearSVC(penalty='l2' ,
          c=1.0 ,
          loss='squared_hige' ,
          fit_intercept=True ,
          class_weight=None ,
          max_iter=1000 ,
          tol=0.0001 ,
          multi_class='ovr' ,
          dual=True ,
          intercept_scaling=1) 

参数:

  pemalty:指定似然函数中加入正则化项,默认为l2,表示添加L2正则项,也可以使用l1,表示添加L1正则项

  c:指定正则项的权重,是正则化项惩罚系数的倒数,所以c越小,正则化惩罚项就越大

  loss:选择损失函数,可以选择Hinge(合页损失函数)或者squared_hinge(合页损失函数的平方),默认为squared_hinge

  fit_intercept:选择是否计算偏置常数b,默认为True ,表示计算

  class_weight:指定各类别的权重,默认为None,当样本很不均衡时使用balanced

  max_iter:设定最大迭代次数,默认为100次

  tol:设定判断迭代收斂函数,默认为0.0001

  multi_class:指定多分类的策略,默认为ovr ,表示采用one-vs-rest,一对其他策略。选择multinomial ,表示直接采用多项Logistic回归策略

  dual:选择是否采用对偶方式求解,默认为False。只有penalty = ‘l2‘ 且solver = ‘liblinear’时才存在对偶形式

  intercept_scaling:该参数默认为1

属性:

  coef_:用于输出线性回归模型的权重向量w

  intercept_:用于输出线性回归模型的偏置常数b

方法:

  fit(X_train ,y_train):进行模型训练

  score(X_test ,y_test):返回模型在测试集上的预测准确率

  predict(X):用训练好的模型来预测待预测数据集X,返回数据为预测集对应的预测结果yˆ

非线性SVM模型:

 

from sklearn.svm import SVC
SVC(c=1.0 ,
    kernel='rbf' ,
    degree=3 ,
    gamma='auto' ,
    coef0=0.0 ,
    tol=0.0001 ,
    class_weight=None ,
    max_iter=-1)

参数:

  c:指定正则项的权重,是正则化项惩罚系数的倒数,所以c越小,正则化惩罚项就越大

  kernel:指定核函数类型,选项:linear:线性核函数,poly:多项式核函数,rbf:高斯核函数,Sigmoid:多层感知机核函数,precomputed:表示已经提供一个kernel矩阵

  degree:当核函数是多项式函数时,指定p值,默认为3

  class_weight:指定各类别的权重,默认为None,当样本很不均衡时使用balanced

  gamma:指定多项式核函数或高斯核函数的系数,当选择其他核函数时,忽略该系数,默认为auto

  max_iter:设定最大迭代次数,默认为100次

  tol:设定判断迭代收斂函数,默认为0.0001

  coef0:当核函数是poly或Sigmoid时,指定其r值,默认为0

属性:

  coef_:用于输出线性回归模型的权重向量w

  intercept_:用于输出线性回归模型的偏置常数b

  support_:支持向量的下标

  support_vectors_:支持向量

  n_support_:每一个分类的支持向量的个数

方法:

  fit(X_train ,y_train):进行模型训练

  score(X_test ,y_test):返回模型在测试集上的预测准确率

  predict(X):用训练好的模型来预测待预测数据集X,返回数据为预测集对应的预测结果yˆ

  predict_proba(X):返回一个数组,数组元素依次为预测集X属于各个类别的概率

  predict_log_proba(X):返回一个数组,数组的元素依次是预测集X属于各个类别的对数概率

svm模型案例

from sklearn.datasets import make_circles
from sklearn.preprocessing import StandardScaler
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
import numpy as np
from sklearn.svm import SVC

X ,y = make_circles(noise=0.2 ,factor=0.5 ,random_state=1)
X = StandardScaler().fit_transform(X)

x_min ,x_max = X[: ,0].min() - 1 ,X[: ,0].max() + 1
y_min ,y_max = X[: ,1].min() - 1 ,X[: ,1].max() + 1
xx ,yy = np.meshgrid(np.arange(x_min ,x_max ,0.02),np.arange(y_min ,y_max ,0.02))

C = 5
gamma = 0.1
clf = SVC(C=C ,gamma = gamma)
clf.fit(X ,y)

z = clf.predict(np.c_[xx.ravel() ,yy.ravel()])

原始数据图例:

cm = plt.cm.RdBu
cm_bright = ListedColormap(['#FFFFFF' ,'#0000FF'])
ax = plt.subplot()
ax.set_title('input data')
ax.scatter(X[: ,0] ,X[: ,1] ,c = y ,cmap = cm_bright)
ax.set_xticks(())
ax.set_yticks(())
plt.tight_layout()
plt.show()

 

 模型图例:

z = z.reshape(xx.shape)
plt.subplot()
plt.contourf(xx ,yy ,z ,cmap = plt.cm.coolwarm ,alpha = 0.9)
plt.scatter(X[: ,0] ,X[: ,1] ,c = y ,cmap= cm_bright)
plt.xlim(xx.min() ,xx.max())
plt.ylim(yy.min() ,yy.max())
plt.xticks(())
plt.yticks(())
plt.xlabel("C=" + str(C) + "gamma=" + str(gamma))
plt.show()

SVM之小结 

1、优点:

  1、SVM具有较好的泛化能力,特别是在小样本训练集上能够得到比其他算法好很多的结果,因为其优化目标是结构风险最小,而不是经验风险最小,通过margin的概念,可以得到对数据分布的结构化描述,从而降低对数据规模和数据分布的要求。

  2、SVM具有较强的数学理论支撑,基本不涉及概率预测度和大数定律等。

  3、引入核函数后可以解决非线性分类问题。

2、缺点:

  1、不方便解决多分类问题,经典的SVM模型只给出了二分类算法。

  2、SVM模型存在两个对结果影响超大的参数,比如采用rbf核函数时,超函数惩罚项系数c和核函数参数gamma是无法通过概率的方法进行计算的,只能通过穷举遍历的方式或者根据以往经验推测获得,导致其复杂度比一般的线性分类器要高。

3、SVM与logistic异同点:

  1、SVM模型和LR模型都是监督模型算法,都属于判别模型。

  2、如果不考虑核函数,二者都是线性分类问题。

  3、构造原理不同:LR模型使用Sigmoid函数来映射出属于某一类别的概率,然后构造log损失,通过极大似然估计来求解模型参数的值;SVM模型使用函数间隔最大化来寻找最优超平面,对应的是Hinge损失。

  4、SVM与LR学习时考虑的样本不同:LR模型学习过程中会使用全量的训练集样本数据;而SVM模型学习过程中只使用支持向量点,即只考虑离分割超平面在一定范围的样本点。

  5、SVM模型通过引入核函数的方法,可以解决非线性问题,而LR模型一般没有核函数的概念。

  6、SVM模型中自带正则化项,与LR模型相比,更不容易发生过拟合。

posted @ 2020-12-10 15:19  17孤独的牧羊人  阅读(165)  评论(0编辑  收藏  举报