导入需求库¶
from sklearn.svm import SVC #分类
from sklearn.datasets import fetch_lfw_people #名人人脸数据
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
from sklearn.decomposition import PCA #降低维度
from sklearn.model_selection import GridSearchCV #调节参数
import logging
一、配置日志并且导入人脸数据¶
logging.basicConfig(level= logging.INFO)
data= fetch_lfw_people(min_faces_per_person= 70, #最小的数量
resize= 1,
slice_= (slice(0, 250, None),
slice(0, 250, None))) #抓取人脸数据
友情提示:导入人脸数据,需要一定时间,请耐心等待。¶
二、展示脸图与数据¶
plt.imshow(data.images[10])
data.images[10]
三、人脸数据其他相关参数¶
images= data.images # 1288张图片
target_names= data.target_names #图片的人名
target_names
x= data.data
x
y= data.target
y
四、训练数据切割¶
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test= train_test_split(x, y, test_size= 0.12) # 数据切割, 0.88用于训练,0,12用于识别测试
五、简单SVC分类¶
import time
start= time.time() # 开始时间
svc= SVC() # SVM分类
svc.fit(x_train, y_train) # 训练
print(svc.score(x_test, y_test)) #测试得分,0.38不理想。
end= time.time() # 结束时间
print(end-start) # 时间差
从上面简单SVC训练获取得分为0.38,非常不理想,接下来要加强学习-降维。¶
五、优化版SVC+降维-训练与预测¶
一、PCA降维处理¶
newsvc= SVC()
newsvc.fit(x_train[:500], y_train[:500]) #新的SVC,训练之
pca= PCA(n_components= 150, #主成分
svd_solver= 'randomized', #打乱
whiten= True) #白化
pca.fit(x)
友情提示:请勿于晚上运行,因为服务器不稳定,所以数据训练以500为界限,而且本笔者研究环境是有升级。(CPU:2,内存:2,硬盘:3)¶
二、训练与预测数据预处理¶
x_train_pca= pca.transform(x_train) #预处理x_train
x_test_pca= pca.transform(x_test) #预处理x_test
newsvc.score(x_test, y_test)
三、直接降维预测¶
svc_best= SVC() #最好的
svc_best.fit(x_train_pca, y_train)
svc_best.score(x_test_pca, y_test)
四、SVC调优预测¶
g_svc= SVC() # 自动调优
param_grid= {'C': [0.2, 0.5, 0.8, 1, 3, 5, 7, 9],
'gamma': [0.001, 0.002, 0.0033, 0.0066, 0.01, 0.03, 0.05, 0.1]} #参数,调优,选择一个最好比例
gcv= GridSearchCV(g_svc, param_grid= param_grid) #创建一个自动调优
gcv.fit(x_train_pca, y_train) # 训练
svc_last= SVC(C= 1.0, gamma= 0.001)
svc_last
一、训练数据¶
svc_last_1= SVC(C= 5.0, gamma= 0.001)
svc_last_1.fit(x_train_pca[:500], y_train[:500]) #训练数据
SVC自动调优出现bug,所以惩罚系数修为5。
二、预测数据¶
svc_last_1.score(x_test_pca, y_test) #评分
y_new= svc_last_1.predict(x_test_pca) #训练数据
y_new
四、真实数据与预测展示¶
一、数据展示¶
print("预测数据")
for i in y_new:
print(target_names[i], end= ' ')
print("真实数据")
for i in y_test:
print(target_names[i], end= ' ')
y_last = svc_last_1.predict(x_test_pca[: 20])
y_last
y_test[: 20]
二、预测与真实数据对比¶
def get_names(y_last, y_test, target_names, i):
predictname = target_names[y_last[i]].rsplit(' ')[-1]
truename = target_names[y_test[i]].rsplit(' ')[-1]
return 'predict: %s \n true: %s' % (predictname, truename) #预测名字
get_names(y_last, y_test, target_names, 1)
names= [get_names(y_last, y_test, target_names, i) for i in range(20)]
names
def show_predict_result(names, row, columns, x_test): #批量绘图
plt.figure(figsize(columns*2, row*2.4)) #设置图片大小
for i, image in enumerate(x_test): #循环索引,图片数组
plt.subplot(row, columns, (i+ 1)) #增加一张子图
plt.imshow(image.reshape((250, 250))) #调整形状
plt.axis('off')
plt.title(names[i]) #设置标题
show_predict_result(names, 5, 4, x_test[: 20])
show_predict_result(names, 3, 4, x_test[: 12])