Python机器学习笔记(4)—SVM支持向量机器—SVC

一、内容

1,算法原理
2,数据模型建立

二、算法原理

支持向量机(SVM)是个强大且有多功能的模型,能够做线性或者非线性的分类、回归、甚至异常检测,是机器学习中最为流行的模型之一,比较适合复杂但中小规模数据集的分类问题;
SVM分类器的判定边界实线,不仅分开了两种类型,而且还尽可能地远离了最靠近的训练数据点。

如果我们添加更多的样本点在“街道”外并不会影响到判定边界,因为判定边界是由位于“街道”边缘的样本点确定的,这些样本点被称为“支持向量”;

2.1 间隔

(1) 硬间隔分类,如果严格的规定所有的数据都不在“街道”上,都在正确的两边,称为硬间隔分类,硬间隔分类有两类问题:第一,只对线性可分的数据起作用,第二,对异常点敏感,有时很难找到硬间隔,很难一般化;
(2) 软间隔分类,为了避免上述问题,更倾向于使用更加软性的模型。目的在保持“街道”尽可能大和避免间隔违规(例如:数据出现在“街道”中央或者甚至出现在错误的一边)之间找到一个良好的平衡,这就是软间隔分类。

2.2 超参数C

在Scikit-Learn库的SVM类,你可以用C超参数(惩罚系数) 来控制这种平衡:较小的C会导致更宽的“街道”,但更多的间隔违规。如果SVM模型过拟合,可以通过减少超参数C去调整。

2.3 核函数

有时候很难找出一条线或者一个超平面来分割数据集,为了解决这个问题,我们把无法线性分割的样本映射到高维空间,在高维空间实现分割。
(1)线性核函数:简单,效率高,对线性不可分,无解;
(2)多项式核函数:可以拟合出复杂的分割超平面,但可选参数太多,阶数高后计算困难,不稳定;
(3)高斯核函数:融合了上面两种核函数,计算速度比较慢,容易过拟合。

2.4 算法和核函数的选择

比如分类问题,何时选择逻辑回归,何时选择SVM;选择核函数应该使用哪一种:
假设N是特征个数,M是训练集的样本个数,一般按照如下规则来选择算法:
(1) 如果N > M,即特征数量远多于样本数量时,使用逻辑回归或者线性核函数的SVM算法都可以;
(2) 如果N < M,即特征数量较小,样本中等大小(M是N的十倍左右),可以使用高斯核函数;
(3) 如果N比较小,M比较大,M是N的五十倍以上,这时候特征数量相对较少,可以使用多项式核函数、高斯核函数SVM算法;
总结来说,一般算法选择的原则是,数据量大的问题,可以选择复杂一些的模型;数据量小的问题,可以选择简单一点的模型;

2.5 Kernel指定核函数

(1) Linear线性函数: C惩罚系数;
(2)Poly多项式:C惩罚系数,degree指定阶数;
(3)Rbf高斯核函数:C惩罚系数,gamm值;

三、数据模型的建立

该处使用的是德国信用卡欺诈数据集,将数据集保存到‘datasets’目录下:

%matplotlib inline
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

划分训练和测试数据集

data = pd.read_csv("datasets/credit-a.csv", header=None) 
from sklearn.model_selection import train_test_split
x = data[data.columns[:-1]]
y = data[15].replace(-1,0)
x_train,x_test,y_train,y_test = train_test_split(x,y)

对数据进行标准化

from sklearn import preprocessing
scaler = preprocessing.StandardScaler().fit(x_train)
x_train = scaler.transform(x_train)
x_test = scaler.transform(x_test)
from sklearn.svm import SVC
#选择多项式模型
model = SVC(kernel="poly", degree=3, C=5)
model.fit(x_train,y_train)
model.score(x_test, y_test)
>>> `0.8414634146341463`
#选择高斯核函数模型
model2 = SVC(kernel="rbf", gamma=0.5, C=5)
model2.fit(x_train,y_train)
model2.score(x_test, y_test)
>>> `0.7682926829268293`
posted @ 2021-11-04 13:37  xiaojy  阅读(562)  评论(0编辑  收藏  举报