SVM建模进行人脸识别案例
1、导包
首先进行导包
from sklearn.decomposition import PCA
import numpy as np
from sklearn.svm import SVC
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.decomposition import PCA
from sklearn.metrics import accuracy_score
from sklearn.linear_model import LogisticRegression
from sklearn import datasets
from sklearn.model_selection import GridSearchCV
2、加载数据集
我们加载sklearn已经帮我们收集好的人脸数据
# 加载人脸数据 lfw->labled faces wild:野外标记的人脸
data = datasets.fetch_lfw_people(resize = 1, min_faces_per_person = 70)
data
查看结果:
我们取出其中的数据进行查看:
X = data['data']
y = data['target']
faces = data['images']
target_names = data['target_names']
display(X.shape,y.shape,faces.shape,target_names)
运行结果:
我们随机选取一个人的图片并通过索引获取名字:
# 随机取出一个人脸
index = np.random.randint(0,1288,size = 1)[0]
face = faces[index]
name = y[index] # 根据索引获取名字
print(target_names[name])
display(face.shape)
plt.imshow(face, cmap = 'gray')
结果展示:
3、直接使用SVM模型建模
由于原来的数据很大,而且数据量多,我们首先对原始数据进行PCA降维
%%time
# 进行数据的降维
pca = PCA(n_components=0.95)
X_pca = pca.fit_transform(X)
display(X.shape,X_pca.shape)
结果展示:
然后对降维后的数据集进行训练和预测结果:
其中的C代表的是惩罚系数,用来防止过拟合,我们先用默认的初始值测试下性能
%%time
# 降维之后的数据
X_train,X_test,y_train,y_test, faces_train,faces_test = train_test_split(X_pca,y,faces)
# C为惩罚项,越大,容忍错误越小
# C越大,趋势:想方设发,把数据分开,容易造成过拟合
svc = SVC(C = 1)
svc.fit(X_train,y_train)
# 训练数据效果很好,测试数据效果不好就是过拟合现象
print('训练数据的得分:',svc.score(X_train,y_train))
print('测试数据的得分:',svc.score(X_test,y_test))
# 算法的预测值
y_pred = svc.predict(X_test)
结果展示:
4、数据可视化
然后我们随机加载50张图片,并可视化查看预测结果:
plt.figure(figsize=(5 * 2, 10 * 3))
for i in range(50):
plt.subplot(10,5,i + 1) # 子视图
plt.imshow(faces_test[i],cmap = 'gray')
plt.axis('off') # 刻度关闭
# 贴上标签,并且对比实际数据和预测数据
true_name = target_names[y_test[i]].split(' ')[-1]
predict_name = target_names[y_pred[i]].split(' ')[-1]
plt.title(f'True:{true_name}\nPred:{predict_name}')
结果展示:
从结果来看,预测效果并不是很好,红色框选出来的都是预测错误的名字,因此我们不得不对原来的性能优化。
5、网络搜索优化确定最佳性能
sklearn为我们集成好了网络搜索确定最佳性能的方法,只要吧要传进的参数填进去,它会为我们自动搭配获得最优参数。
%%time
svc = SVC()
# C为惩罚系数(防止过拟合),kernel为核函数类型,tol为停止训练的误差值、精度
params = {'C':np.logspace(-10,10,50),'kernel':['linear', 'poly', 'rbf', 'sigmoid'],'tol':[0.01,0.001,0.0001]}
gc = GridSearchCV(estimator = svc,param_grid = params,cv = 5)
gc.fit(X_pca,y)
gc.best_params_
结果展示:
6、使用最佳性能SVM建模
从上面的结果来看,获得的最优惩罚系数C为1.8420699693267165e-07,最优核函数类型是linear线性模型,最优精度为0.001.
基于上面的最优参数,对SVM进行优化建模
svc = SVC(C = 1.8420699693267165e-07,kernel='linear',tol = 0.001)
# 随机划分的
X_pca_train,X_pca_test,y_train,y_test, faces_train,faces_test = train_test_split(X_pca,y,faces)
svc.fit(X_pca_train,y_train)
print('训练数据得分:',svc.score(X_pca_train,y_train))
print('测试数据的得分:',svc.score(X_pca_test,y_test))
结果展示:
从这个结果来看,相比于普通的SVM建模,优化后的SVM在得分上明显有提高。
7、优化后的数据可视化
plt.figure(figsize=(5 * 2, 10 * 3))
for i in range(50):
plt.subplot(10,5,i + 1) # 子视图
plt.imshow(faces_test[i],cmap = 'gray')
plt.axis('off') # 刻度关闭
# 贴上标签,并且对比实际数据和预测数据
true_name = target_names[y_test[i]].split(' ')[-1]
predict_name = target_names[y_pred[i]].split(' ')[-1]
plt.title(f'True:{true_name}\nPred:{predict_name}')
结果展示:
文章来源:https://www.toymoban.com/news/detail-763233.html
从优化后的结果来看,虽然还是有分错的结果,但是准确率较原来的准确率提高了很多。文章来源地址https://www.toymoban.com/news/detail-763233.html
8、完整代码
8.1未优化的完整代码
from sklearn.decomposition import PCA
import numpy as np
from sklearn.svm import SVC
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.decomposition import PCA
from sklearn.metrics import accuracy_score
from sklearn.linear_model import LogisticRegression
from sklearn import datasets
from sklearn.model_selection import GridSearchCV
# 加载人脸数据 lfw->labled faces wild:野外标记的人脸
data = datasets.fetch_lfw_people(resize = 1, min_faces_per_person = 70)
data
# 进行数据的降维
pca = PCA(n_components=0.95)
X_pca = pca.fit_transform(X)
display(X.shape,X_pca.shape)
# 降维之后的数据
X_train,X_test,y_train,y_test, faces_train,faces_test = train_test_split(X_pca,y,faces)
# C为惩罚项,越大,容忍错误越小
# C越大,趋势:想方设发,把数据分开,容易造成过拟合
svc = SVC(C = 1)
svc.fit(X_train,y_train)
# 训练数据效果很好,测试数据效果不好就是过拟合现象
print('训练数据的得分:',svc.score(X_train,y_train))
print('测试数据的得分:',svc.score(X_test,y_test))
# 算法的预测值
y_pred = svc.predict(X_test)
plt.figure(figsize=(5 * 2, 10 * 3))
for i in range(50):
plt.subplot(10,5,i + 1) # 子视图
plt.imshow(faces_test[i],cmap = 'gray')
plt.axis('off') # 刻度关闭
# 贴上标签,并且对比实际数据和预测数据
true_name = target_names[y_test[i]].split(' ')[-1]
predict_name = target_names[y_pred[i]].split(' ')[-1]
plt.title(f'True:{true_name}\nPred:{predict_name}')
8.2优化后的完整代码
from sklearn.decomposition import PCA
import numpy as np
from sklearn.svm import SVC
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.decomposition import PCA
from sklearn.metrics import accuracy_score
from sklearn.linear_model import LogisticRegression
from sklearn import datasets
from sklearn.model_selection import GridSearchCV
# 加载人脸数据 lfw->labled faces wild:野外标记的人脸
data = datasets.fetch_lfw_people(resize = 1, min_faces_per_person = 70)
data
# 进行数据的降维
pca = PCA(n_components=0.95)
X_pca = pca.fit_transform(X)
display(X.shape,X_pca.shape)
svc = SVC()
# C为惩罚系数(防止过拟合),kernel为核函数类型,tol为停止训练的误差值、精度
params = {'C':np.logspace(-10,10,50),'kernel':['linear', 'poly', 'rbf', 'sigmoid'],'tol':[0.01,0.001,0.0001]}
gc = GridSearchCV(estimator = svc,param_grid = params,cv = 5)
gc.fit(X_pca,y)
gc.best_params_
svc = SVC(C = 1.8420699693267165e-07,kernel='linear',tol = 0.001)
# 随机划分的
X_pca_train,X_pca_test,y_train,y_test, faces_train,faces_test = train_test_split(X_pca,y,faces)
svc.fit(X_pca_train,y_train)
print('训练数据得分:',svc.score(X_pca_train,y_train))
print('测试数据的得分:',svc.score(X_pca_test,y_test))
plt.figure(figsize=(5 * 2, 10 * 3))
for i in range(50):
plt.subplot(10,5,i + 1) # 子视图
plt.imshow(faces_test[i],cmap = 'gray')
plt.axis('off') # 刻度关闭
# 贴上标签,并且对比实际数据和预测数据
true_name = target_names[y_test[i]].split(' ')[-1]
predict_name = target_names[y_pred[i]].split(' ')[-1]
plt.title(f'True:{true_name}\nPred:{predict_name}')
到了这里,关于机器学习实战-SVM模型实现人脸识别的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!