SKlearn - PCA数据降维

PCA是无监督数据降维方式,目的是将一个高维数据集转换为一个低维数据集。如今我们的数据集往往有成百上千维的特征,但并不是所有的特征都很重要,通过降维,去除那些不重要的特征。数据维度的降低了,同时计算机的运算效率也得到了提升。在人工智能技术刚起步的时候,人们关注的焦点在于算法的准确性,通过不断优化算法中的计算参数,来提高运算结果的准确率。今天,随着存储与通信技术的发展,数据规模变得空前的庞大,所以运算效率变成了我们不得不考虑的问题。

假如我们有一份医患数据集,该数据集有许多患者特征,如:年龄、性别、身高、体重、职业、家庭住址、联系方式、身份证号、银行卡号、血压、血糖、心率、视力等一些列特征。这份数据集涉及到了患者的诸多隐私,是不能随便向外公开的。传统的方法是对该数据集进行匿名化处理,如将患者姓名用一串数字表示。但是在今天,通过多方面的数据匹配,仍然可以匹配出具体的患者。这时候数据降维技术就可以派上用场了,假设在降维之前,我们每一位患者有20个特征,我们的目标是把数据降到两维。这里降维不是去掉其中18个特征,保留剩下的两个特征,而是通过对20个特征进行压缩,将数据压缩成2维。降维前这20个特征,每一个都有其具体的实际含义,降维后的这两个特征是不可解释的,此时我们任何人都看不出来它的实际含义。如果我们要公开一些涉及到个人信息安全的数据集,那么在公开之前,就必须对数据集做处理。


infor security.jpg

之前我们讨论过PCA降维,整个过程我们采用的是Python的Numpy库(线性代数中的矩阵计算)来进行的,整个过程如下:
1.数据的标准化处理 - 去均值
2.计算协方差矩阵
3.计算特征向量与特征值
4.根据特征值的大小,选择前k个特征向量组成一个新的特征矩阵
5.原始数据与新的特征矩阵相乘

机器学习sklearn库直接为我们提供了PCA模块,我们可直接调用该模块对原始数据进行处理,更加简单方便。下面我们对PCA算法进行一个详细的说明。
PCA的API文档

sklearn.decomposition.PCA(n_components=None, 
copy=True, whiten=False, svd_solver=’auto’,
 tol=0.0, iterated_power=’auto’, random_state=None)

PCA算法中的参数说明,这里对官方的英文文档做一个翻译:

  • n_components:要保留的成分数量,其值类型可以设为整型,浮点型,字符串。如果不指定该值,n_components == min(n_samples, n_features);如果n_components == 'mle',并且svd_solver == 'full',则使用Minka’s MLE方法估计维度。当0 < n_components < 1时,并且svd_solver == 'full'时,方差值必须大于n_components,如果 n_components == 'arpack',则n_components必须严格的等于特征与样本数之间的最小值。
  • copy:默认为True值
  • whiten:默认为False
  • svd_solver:字符型数值,默认为auto,其余可选值有:full,arpack,randomized。算法根据数据的规模以及n_components来自动选择合适的参数。

PCA的算法属性

  • components_:特征变换空间(特征矩阵),根据我们指定的n_components = k的值,选择方差最大的k个值所对应的的特征向量组成的特征矩阵。
  • explained_variance_:n_components所对应的的方差。
  • explained_variance_ratio_:不同特征方差的占比。
  • singular_values_ :特征值,与前面的特征向量conponents_是一一对应的。

样例的演示
我们使用sklearn自带的数据集boston(波士顿地区房价数据集),该数据集有506个样本,13个特征,像房屋面积,区位,卧室数量等等以及价格(标签值)。pca是一种无监督降维算法,所以我们不使用价格数据。下面是pca的代码实现过程:

from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
from sklearn import datasets

boston_house_price = datasets.load_boston()#导入boston房价数据集
X = boston_house_price .data#获取特征数据
#第一步,对数据进行标准化处理
X_std = StandardScaler().fit_transform(X)
#实例化PCA
pca = PCA(n_components = 3)
#训练数据
pca.fit(X_std)

#使用PCA的属性查看特征值
pca.singular_values_
array([55.6793095 , 26.93022859, 25.07516773])
#使用PCA的属性查看特征值对应的特征向量
pca.components_
array([[ 0.2509514 , -0.25631454,  0.34667207,  0.00504243,  0.34285231,
        -0.18924257,  0.3136706 , -0.32154387,  0.31979277,  0.33846915,
         0.20494226, -0.20297261,  0.30975984],
       [-0.31525237, -0.3233129 ,  0.11249291,  0.45482914,  0.21911553,
         0.14933154,  0.31197778, -0.34907   , -0.27152094, -0.23945365,
        -0.30589695,  0.23855944, -0.07432203],
       [ 0.24656649,  0.29585782, -0.01594592,  0.28978082,  0.12096411,
         0.59396117, -0.01767481, -0.04973627,  0.28725483,  0.22074447,
        -0.32344627, -0.3001459 , -0.26700025]])
#对原始的数据集进行转换
new_data = X.dot(pca.components_.T)
print(new_data[:10])#打印出转换后的前十行数据做一个观察
array([[ 38.89018107,  32.93532391, -51.87396066],
       [ 33.02343232,  54.79866941, -71.20799688],
       [ 26.53873512,  48.76840918, -67.85363879],
       [ 12.75698667,  47.78351826, -72.33882223],
       [ 15.65240562,  50.77871883, -73.70920814],
       [ 17.71686561,  51.4336294 , -73.35783472],
       [ 51.22331968,  29.63835929, -51.11003359],
       [ 62.1527616 ,  38.52240664, -53.72636333],
       [ 68.87661773,  36.34017288, -53.90249412],
       [ 60.21849172,  32.80458593, -50.06565433]])
#此时的数据,我们就不知道它具体代表的什么含义了

图形化PCA降维前后的数据对比
我们用sklearn中iris花数据集来举例,该数据集有四个特征,花萼长度、花萼宽度、花瓣长度、花瓣宽度,下面是画图过程的代码实现。

iris.jpg

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from sklearn import datasets
from sklearn.decomposition import PCA

# import some data to play with
iris = datasets.load_iris()
X = iris.data[:, :2]  # we only take the first two features.
y = iris.target

x_min, x_max = X[:, 0].min() - .5, X[:, 0].max() + .5
y_min, y_max = X[:, 1].min() - .5, X[:, 1].max() + .5

plt.figure(2, figsize=(8, 6))
plt.clf()

# Plot the training points
plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Set1,
            edgecolor='k')
plt.xlabel('Sepal length')
plt.ylabel('Sepal width')

plt.xlim(x_min, x_max)
plt.ylim(y_min, y_max)
plt.xticks(())
plt.yticks(())

# To getter a better understanding of interaction of the dimensions
# plot the first three PCA dimensions
fig = plt.figure(1, figsize=(8, 6))
ax = Axes3D(fig, elev=-150, azim=110)
X_reduced = PCA(n_components=3).fit_transform(iris.data)
ax.scatter(X_reduced[:, 0], X_reduced[:, 1], X_reduced[:, 2], c=y,
           cmap=plt.cm.Set1, edgecolor='k', s=40)
ax.set_title("First three PCA directions")
ax.set_xlabel("1st eigenvector")
ax.w_xaxis.set_ticklabels([])
ax.set_ylabel("2nd eigenvector")
ax.w_yaxis.set_ticklabels([])
ax.set_zlabel("3rd eigenvector")
ax.w_zaxis.set_ticklabels([])

plt.show()

降维前,我们选取了iris数据集中的两个特征sepal length(花萼长度)和sepal width(花萼宽度)来绘制数据分布,由图可以看出,数据集中有三种花,但是三者相互混杂,难以区分清楚。


original data.png

iris数据集本有4个特征,这时我们采用pca算法,将4维数据变化为3维。从图中的结果可以看出,经过变换后,三种类别区分的更加清楚了。


pca data.png

PCA降维小结
1.实现过程有两种:Python的Numpy库;SKlearn的PCA模块,两者的计算结果是相同的。
2.数据降维的结果不一定都是好的,所以在解决实际问题,要同时计算降维前与降维后的结果,进行比较。
3.降维后的数据是不可解释的,但不影响最终的计算结果。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容