04-支持向量机

一、支持向量机

二、网格搜索和随机搜索 

  1、网格搜索

2、随机搜索

三、 SVM人脸识别


前言

  1. 一些支持向量机的学习实践笔记
  2. 一些网格搜索和随机搜索的方法。
  3. SVM人脸识别

 一、支持向量机

sklearn网站上关于支持向量机的链接

https://scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.html#sklearn.svm.SVC

 在jupter notebook中还可以使用 ?SVC  来查看具体信息(但是要先导入svc库)

from sklearn.svm import SVC
?SVC

大致出现的信息:

 使用make_blobs生成100个具有两个特征的分类点,作为支持向量机的数据

#生成100个具有两个特征的分类点
from sklearn.datasets import make_blobs
X,y=make_blobs(n_samples=100,n_features=2,centers=2,random_state=6)

拆分训练集和测试集

#拆分训练集和测试集
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.3,random_state=6)

还是使用“三板斧”进行支持向量机训练

#导入支持向量机分类库
from sklearn.svm import SVC
#实例化
clf=SVC(kernel='linear',C=1000)
#模型训练
clf.fit(X_train,y_train)

使用自带的一些方法可以查看模型的准确率、支持向量机的个数及坐标等等

#查看模型准确率
clf.score(X_test,y_test)

#查看支持向量的个数
clf.n_support_

#查看支持向量的坐标
clf.support_vectors_

把具体的分类情况画出来

#导入numpy
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

#结果可视化
plt.scatter(X_train[:,0],X_train[:,1],c=y_train,cmap=plt.cm.spring,edgecolors='k')
#建立图像坐标
ax=plt.gca()
xlim=ax.get_xlim()
ylim=ax.get_ylim()

xx=np.linspace(xlim[0],xlim[1],30)
yy=np.linspace(ylim[0],ylim[1],30)
YY,XX=np.meshgrid(yy,xx)
xy=np.vstack([XX.ravel(),YY.ravel()]).T
Z=clf.decision_function(xy).reshape(XX.shape)

#把分类的决定边界画出来
ax.contour(XX,YY,Z,colors='k',levers=[-1,0,1],alpha=0.5,linestyles=['--','-','--'])
ax.scatter(clf.support_vectors_[:,0],clf.support_vectors_[:,1],s=100,linewidth=1,facecolors='none')

分类结果可视化如下图所示

二、网格搜索和随机搜索 

网格搜索和随机搜索都是选择模型参数的方法。区别就顾名思义了。网格搜索,把输入的参数排列组合,全部输出出来。而随机搜索则是随机输出部分组合。前者耗时长,后者输出不完全。可以根据具体情况选择具体的方法

  1、网格搜索

 网格搜索的sklearn网站链接https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.GridSearchCV.html#sklearn.model_selection.GridSearchCV

#导入网格搜索模块、SVM
from sklearn.model_selection import GridSearchCV
from sklearn import svm

#导入iris数据集
from sklearn.datasets import load_iris
iris=datasets.load_iris()

#构建参数列表
parameters={'kernel':('linear','rbf'),'C':[1,10]}
svc=svm.SVC(probability=True)#返回样本属于某一个值的概率
clf=GridSearchCV(svc,parameters) #使用SVM分类器和上述参数列表
clf.fit(iris.data,iris.target) #训练数据集

使用自带的cv_results_可以输出排名

import pandas as pd 
pd.DataFrame(clf.cv_results_)

 用DataFrame整理一下,大致长这样

如果只想要最好的一组参数,可以使用best_params方法

clf.best_params_

 当然还可以使用decision_function方法给每个类别打一个分数

print(clf.decision_function(iris.data))
#给每个数据在每个类别打一个分数

2、随机搜索

大致使用方法和网格搜索差不多

from sklearn.model_selection import RandomizedSearchCV
import scipy.stats as stats
from sklearn import datasets
iris=datasets.load_iris()

parameters={'kernel':("linear","rbf"),'C':stats.expon(scale=100),'gamma':stats.expon(scale=.1),'class_weight':('balanced',None)}

svc=SVC()
clf=RandomizedSearchCV(svc,parameters)
clf.fit(iris.data,iris.target)

pd.DataFrame(clf.cv_results_)

打印的参数列表大致如下图所示

同样可以使用best_params_方法打印最优参数

三、 SVM人脸识别

首先,导入LFW人脸数据集(可能需要下载到本地再导入)

from sklearn.datasets import fetch_lfw_people
from sklearn.decomposition import PCA
lfw_people=fetch_lfw_people(data_home="C:\\Users\\Lenovo\\A-机器学习",download_if_missing=False)

大致了解一下数据集

#查看照片的数据格式
n_samples,h,w=lfw_people.images.shape
print(n_samples)
print(h)
print(w)

#查看数据标签
target_names=lfw_people.target_names
print(target_names)

#查看数据标签类别个数
n_classes=lfw_people.target_names.shape[0]
print(n_classes)

这个数据集录入了13233张照片,维度为62×47,数据标签大致有5749个类别。

可以看一下第一张图片

import matplotlib.pyplot as plt
plt.imshow(lfw_people.images[0],cmap='gray')
plt.show()

#拆分训练集和测试集
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test=train_test_split(lfw_people.data,lfw_people.target,test_size=0.3,random_state=6)

#建立SVM分类模型
#模型实例化
from sklearn.svm import SVC
model=SVC(kernel='rbf',class_weight='balanced')
model.fit(X_train,y_train)

predictions=model.predict(X_test)
#模型评价
print(classification_report(y_test,predictions,target_names=lfw_people.target_names))

模型训练完之后可以自己导入照片到数据集中,看是否能识别。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Suki百香果

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值