文章目录
简介1. 原数据直接做人脸分类2. PCA降维后(feature_ration是留下来的特征比例)3. 进一步缩小范围,确定 PCA 保存特征的精确数值4. 降维后的数据保留了原数据的多少信息?
简介
使用 sklearn 机器学习库中的 SVM (支持向量机)算法中的 SVC (支持向量机分类算法)来实现人脸多分类人脸数据集是 sklearn 内置的人脸数据库首先使用原数据库直接建立模型进行分类测试使用 PCA 降维算法进行降维,测试保留多少比例的信息可以有较高的分类结果精确确定 PCA 算法保留的特征种类,并得到这种降维策略下的预测精确度
1. 原数据直接做人脸分类
使用 SVM 支持向量机中的 SVC 进行分类,结果达到 96%
from sklearn
.decomposition
import PCA
from sklearn
.datasets
import fetch_olivetti_faces
from sklearn
.tree
import DecisionTreeClassifier
from sklearn
.svm
import SVC
from sklearn
.model_selection
import train_test_split
import matplotlib
.pyplot
as plt
import numpy
as np
import cv2
import math
data
= fetch_olivetti_faces
()
x
= data
.data
y
= data
.target
x_train
,x_test
,y_train
,y_test
= train_test_split
(x_copy
,y
,test_size
=0.33,random_state
=15)
classifier
= SVC
(kernel
='linear')
history
= classifier
.fit
(x_train
,y_train
)
score
= classifier
.score
(x_test
,y_test
)
看一下现在数据的维度是:4096,即 64 * 64 的单通道图片(在图片数据中,我们认为数据的维度就是其特征的多少)
2. PCA降维后(feature_ration是留下来的特征比例)
from sklearn
.decomposition
import PCA
from sklearn
.datasets
import fetch_olivetti_faces
from sklearn
.tree
import DecisionTreeClassifier
from sklearn
.svm
import SVC
from sklearn
.model_selection
import train_test_split
import matplotlib
.pyplot as plt
import numpy as np
import cv2
import math
data
= fetch_olivetti_faces()
x
= data
.data
y
= data
.target
feature_ratio
= np
.linspace(0.5,0.99,20)
# 保留数据的特征从
50% 尝试到
99%
x_shape
=[] #按照保存特征比例进行 PCA 降维之后,数据的维度保存在这个列表中
scores
= [] #每次降维后的数据的评分保存在这里面
for i in feature_ratio
:
pca
= PCA(i
)
x_copy
= pca
.fit_transform(x
)
x_train
,x_test
,y_train
,y_test
= train_test_split(x_copy
,y
,test_size
=0.33,random_state
=15)
classifier
= SVC(kernel
='linear')
history
= classifier
.fit(x_train
,y_train
)
score
= classifier
.score(x_test
,y_test
)
x_shape
.append(x_copy
.shape
[1])
scores
.append(score
)
plt
.plot(x_shape
,scores
)
plt
.xlabel('number of features')
plt
.ylabel('accuracy')
plt
.show()
可以看到,保存 50 个特征左右的时候,就可以让整个模型表现的效果很好我们可以进行进一步的探索,尝试把保存的特征数设置在 35-60之间,看看哪个具体的值可以让模型表现更好
3. 进一步缩小范围,确定 PCA 保存特征的精确数值
x_shape
=[]
scores
= []
for i in
range(35,60):
pca
= PCA(i
)
x_copy
= pca
.fit_transform(x
)
x_train
,x_test
,y_train
,y_test
= train_test_split(x_copy
,y
,test_size
=0.33,random_state
=15)
classifier
= SVC(kernel
='linear')
history
= classifier
.fit(x_train
,y_train
)
score
= classifier
.score(x_test
,y_test
)
x_shape
.append(x_copy
.shape
[1])
scores
.append(score
)
plt
.plot(x_shape
,scores
)
plt
.xlabel('number of features')
plt
.ylabel('accuracy')
plt
.show()
可以看出,当保留 35 个特征的时候,就可以使模型达到最好的表现效果;甚至比未降维的原数据表现结果的 96% 还要高 1%
4. 降维后的数据保留了原数据的多少信息?
用 PCA 把原数据降维成 35 维
使用 explained_variance_ 属性来看留下的每个特征的贡献率
然后使用 np.cumsum 对所有的特征贡献度进行累加,最后的结果就是剩下的特征占全部特征信息的比例,为 66.13649 %
反过来再验证一下,看保留 66.13649 %信息的时候,是否真的能达到如此高的分数;检验成功。