SVM概述
SVM简介
支持向量机(Support Vector Machine, SVM)是一种基于监督学习方法实现二元分类任务的广义线性分隔器,在训练过程中通过求解最大边距超平面来完成特征空间划分。其核心思想在于利用训练集中的关键点来确定超平面的位置和方向,并使所有关键点与之之间的间距达到最大值。
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'及预先计算好的核矩阵)。
linear:线性判别式模型(调节参数C的大小直接影响模型的表现;建议调节C以优化性能)。
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 。当对一个未知样本进行分类 时,最后得票最多的类别即为该未知样本的类别 。
详细讲解,可以参考这篇博客:
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()
模型参数设置
输出参数设置
模型评价指标
全部将其搞定都行啦的理由与打算,全部将其搞定都行啦的理由。
学习心得
在复现代码的过程中(原意为:会自己在复现代码的时候),需要将各个模型及其所有相关的参数都创建一个新的代码文件,并进行一次测试运行(原意为:将各种模型,及其参数都重新建立一个代码文件,运行一波)。同时不应仅局限于训练出各模型的结果(原意为:不要仅仅满足于将各种模型,训练出来就完成),还需对其他附加参数进行详细说明并确保与预期配置完全一致(原意为:还有其他附带的参数需要解释与完全匹配)。
