支持向量机(SVM)
超平面最大间隔
硬间隔和软间隔
sklearn.svm
注意实例化有所不同
from sklearn import svm
x=[[0,0],[1,1]]
y=[0,1]
ss=svm.SVC()
ss.fit(x,y)
ss.predict([[2,2]])
array([1])
SVM算法原理
定义输入数据
线性可分支持向量机
目标函数
拉格朗日乘子法
对偶问题
整体流程
损失函数
0/1损失、SVM Hinge损失函数、Logistic损失函数
sklearn.metrics.zero_one_loss
sklearn.metrics.hinge_loss
sklearn.metrics.log_loss
核方法
核函数
将原始输入空间映射到新的特征空间,从而,使得原本线性不可分的样本可能在核空间可分
常见核函数
应用最广的是RBF核
SVM回归
让尽可能多的实例位于预测线上,同时限制间隔违例(也就是不再预测线距上的实例)
算法api再介绍
SVC
class sklearn.svm.SVC(C=1.0,kernel='rbf',degree=3,coef0=0.0,random_state=None)
NuSVC
class sklearn.svm.NuSVC(nu=0.5)
LinearSVC
class sklearn.svm.LinearSVC(penalty='l2',loss='squared_hinge',dual=True,C=1.0)
数字识别器
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm
from sklearn.model_selection import train_test_split
train=pd.read_csv('./data1/mnist/train.csv')
#确定特征值和目标值
train_image=train.iloc[:,1:]
train_label=train.iloc[:,0]
#1.2查看具体图像
num=train_image.iloc[0,].values.reshape(28,28)
plt.imshow(num)
plt.axis('off')
plt.show()
def to_plot(n):
num=train_image.iloc[n,].values.reshape(28,28)
plt.imshow(num)
plt.axis('off')
plt.show()
o_plot(n=100)
#2数据基本处理
#2.1对数据特征值归一化处理
train_image=train_image.values/255
train_label=train_label.values
#2.2数据集分割
x_train,x_val,y_train,y_val=train_test_split(train_image,train_label,train_size=0.8,random_state=0)
#2.3特征降维和模型训练
import time
from sklearn.decomposition import PCA
def n_components_analysis(n,x_train,y_train,x_val,y_val):
start=time.time() #记录开始时间
pca=PCA(n_components=n) #pca降维实现
print('特征降维,传递的参数为:{}'.format(n))
pca.fit(x_train)
x_train_pca=pca.transform(x_train) #训练集和测试集进行降维
x_val_pca=pca.transform(x_val)
print('开始使用svc进行训练') #利用svc进行训练
ss=svm.SVC()
ss.fit(x_train_pca,y_train)
accuracy=ss.score(x_val_pca,y_val) #获取accuracy结果
end=time.time() #记录结束时间
print('准确率是:{},消耗时间是:{}s'.format(accuracy,int(end-start)))
return accuracy
#3传递多个n_components,寻找合理的n_components
n_s=np.linspace(0.70,0.85,num=5)
accuracy=[]
for n in n_s:
tmp=n_components_analysis(n,x_train,y_train,x_val,y_val)
accuracy.append(tmp)
#4准确率可视化展示
plt.plot(n_s,np.array(accuracy),'r')
plt.show()
经过图像展示,选择合理的n_components,最后综合考虑确定结果为:0.80
#5确定最优模型
pca=PCA(n_components=0.80)
pca.fit(x_train)
pca.n_components_
43
x_train_pca=pca.transform(x_train)
x_val_pac=pca.transform(x_val)
#6训练比较优的模型,计算accuracy
ss1=svm.SVC()
ss1.fit(x_train_pca,y_train)
ss1.score(x_val_pac,y_val)
0.979047619047619