day04-样本均衡-置信概率-网格搜索-事件预测-K均值、均值漂移、凝聚层次聚类--
十一、支持向量机
1.原理
1)寻求最优的分类边界,
即被支持向量所夹持的分类带宽度达到最大值,
取其中心线作为分类边界。
最优边界要求:
正确:对大部分样本可以正确地划分类别
泛化:最大化支持向量间接
公平:与支持向量等距
简单:线性、直线或平面,分割超平面。
1)安全性:分类带最宽
2)公平性:分类带中心线
3)简单性:线性边界,分割超平面
4)对于在原始维度空间中无法线性分割的样本,通过特定的核函数
增加特征,即升高维度,在高维度空间寻求分割超平面。
2)基于核函数的升维变换
通过名为核函数的特征变换,增加新的特征,使得低维度空间
中的线性不可分问题变为高纬度空间中的线性可分问题。
2.接口
import sklearn.svm as svm
分类器模型=svm.SVC(kernel=核函数类型, ...)
回归器模型=svm.SVR(kernel=核函数类型, ...)
3.不同核函数的分类效果
1)线性核函数:linear
svm.SVC(kernel='linear'),不通过核函数进行维度提升,
尽量在原始维度空间中寻求线性分类边界。
代码示例:svm_line.py
import numpy as np
import matplotlib.pyplot as mp
import sklearn.model_selection as ms
import sklearn.metrics as sm
import sklearn.svm as svm
x,y = [],[]
with open('../../day01/data/multiple1.txt','r') as f:
for line in f.readlines():
data = [float(substr) for substr in line.split(',')]
x.append(data[:-1])
y.append(data[-1])
x ,y = np.array(x),np.array(y,dtype=int)
#划分训练集合测试集
train_x,test_x,train_y,test_y = \
ms.train_test_split(x,y,test_size=0.25,random_state=7)
#基于线性核函数的支持向量机分类器
model = svm.SVC(kernel='linear')
model.fit(train_x,train_y)#用训练集进行训练
l, r, h = x[:, 0].min() - 1, x[:, 0].max() + 1, 0.005
b, t, v = x[:, 1].min() - 1, x[:, 1].max() + 1, 0.005
grid_x = np.meshgrid(np.arange(l, r, h),np.arange(b, t, v))
flat_x = np.c_[grid_x[0].ravel(), grid_x[1].ravel()] #列合并
flat_y = np.zeros(len(flat_x), dtype=int)#进行自动分类
flat_y = model.predict(flat_x) #注意,在这里才开始训练
grid_y = flat_y.reshape(grid_x[0].shape)
pred_test_y = model.predict(test_x)#用测试集测试并产生预测值
#获得分类报告
cr = sm.classification_report(test_y,pred_test_y)
print(cr)
mp.figure('SVM Linear Classification',facecolor='lightgray')
mp.title('SVM Linear Classification', fontsize=20)
mp.xlabel('x', fontsize=14)
mp.ylabel('y', fontsize=14)
mp.tick_params(labelsize=10)
mp.pcolormesh(grid_x[0], grid_x[1], grid_y,
cmap='gray')
mp.scatter(test_x[:, 0], test_x[:, 1],
c=test_y, cmap='brg', s=80)
mp.show()
2)多项式核函数:poly
svm.SVC(kernel='poly',degree=最高次幂)
通过多项式函数增加原始样本特征的高次方幂
代码示例:svm_poly.py
import numpy as np
import matplotlib.pyplot as mp
import sklearn.model_selection as ms
import sklearn.metrics as sm
import sklearn.svm as svm
x,y = [],[]
with open('../../day01/data/multiple2.txt','r') as f:
for line in f.readlines():
data = [float(substr) for substr in line.split(',')]
x.append(data[:-1])
y.append(data[-1])
x ,y = np.array(x),np.array(y,dtype=int)
#划分训练集合测试集
train_x,test_x,train_y,test_y = \
ms.train_test_split(x,y,test_size=0.25,random_state=7)
#基于3次多项式核函数的支持向量机分类器
model = svm.SVC(kernel='poly',degree=3)
model.fit(train_x,train_y)#用训练集进行训练
l, r, h = x[:, 0].min() - 1, x[:, 0].max() + 1, 0.005
b, t, v = x[:, 1].min() - 1, x[:, 1].max() + 1, 0.005
grid_x = np.meshgrid(np.arange(l, r, h),np.arange(b, t, v))
flat_x = np.c_[grid_x[0].ravel(), grid_x[1].ravel()] #列合并
flat_y = np.zeros(len(flat_x), dtype=int)#进行自动分类
flat_y = model.predict(flat_x) #注意,在这里才开始训练
grid_y = flat_y.reshape(grid_x[0].shape)
pred_test_y = model.predict(test_x)#用测试集测试并产生预测值
#获得分类报告
cr = sm.classification_report(test_y,pred_test_y)
print(cr)
mp.figure('SVM Poly Classification',facecolor='lightgray')
mp.title('SVM Poly Classification', fontsize=20)
mp.xlabel('x', fontsize=14)
mp.ylabel('y', fontsize=14)
mp.tick_params(labelsize=10)
mp.pcolormesh(grid_x[0], grid_x[1], grid_y,
cmap='gray')
mp.scatter(test_x[:, 0], test_x[:, 1],
c=test_y, cmap='brg', s=80)
mp.show()
3)径向基核函数
svm.SVC(kernel='rbf',C=正则强度,gamma=正态分布标准差)
超参数:正则强度一般为400,正态分布标准差一般为0.01
代码示例:svm_rbf.py
import numpy as np
import matplotlib.pyplot as mp
import sklearn.model_selection as ms
import sklearn.metrics as sm
import sklearn.svm as svm
x,y = [],[]
with open('../../day01/data/multiple2.txt','r') as f:
for line in f.readlines():
data = [float(substr) for substr in line.split(',')]
x.append(data[:-1])
y.append(data[-1])
x ,y = np.array(x),np.array(y,dtype=int)
#划分训练集合测试集
train_x,test_x,train_y,test_y = \
ms.train_test_split(x,y,test_size=0.25,random_state=7)
#基于径向基核函数的支持向量机分类器
model = svm.SVC(kernel='rbf',C=600,gamma=0.01)
model.fit(train_x,train_y)#用训练集进行训练
python MachinelEarning机器学习笔记day04
最新推荐文章于 2024-10-04 01:34:34 发布

最低0.47元/天 解锁文章
1289

被折叠的 条评论
为什么被折叠?



