scikit-learn 笔记之支持向量机

说明

  支持向量机是一种经典的分类算法,其原理是找到一条决策边界使其距离两个最近的不同类别的点最远。对于线性可分的数据集,可以使用线性分类器进行分类,对于线性不可分函数,需要将数据集尝试通过函数变换映射到高维空间,利用核函数替代内积,求解最优 α \alpha α ,随后求出权重 w w w和截距 b b b,最终求得决策边界。

支持向量机

  在scikit-learn中SVC实现了支持向量机模型,可以用于二分类也可以用于多分类,支持线性和非线性,是比较常用到,对于大数据量的样本并不实用,并其原型为:

class sklearn.svm.SVC(*, C=1.0, kernel='rbf', degree=3, 
gamma='scale', 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', break_ties=False, 
random_state=None)

参数
C:浮点型,容错值,如果C越大,意味着对分类要求越严格。
kernel:默认值为rbf,选择核函数

  • ‘linear’:线性核 K ( x ⃗ , z ⃗ ) = x ⃗ ⋅ z ⃗ K(\vec{x},\vec{z})=\vec{x}\cdot \vec{z} K(x ,z )=x z
  • ‘poly’:多项式核 K ( x ⃗ , z ⃗ ) = γ ( ( x ⃗ ⋅ z ⃗ + 1 ) p K(\vec{x},\vec{z})=\gamma ((\vec{x}\cdot \vec{z}+1)^p K(x ,z )=γ((x z +1)p
  • ‘rbf’:高斯核函数 K ( x ⃗ , z ⃗ ) = e x p ( − γ ∣ ∣ x ⃗ ⋅ z ⃗ ∣ ∣ 2 ) K(\vec{x},\vec{z})=exp(-\gamma||\vec{x}\cdot \vec{z}||^2) K(x ,z )=exp(γx z 2)
  • ‘sigmoid’: K ( x ⃗ , z ⃗ ) = t a n h ( γ x ⃗ ⋅ z ⃗ + r ) K(\vec{x},\vec{z})=tanh(\gamma\vec{x}\cdot \vec{z}+r) K(x ,z )=tanh(γx z +r)
  • ‘precomputed’:提供一个可调用对象,它被用来从数据矩阵中预先计算核矩阵(n_samples, n_samples)
  • 注: γ \gamma γ为gamma参数, r r r为coef0参数

degree:一个整数,当kernel=‘rbf’时可以被使用,表示多项式的次数。
gamma:默认为‘scale’,核函数系数,当kernel为‘poly’、‘rbf’、‘sigmoid’时。

  • ‘scale’:其值为 1 / ( n _ f e a t u r e s ∗ X . v a r ( ) ) 1/(n\_features*X.var()) 1/(n_featuresX.var())
  • ‘auto’:其值为 1 / n _ f e a t u r e s 1/n\_features 1/n_features

coef0:浮点型,默认为0.0,核函数的自由项,只有在kernel为‘poly’、‘sigmoid’时才有意义。
shrinking:布尔值,默认为True,如果为True,则使用启发式收缩,这样在迭代次数比较大的情况下,可以缩短迭代时间。
probability:布尔值,默认为True,如果为True,则启动概率估计功能,必须在模型训练之前设置,因为训练时会使用5折交叉验证,会延长训练时长。
tol:浮点数,默认为1e-3,指定迭代的阈值。
cache_size:浮点数,默认为200,单位MB,指定核函数cache大小。
class_weight:字典或者字符串 ‘balanced’,默认为None,指定权重。

  • ‘None’:如果未给出,则权重为1
  • ‘字典’:如果是字典,则指定每个类的权重
  • ‘balanced’:如果是字符串balanced,每个类的权重是它类频率的反比, n _ s a m p l e s / ( n _ c l a s s e s ∗ n p . b i n c o u n t ( y ) ) n\_samples / (n\_classes * np.bincount(y)) n_samples/(n_classesnp.bincount(y))

verbose:布尔值,默认为False,如果为True,启动verbose输出,不能在多线程环境中运行。
max_iter:整数,默认为-1,指定最大迭代次数。
decision_function_shape:字符串,默认’ovr’,指定决策函数的形状。

  • ‘ovo’:使用one-vs-one (‘ovo’)准则,决策函数形状 ( n _ s a m p l e s , ( n _ c l a s s e s − 1 ) / 2 ) (n\_samples, (n\_classes-1)/2) (n_samples,(n_classes1)/2),每个分类定义了一个二分类SVM,由n_classes个二分类SVM组成一个多分类SVM
  • ‘ovr’:使用one-vs-rest(‘ovr’)准则,决策函数形状 ( n _ s a m p l e s , n _ c l a s s e s ) (n\_samples, n\_classes) (n_samples,n_classes),每个分类定义了一个二分类SVM,由n_classes个二分类SVM组成一个多分类SVM

break_ties:布尔值,默认为False,如果为True,决策准则为’ovr’且类别数量大于2,则决策函数的置信度将被打破。
random_state:一个帧数或者一个RandomState实例或者为None,默认为None。

  • 如果是整数:它指定了随机数生成器的种子。
  • 如果是RandomState:指定了一个随机数生成器。
  • 如果是None:使用默认的随机数生成器。

属性
class_weight:一个数组,形状为[n_classes],类别权重。
classes_:一个数组,形状为[n_classes],分类的标签值。
coef_:一个数组,形状为[n_classes*(n_classes-1)/2,n_classes],每个特征的系数,只有在线性核中有效。
dual_coef_:形状为[n_classes-1,n_SV],对偶问题中,在分类决策函数中每个支持向量机的系数。
fit_status_:一个整数,0表示正确拟合,否则为1。
intercept_:一个数组,形状为[n_classes*(n_classes-1)/2,],决策函数中的常数项。
support_:一个数组[n_SV],支持向量的下标。
support_vectors_:一个数组[n_SV,n_features],支持向量。
n_support_:一个数组[n_classes],每个分类的支持向量机的个数。
probA_:一个数组,形状为[n_classes*(n_classes-1)/2]
probB_:一个数组,形状为[n_classes*(n_classes-1)/2]

  • 如果参数probability为False,则probA_和probB_的值为空,如果probability为True,进行概率估计。

shape_fit_:一个维度元组,显示训练数据的维度。

实例方法
decision_function(X):预测样本的置信分数。
fit(X,y):训练模型。
get_params([deep]):获取模型参数信息。
predict(X):用模型进行预测,返回预测值。
score(X, y[, sample_weight]):返回模型的预测性能得分。
set_params(**params):设置模型参数。

示例

import matplotlib
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings('ignore')
from sklearn import datasets
from sklearn.svm import SVC
import pandas as pd
import numpy as np

 读取数据
data = datasets.load_iris().data
target = datasets.load_iris().target
# 这里只取两个特征,两个类别便于画图
X = data[:,(2,3)]
X0 = np.insert(X,2,values=target,axis=1)
dataset = pd.DataFrame(X0,columns=['x0','x1','y'])
dataset = dataset[dataset['y']!=2]
# 训练预测
clf = SVC(kernel='linear',C=float('inf'),probability=True)
clf.fit(dataset[['x0','x1']],dataset['y'])
clf_pred = clf.predict(dataset[['x0','x1']])
# 输出参数
x0 = np.linspace(0, 5.5, 200)
w = clf.coef_[0]
b = clf.intercept_[0]
boundry_line = -b/w[1] -w[0]/w[1]*x0
support = clf.support_vectors_
# 边界
margine = 1/w[1]
margine_high = boundry_line + margine
margine_low  = boundry_line - margine
# 画图
plt.figure(figsize=(8,5))
plt.xlim(0,5)
plt.ylim(0,2)
plt.plot(dataset['x0'][dataset['y']==0],dataset['x1'][dataset['y']==0],'ro')
plt.plot(dataset['x0'][dataset['y']==1],dataset['x1'][dataset['y']==1],'bo')
plt.plot(x0,boundry_line,'b',linewidth=2)
plt.plot(x0,margine_high,'b--',linewidth=2)
plt.plot(x0,margine_low,'b--',linewidth=2)
plt.scatter(support[:,0],support[:,1],s=180,facecolors='#7f7f7f')
plt.show()

在这里插入图片描述

python代码

git地址:https://github.com/lingxiaaisuixin/MarchineLearning/tree/master/SVM
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值