SVM简介

SVM简介

支持向量机(Support Vector Machine, SVM)是一类按监督学习(supervised learning)方式对数据进行二元分类(binary classification)的广义线性分类器(generalized linear classifier),其决策边界是对学习样本求解的最大边距超平面(maximum-margin hyperplane)。
SVM的基本思想是:找到集合边缘上的若干数据(称为支持向量(Support Vector)),用这些
点找出一个平面(称为决策面)
,使得支持向量到该平面的距离最大
(支持向量到该超平面得距离最大)

SVM参数意义

在SKlearn中封装各种机器学习库,其中就包含SVM算法,其流程如下:

import sklearn.svm as svm
model = svm.SVC(C=1.0,
 kernel='rbf', 
degree=3, 
gamma='auto',
 coef0=0.0, 
shrinking=True,
 probability=False,
tol=0.001, 
cache_size=200, c
lass_weight=None, 
verbose=False, 
max_iter=-1, 
decision_function_shape=None,
random_state=None)

参数说明:
C:SVC的惩罚参数,默认值是1.0;C越大,对误分类的惩罚增大,趋向于对训练集完全分对的情况,这样对训练集测试时准确率很高,但泛化能力弱。C值小,对误分类的惩罚减小,允许容错**,将他们当成噪声点,泛化能力较强**。
(当成噪声点,泛化能力较强)
关于松弛变量,我这边要解释下:
在大多数情况下,数据并不是完美的线性可分数据,可能会存在少量的点出现在分类超平面的另外一侧。我们希望尽量保证将这些点进行正确分类,同时又保证分类面与两类样本点有足够大的几何间隔。在这种情况下,我们为每一个样本点加上一个松弛变量,允许有小的误差存在。在加入松弛变量后,我们还要在目标函数中加入相应的惩罚参数C,对这个松弛变量起到一个监督克制的作用。两者的关系,有点类似道家的阴阳制衡的关系,此消彼长。

kernel: 核函数,默认时rbf:可以是**‘linear’, ‘poly’, ‘rbf’, ‘sigmoid’, ‘precomputed’
linear:线性分类器(C越大分类效果越好,但有
可能会过拟合**(default C=1))
poly:多项式分类器
rbf:高斯模型分类器(gamma值越小,分类界面越连续;gamma值越大,分类界面越“散”,分类效果越好,但有可能会过拟合。)
sigmoid:sigmoid核函数

degree: 多项式poly函数的维度,默认是3,选择其他核函数时会被忽略。
gamma: ‘rbf’,‘poly’ 和‘sigmoid’的核函数参数。默认是’auto’。 如果gamma是’auto’,那么实际系数是1 / n_features
cef0:核函数中得独立项,其只在poly和sigmoid中很重要。
probability :是否启用概率估计必须在调用fit之前启用它,并且会减慢该方法的速度。默认为False。
shrinking :是否采用shrinking heuristic方法(收缩启发式),默认为true
tol :停止训练的误差值大小,默认为1e-3
cache_size :核函数cache缓存大小,默认为200
class_weight :类别的权重,字典形式传递。设置第几类的参数C为weight*C(C-SVC中的C)
verbose :允许冗余输出
max_iter :最大迭代次数。-1为无限制
decision_function_shape :
‘ovo’, ‘ovr’ or None, default=ovr

关于ovo,ovr的解释:
一对多法(one-versus-rest,简称OVR SVMs):训练时依次把某个类别的样本归为一类,其他剩余的样本归为另一类,这样k个类别的样本就构造出了k个SVM分类时将未知样本分类为具有最大分类函数值的那类
一对一法(one-versus-one,简称OVO SVMs或者pairwise):其做法是在任意两类样本之间设计一个SVM,因此k个类别的样本就需要设计k(k-1)/2个SVM。当对一个未知样本进行分类时,最后得票最多的类别即为该未知样本的类别
详细讲解,可以参考这篇博客:https://blog.csdn.net/xfchen2/article/details/79621396
random_state :数据洗牌时的种子值,int值,default=None
在随机数据混洗时使用的伪随机数生成器的种子。 如果是int,则random_state是随机数生成器使用的种子; 如果是RandomState实例,则random_state是随机数生成器; 如果为None,则随机数生成器是np.random使用的RandomState实例
个人认为最重要的参数有**:C、kernel、degree、gamma、coef0、decision_function_shape**。

SVM中的接口调用

# 建立模型
model = svm.SVC(C=10, kernel='linear')

# 训练模型,x为训练集, y为标签
model.fit(x, y)

# 预测,test为测试集
pre_y = model.predict(test)

# 预测结果数据
n_Support_vector = clf.n_support_  # 支持向量个数
sv_idx = clf.support_  # 支持向量索引
Support_vector = clf.support_vectors_   # 支持向量
w = clf.coef_  # 权重矩阵W
b = clf.intercept_  # 偏置矩阵b

代码实现

import numpy as np
import joblib
from sklearn import svm
import matplotlib.pyplot as plt
x = [[1, 2], [4, 5], [18, 9], [12, 6], [2, 3], [13, 18]]
x = np.array(x)
y = [1, 1, 0, 0, 1, 0]
y = np.array(y)
# 训练模型
model = svm.SVC(C=10, kernel='linear')
model.fit(x, y)

# 预测
a = [[8, 6]]
a_pre = model.predict(a)
print("a_pre:", a_pre)
# 对应的支持向量
Support_vector = model.support_vectors_
print("Support_vector:", Support_vector)
# 线性分类对应的参数
w = model.coef_
print("w:", w)
b = model.intercept_
print("b:", b)
# 训练集散点图
plt.scatter(x[:, 0], x[:, 1])

if w[0, 1] != 0:
    xx = np.arange(0, 20, 0.1)
    # 最佳分类线
    yy = -w[0, 0]/w[0, 1] * xx - b/w[0, 1]
    plt.scatter(xx, yy, s=4)
    # 支持向量
    b1 = Support_vector[0, 1] + w[0, 0]/w[0, 1] * Support_vector[0, 0]
    b2 = Support_vector[1, 1] + w[0, 0]/w[0, 1] * Support_vector[1, 0]
    yy1 = -w[0, 0] / w[0, 1] * xx + b1
    plt.scatter(xx, yy1, s=4)
    yy2 = -w[0, 0] / w[0, 1] * xx + b2
    plt.scatter(xx, yy2, s=4)
else:
    xx = np.ones(100) * (-b) / w[0, 0]
    yy = np.arange(0, 10, 0.1)
    plt.scatter(xx, yy)
plt.show()

模型参数设置

输出参数设置

模型评价指标

全部将其搞定都行啦的理由与打算,全部将其搞定都行啦的理由。

学习心得

会自己在复现代码的时候,将各种模型,及其参数都重新建立一个代码文件,运行一波,不要仅仅满足于将各种模型,训练出来就完成,还有其他附带的参数需要解释与完全匹配。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

big_matster

您的鼓励,是给予我最大的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值