人脸识别作业总结

#coding:utf8
import logging
from sklearn.cross_validation import train_test_split
#划分数据集
from sklearn.datasets import fetch_lfw_people
#数据库
from sklearn.grid_search import GridSearchCV
#自动调参
from sklearn.metrics import classification_report
#分析不同类别的准确率
from sklearn.metrics import confusion_matrix
#混淆矩阵,总结分类模型预测结果
from sklearn.decomposition import PCA
from sklearn.decomposition import RandomizedPCA
#特征提取
from sklearn.svm import SVC
#支持向量机
from sklearn import tree 
#决策树
from sklearn.ensemble import AdaBoostClassifier
#Adaboost提升算法
from sklearn import naive_bayes
#朴素贝叶斯
from sklearn.neighbors import KNeighborsClassifier
#K近邻
from time import time
#画图
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn import metrics


#打印日志信息
logging.basicConfig(level=logging.INFO, format='%(asctime)s%(message)s')

###########################数据预处理#############################
#装载人脸的数据集
lfw_people = fetch_lfw_people(min_faces_per_person=40, resize=0.4)
#print (lfw_people)
#1867x1850的一个数据矩阵
#这1867张图片是从全部的数据集中挑选出的符合要求的目标的全部图片,在本例中就是那19个需要被识别的人的全部图片

n_samples, h, w = lfw_people.images.shape  #实例数(图片数)、h、w
print ("实例数(图片数)、h、w",n_samples,h,w)
#每张图片是50x37来表示

X = lfw_people.data #所有的数据集1867张图片,每张图片1850个特征值
n_pictures = X.shape[0] #图片总数
n_features = X.shape[1] #每张图片的特征向量的维度1850
print ("图片数,特征数--训练数据的X.shape:", X.shape)

Y = lfw_people.target   #1867张图片所对应的人脸的标记
target_names = lfw_people.target_names   #对应人脸的名字
print ("需要识别的人名字:",target_names) #最后的分类


#分割训练集和测试集
X_train,X_test,y_train,y_test = train_test_split(X, Y, test_size=0.25)

#############################降维度#####################################

#将高维的特征向量降低为低维的,先建立模型PCA
pca = PCA(n_components=150, whiten=True).fit(X_train)
#n_components= 150 降维的参数,组成元素的数量,即保留下来的特征个数
#whiten=True,使得每个特征有相同的方差,对降维后的数据的每个特征进行归一化,让方差都为1.
#是否进行归一化对数据的影响还是比较大的

#PCA模型建立好之后就可以执行pca.transform进行数据降维
X_train_pca = pca.transform(X_train)
X_test_pca = pca.transform(X_test)

#将数据X转换为降维后的数据
print ("降维后的数据集")
print ("特征训练集",X_train_pca.shape)
print ("特征测试集",X_test_pca.shape)
#降维后的数据显示
t0 = time()
# 数据已经准备好了,下一步就可以进行建立SVM模型的建立了。
# #################################建模#####################################
# print ("----------------------开始建立SVM模型------------------------------")
# svc = SVC(kernel='rbf', class_weight='balanced')
# #kernel算法中采用的核函数类型,默认rbf,径像核函数/高斯核
# #给每个类别分别设置不同的惩罚参数C,如果没有给,则会给所有类别都给C=1,即前面参数指出的参数C.
# #如果给定参数‘balance’,则使用y的值自动调整与输入数据中的类频率成反比的权重

# #自动的给SVM模型进行调参
# param_grid = {'C': [1e3, 5e3, 1e4, 5e4, 1e5],
#                'gamma': [0.0001, 0.0005, 0.001, 0.005,0.01, 0.1],}
# clf = GridSearchCV(svc, param_grid)
# print (clf.estimator)   #显示调参过后最好的模型的信息

# #模型准备好了,训练数据集
# print ("-------------------------训练模型-----------------------------------")
# clf = clf.fit(X_train_pca, y_train)  #数据准备好了,建模就一句话
# print ("time:%0.3fs" % (time()-t0))  #训练时长

# print ("----------------------------预测------------------------------------")
# yfit = clf.predict(X_test_pca)  #预测
# print(clf.score(X_test_pca, y_test)) #正确率

# print ("--------------------------决策树------------------------------------")
# #CART决策树
# clf = tree.DecisionTreeClassifier(criterion='gini',splitter='best')   
# clf.fit(X_train_pca, y_train) 
# # print(clf)
# yfit = clf.predict(X_test_pca)  #预测
# print ("time:%0.3fs" % (time()-t0))  #训练时长
# print(clf.score(X_test_pca, y_test)) #正确率

# print ("--------------------------决策树+Adaboost------------------------------------")
# param_grid = {'n_estimators': [100, 200, 300, 400, 500],
#                'learning_rate': [0.1, 0.2, 0.3, 0.4,0.5,0.6],}

# clf = GridSearchCV(AdaBoostClassifier(tree.DecisionTreeClassifier(criterion='gini',splitter='random'),
#                         algorithm="SAMME"), param_grid)

# clf.fit(X_train_pca,y_train) #调参的提升算法
# print (clf.estimator)
# print ("time:%0.3fs" % (time()-t0))  #训练时长
# print(clf.score(X_test_pca, y_test)) #正确率

# print ("---------------------------朴素贝叶斯-----------------------------------")
# clf =  naive_bayes.GaussianNB()  # 高斯贝叶斯
# clf.fit(X_train_pca,y_train)
# print(clf)
# yfit = clf.predict(X_test_pca)
# print ("time:%0.3fs" % (time()-t0))  #训练时长
# print(clf.score(X_test_pca, y_test)) #正确率

# print ("---------------------------K近邻-----------------------------------")
# knn = KNeighborsClassifier()
# clf = knn.fit(X_train_pca,y_train)
# print(knn)
# yfit = clf.predict(X_test_pca)
# print ("time:%0.3fs" % (time()-t0))  #训练时长
# print(clf.score(X_test_pca, y_test)) 

#画图
fig, ax = plt.subplots(4, 6)
for i, axi in enumerate(ax.flat):
    axi.imshow(X_test[i].reshape(h,w), cmap='bone')
    axi.set(xticks=[], yticks=[])
    axi.set_ylabel(lfw_people.target_names[yfit[i]].split()[-1],
                   color='black' if yfit[i] == y_test[i] else 'red')
fig.suptitle('Predicted Names; Incorrect Labels in Red', size=14);
plt.show()

# print(classification_report(y_test, yfit,
#                             target_names=lfw_people.target_names))

# mat = confusion_matrix(y_test, yfit)
# sns.heatmap(mat.T, square=True, annot=True, fmt='d', cbar=False,
#             xticklabels=lfw_people.target_names,
#             yticklabels=lfw_people.target_names)
# plt.xlabel('true label')
# plt.ylabel('predicted label');
# plt.show()

 

注释写的挺详细的,就不多解释了

10-08 04:30