[数据挖掘之scikit-learn] sklean.svm 分类器实例详解

文章目录

      • 概述
      • 1. sklearn.svm分类器
        • 1.1 sklearn.svm.SVC
        • 1.2 sklearn.svm.NuSVC
        • 1.3 sklearn.svm.LinearSVC
        • 1.4 SVC实例

概述

支持向量机(Support Vector Machine)是一种建立在统计学VC维和结构风险最小化原则下的监督学习机制,既可用于分类,也可用于回归和异常值检测。
SVM分类的理论基础及Python代码详见我的《小瓜讲机器学习——分类算法(二)支持向量机(SVM)算法原理详解》。
这里只对scikit-learn中的svm分类器做介绍和实践。

1. sklearn.svm分类器

sklearn库中的svm包是基于国立台湾大学林智仁(Lin Chih-Jen)教授团队开发的libsvm和linearsvm开源库开发的支持向量机包,里面包含多种支持向量机模型,如下表所示

模型/estimators 说明
svm.LinearSVC 线性支持向量机分类器
svm.LinearSVR 线性支持向量机回归模型
svm.NuSVC 支持向量机分类器
svm.NuSVR 支持向量机回归模型
svm.OneClassSVM 异常值检测
svm.SVC 支持向量机分类器
svm.SVR 支持向量机回归模型
svm.l1_min_c

1.1 sklearn.svm.SVC

支持向量机SVC是一种多分类器,帮助可查sklearn.svm.SVC,格式如下

sklearn.svm.SVC(C=1.0, kernel=’rbf’, degree=3, gamma=’auto_deprecated’, coef0=0.0, shrinking=True, 
						probability=False, tol=0.001, cache_size=200, class_weight=None, verbose=False, 
						max_iter=-1, decision_function_shape=’ovr’, random_state=None)

参数说明:

  1. C (default=1.0):惩罚因子,即是SVM优化目标 ( 1 2 ∣ ∣ w ∣ ∣ 2 + C ∑ ξ i ) (\frac{1}{2}||w||^2+C\sum \xi_i) (21w2+Cξi)中的松弛变量的系数,C值越大,对误分类的容错变小,过大的C值容易过拟合,C值越小,对误分类的容错变大,过小的C值容易欠拟合;
  2. kernel (default=‘rbf’):核函数选择,可选值:'linear’线性核函数, 'poly’多项式核函数, 'sigmoid’双曲正切核函数,‘rbf’高斯核函数, ‘precomputed’;
    • ‘poly’核函数: K ( x i , x j ) = ( γ x i T ∙ x j + r ) p K(x_i,x_j)=(\gamma x_i^T\bull x_j+r)^p K(xi,xj)=(γxiTxj+r)p
    1. ‘rbf’核函数: K ( x i , x j ) = exp ⁡ ( − γ ∣ ∣ x i − x j ∣ ∣ 2 ) K(x_i,x_j)=\exp (-\gamma ||x_i-x_j||^2) K(xi,xj)=exp(γxixj2)
    2. 'sigmoid’核函数: K ( x i , x j ) = tanh ⁡ ( γ x i T x j + r ) K(x_i,x_j)=\tanh (\gamma x_i^Tx_j+r) K(xi,xj)=tanh(γxiTxj+r)
    3. 'linear’核函数: K ( x i , x j ) = x i T x j K(x_i,x_j)=x_i^Tx_j K(xi,xj)=xiTxj
  3. degree(default=3):多项式核函数阶数,只对‘poly’有效;
  4. gamma(default=‘auto’):‘rbf’、‘poly’、'sigmoid’核函数的参数 γ \gamma γ
  5. coef0(default=0.0):核函数中的常量 r r r,仅对‘poly’和‘sigmoid’有用;
  6. shrinking(default=True):是否进行启发式;
  7. probability(default=False):概率估计;
  8. tol(default=1e-3):迭代终止精度;
  9. cache_size:核函数的缓存空间;
  10. class_weight:类别权重,主要针对不同类别中样本数不平衡的情况;
  11. verbose(default=False):是否将训练的过程详细输出;
  12. max_iter(default=-1):最大迭代次数,默认-1是无限制的意思;
  13. decision_function_shape(default=‘ovr’):SVM是二分类的方法,扩展到多分类情况下需要一定的策略,包含‘ovo’、‘ovr’,默认为’ovr’;
  14. random_state(default=None):将样本顺序随机化,更有利于训练模型。

属性:

  1. support_:支持向量的索引值;
  2. support_vectors:支持向量;
  3. n_support_:支持向量数;
  4. dual_coef_:决策函数中支持向量的系数,其实就是式 f ( x ) = ∑ α i y i K ( x , x i ) + b f(x)=\sum \alpha_iy_iK(x,x_i)+b f(x)=αiyiK(x,xi)+b其中的 α i y i \alpha_iy_i αiyi
  5. coef_:决策函数decision function特征系数参数(仅线性核函数);
  6. intercept_:决策函数常量参数(截距);
  7. fit_status_:拟合程度,0代表正确拟合,1代表非正确;
  8. probA_,probB_:Platt的概率估计参数。

1.2 sklearn.svm.NuSVC

支持向量机NuSVC是一种多分类器,帮助可查sklearn.svm.NuSVC,格式如下

sklearn.svm.SVC(nu=0.5, kernel=’rbf’, degree=3, gamma=’auto_deprecated’, coef0=0.0, shrinking=True, 
					probability=False, tol=0.001, cache_size=200, class_weight=None, verbose=False, 
					max_iter=-1, decision_function_shape=’ovr’, random_state=None)

参数说明:与SVC不同的点是将惩罚系数C换了nu,其他都一样。
属性说明:属性与SVC前六点一样,第7和8两项NuSVC没有

1.3 sklearn.svm.LinearSVC

支持向量机LinearSVC是一种多分类器,帮助可查sklearn.svm.LinearSVC,格式如下

sklearn.svm.LinearSVC(penalty=’l2’, loss=’squared_hinge’, dual=True, tol=0.0001, C=1.0, multi_class=’ovr’, 
							fit_intercept=True, intercept_scaling=1, class_weight=None, verbose=0,
							 random_state=None, max_iter=1000)

参数说明:

  1. penalty(default=‘l2’):正则化参数,L1和L2两种参数可选,仅LinearSVC有;
  2. loss(default=‘squared_hinge’):损失函数,可选值’hinge’和’squared_hinge’;
  3. dual(default=True):是否转化为对偶问题求解;
  4. tol(default=1e-4):迭代终止精度;
  5. C(default=1):惩罚因子,即是SVM优化目标 ( 1 2 ∣ ∣ w ∣ ∣ 2 + C ∑ ξ i ) (\frac{1}{2}||w||^2+C\sum \xi_i) (21w2+Cξi)中的松弛变量的系数,C值越大,对误分类的容错变小,过大的C值容易过拟合,C值越小,对误分类的容错变大,过小的C值容易欠拟合;
  6. multi_class(default=‘ovr’):多分类策略,包含‘ovo’、‘ovr’、‘None’,默认为’ovr’;
  7. fit_intercept:是否计算截距;
  8. intercept_scaling:当self.fit_intercept为True时,实例向量x变为[x,self.intercept_scaling],即具有等于intercept_scaling的常量值的“合成”特征被附加到实例向量。 截距变为intercept_scaling *合成特征权重注意! 合成特征权重与所有其他特征一样经受l1 / l2正则化。 为了减小正则化对合成特征权重(并因此对截距)的影响,必须增加intercept_scaling(原文链接:https://blog.csdn.net/ustbclearwang/article/details/81236732)
  9. class_weight:类别权重,主要针对不同类别中样本数不平衡的情况;
  10. verbose(default=0):是否将训练的过程详细输出;
  11. random_state(default=None):将样本顺序随机化,更有利于训练模型;
  12. max_iter(default=1000):最大迭代次数。

属性说明:

  1. coef_:决策函数decision function特征系数参数(仅线性核函数);
  2. intercept_:决策函数常量参数(截距);

1.4 SVC实例

训练样本为

4.45925637575900	8.22541838354701	-1
0.0432761720122110	6.30740040001402	-1
6.99716180262699	9.31339338579386	-1
4.75483224215432	9.26037784240288	-1
...
4.15244831176753	1.44597290703838	1
9.55986996363196	1.13832040773527	1
1.63276516895206	0.446783742774178	1
9.38532498107474	0.913169554364942	1

训练过程如下

import numpy as np
import pandas as pd
from sklearn.svm import SVC
import matplotlib.pyplot as plt

def dataplot(data, label):

    data1 = data[label.label==-1]
    data2 = data[label.label==1]

    plt.scatter(data1.x, data1.y, c='red')
    plt.scatter(data2.x, data2.y, c='blue')
    #plt.show()

if __name__=='__main__':

    with open(r'h:\python dataanalysis\sklearn\svm_train_data.txt') as f:
        data = []
        label = []
        for loopi in f.readlines():
            line = loopi.strip().split('\t')
            data.append([float(line[0]),float(line[1])])
            label.append(float(line[2]))
        feature_x = np.array(data)
        label_y = np.array(label)

        datax = pd.DataFrame(data, columns=['x','y'])
        labely = pd.DataFrame(label, columns=['label'])

    clf = SVC(C=0.5,kernel='linear')
    clf.fit(feature_x, label_y)
    print('----support vector indice----')
    print(clf.support_)
    print('------ support vector ------')
    print(clf.support_vectors_)
    print('------- coef of feacture -------')
    print(clf.coef_)
    print('--------- intercept_ -------')
    print(clf.intercept_)
    print('--------- n_support_ -------')
    print(clf.n_support_)

    x = np.array([0, 10])
    y = -1/clf.coef_[0,1] * (clf.coef_[0,0] * x + clf.intercept_)

	dataplot(datax, labely)
    plt.plot(x,y)
    plt.show()

可以得到训练的线性支持向量机模型

----support vector indice----
[ 46  62 127 139]
------ support vector ------
[[4.14342744 5.21158368]
 [5.47187479 6.52268275]
 [9.41511021 8.19137839]
 [1.29475743 0.24866204]]
------- coef of feacture -------
[[ 0.89370539 -0.91378603]]
--------- intercept_ -------
[0.07033913]
--------- n_support_ -------
[2 2]

画成图,可以见到蓝色线即是训练得到的分割超平面,两边为正实例和负实例。
[数据挖掘之scikit-learn] sklean.svm 分类器实例详解_第1张图片

你可能感兴趣的:(Python数据分析,Python,机器学习,SVM,SVC,sklearn)