2.2.2特征降维
特征降维是无监督学习的另一个应用,目的有二:其一,我们会经常在实际项目中遭遇特征维度非常之高的训练样本,而往往又无法借助自己的领域知识人工构建有效特征;其二,在数据表现方面,我们无法用肉眼观测超过三个维度的特征。因此,特征降维不仅重构了有效的低纬度特征向量,同时也为数据展现提供了可能。
2.2.2.1主成分分析
模型介绍:在特征降维的方法中,主成分分析是最为经典和实用的特征降维技术,特别是在辅助图像识别方面有突出表现。
线性相关矩阵计算样例
import numpy as np
#初始化一个2*2的线性相关矩阵
M=np.array([[1,2],[2,4]])
#计算2*2线性相关矩阵的秩
np.linalg.matrix_rank(M,tol=None)
我们有一组2*2的数据[[1,2],[2,4]]。假设这两个数据都反映到一个类别(分类)或者一个类簇(聚类)。如果我们的学习模型是线性模型,那么这两个数据其实只能帮助权重参数更新一次,因为他们线性相关,所有的特征数值都只是扩张了相同的倍数;如果使用pca分析的话,这个矩阵的“秩”是1,也就是说,在多样性程度上,这个矩阵只有一个自由度。
显示手写体数字图片经PCA压缩后的二维空间分布
import pandas as pd
digits_train=pd.read_csv('http://archive.ics.uci.edu/ml/machine-learning-databases/optdigits/optdigits.tra',header=None)
digits_test=pd.read_csv('http://archive.ics.uci.edu/ml/machine-learning-databases/optdigits/optdigits.tes',header=None)
#从训练与测试数据集上都分离出64维度的像素特征与1维度的数字目标
X_digits=digits_train[np.arange(64)]#64个属性值
y_digits=digits_train[64]#一个结果值
from sklearn.decomposition import PCA
#初始化一个可以将高维度特征向量(六十四维)压缩至二个维度的PCA
estimator=PCA(n_components=2)
X_pca=estimator.fit_transform(X_digits)
#显示10类手写体数字图片经PCA压缩后的二维空间分布
from matplotlib import pyplot as plt
def plot_pca_scatter():
#总共有0-9,10种手写数字,要把每一个手写数字都用二维图展现出来,为了便于区分,使用10颜色
colors=['black','blue','purple','yellow','white','red','line','cyan','orange','gray']
for i in range(len(colors)):
px=X_pca[:,0][y_digits.as_matrix()==i]#这里的[y_digits.as_matrix]主要对x_pca第一列的所有行起到选择作用,也就是说假设i=0时,
py=X_pca[:,1][y_digits.as_matrix()==i]#选择出所有训练样本的标签为0的x_pca,并将其用二维图展现出来,不同的数字用不同的颜色画出来
plt.scatter(px,py,c=colors[i])#最后,通过最终效果图可以发现,同一类型的digits基本上分布在同一块区域
plt.legend(np.arange(0,10).astype(str))
plt.xlabel('First Principle Component')
plt.ylabel('Second Priciple Component')
plt.title("PCA Scatter Plot")
plt.show()
plot_pca_scatter()
使用原始像素特征和经PCA压缩重建的低维特征,在相同配置的支持向量(分类)模型上分别进行图像识别
#对训练数据、测试数据进行特征向量(图片像素)与分类目标的分隔
X_train=digits_train[np.arange(64)]
y_train=digits_train[64]
X_test=digits_test[np.arange(64)]
y_test=digits_test[64]
#导入基于线性核的支持向量机分类器
from sklearn.svm import LinearSVC
#使用默认配置初始化LinearSVC,对原始六十四维像素特征的训练数据进行建模,并在测试数据上做出预测,存储在y_predict中。
svc=LinearSVC()
svc.fit(X_train,y_train)
y_predict=svc.predict(X_test)
#使用PCA将原六十四维的图像数据压缩到20个维度。
estimator=PCA(n_components=20)
#利用训练特征决定(fit)20个正交维度的方向,并转化(transform)原训练特征。
pca_X_train=estimator.fit_transform(X_train)
#测试特征也按照上述的20个正交维度方向进行转化(transform)
pca_X_test=estimator.transform(X_test)
#使用默认配置初始化LinearSVC,对压缩后的二十维像素特征的训练数据进行建模,并在测试数据上做出预测,存储在pca_y_predict中。
pca_svc=LinearSVC()
pca_svc.fit(pca_X_train,y_train)
pca_y_predict=pca_svc.predict(pca_X_test)
使用原始像素特征和经PCA压缩重建的低维特征,在相同配置的支持向量(分类)模型上识别性能的差异
from sklearn.metrics import classification_report
print(svc.score(X_test,y_test))
print(classification_report(y_test,y_predict,target_names=np.arange(10).astype(str)))
0.936560934891
print(pca_svc.score(pca_X_test,y_test))
print(classification_report(y_test,pca_y_predict,target_names=np.arange(10).astype(str)))
0.907067334446
尽管经过PCA特征压缩和重建之后的特征数据会损失2%左右的预测准确性,但是相比于原始数据六十四维度的特征而言,我们却使用PCA压缩并且降低了68.75%的维度。
特点分析
降维/压缩问题则是选取数据具有代表性的特征,在保持数据多样性的基础上,规避掉大量的特征冗余和早死,不过这个过程也很有可能会损失一些有用的模式信息。经过大量的实践证明,相较于损失的少部分模型性能,维度压缩能够节省大量用于模型训练的好时间。这样一来,使得pca所带来的模型综合效率变得更为划算。
网友评论