前言
- 一些支持向量机的学习实践笔记
- 一些网格搜索和随机搜索的方法。
- 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))
模型训练完之后可以自己导入照片到数据集中,看是否能识别。