数据特征提取

数据表达 : 有时,我们通过对数据集原来的特征进行转换,生成新的"特征"或者说成分,会比直接使用原始的特征效果要好,即数据表达(data representation)

特征提取 : 如图像识别,数据表达显得十分重要,因为图像是有成千上万个像素组成的,每个像素又有不同的的RGB色彩值,所以我们要使用特征提取这种数据处理方法,特征提取是指使用计算机提取图像中属于特征性的信息的方法及过程。

1.使用PCA主成分分析法用于特征提取

#############################  PCA主成分分析法用于特征提取  #######################################
#导入画图工具
import matplotlib.pyplot as plt
#导入数据集拆分工具
from sklearn.model_selection import train_test_split

#导入数据集获取工具
from sklearn.datasets import fetch_lfw_people
#载入人脸数据集
faces = fetch_lfw_people(min_faces_per_person=20,resize=0.8)
image_shape = faces.images[0].shape
#将照片打印出来
fig,axes = plt.subplots(3,4,figsize=(12,9),subplot_kw={'xticks':(),'yticks':()})
for target,image,ax in zip(faces.target,faces.images,axes.ravel()):
    ax.imshow(image,cmap=plt.cm.gray)
    ax.set_title(faces.target_names[target])
#显示图像
plt.show()

#导入神经网络
from sklearn.neural_network import MLPClassifier
#对数据进行拆分
X_train,X_test,y_train,y_test = train_test_split(faces.data/255,faces.target,random_state=62)
#训练神经网络
mlp=MLPClassifier(hidden_layer_sizes=[100,100],random_state=62,max_iter=400)
mlp.fit(X_train,y_train)
#打印模型准确率
print('模型识别准确率:{: .2f}'.format(mlp.score(X_test,y_test)))
模型识别准确率: 0.88
#导入PCA
from sklearn.decomposition import PCA
#使用白化功能处理人脸数据
pca = PCA(whiten=True,n_components=0.9,random_state=62).fit(X_train)
X_train_whiten = pca.transform(X_train)
X_test_whiten = pca.transform(X_test)
#打印白化后数据形态
print('白化后数据形态:{}'.format(X_train_whiten.shape))
白化后数据形态:(50, 21)
#使用白化后的数据训练神经网络
mlp.fit(X_train_whiten,y_train)
#打印模型准确率
print('数据白化后模型识别准确率:{: .2f}'.format(mlp.score(X_test_whiten,y_test)))
数据白化后模型识别准确率: 0.94

2.使用非负矩阵分解用于特征提取

非负矩阵分解(Non-Negative Matrix Factorization,NMF) : 矩阵分解,就是把一个矩阵拆解为n个矩阵的乘积,而非负矩阵分解,就是原始的矩阵中所有的数值必须大于或等于0,当然分解之后的矩阵中数据也是大于或等于0的.

#############################  非负矩阵分解用于特征提取 #######################################
#导入NMF
from sklearn.decomposition import NMF
#使用NMF处理数据
nmf = NMF(n_components=15,random_state=62).fit(X_train)
X_train_nmf = nmf.transform(X_train)
X_test_nmf = nmf.transform(X_test)
#打印NMF处理后的数据形态
print('NMF处理后数据形态:{}'.format(X_train_nmf.shape))
NMF处理后数据形态:(50, 15)
#用NMF处理后的数据训练神经网络
mlp.fit(X_train_nmf,y_train)
#打印模型准确率
print('nmf处理后模型准确率:{:.2f}'.format(mlp.score(X_test_nmf,y_test)))
nmf处理后模型准确率:0.94

总结 : 

  NMF非负矩阵分解与PCA主成分分析法不同的是,如果我们降低NMF的成分数量,它会重新生成新的成分,而新的成分和原来的成分是完全不一样的,

  另外,NMF中的成分是没有顺序的,这点和PCA有是不同的.

  NMF关于n_components参数不支持使用浮点数,只能设置为正的整数型,这也是与PCA的不同之处.

文章引自 : 《深入浅出python机器学习》

猜你喜欢

转载自www.cnblogs.com/weijiazheng/p/10943485.html