主成分分析——建模模拟前夜

目录

  • PCA简单案例
    • 导入库
    • 数据构建及预览
    • 计算所有特征的方差贡献率
    • 计算降维后方差贡献率
    • 降维后数据可视化
  • 基于鸢尾花数据的主成分分析
    • 导入库
    • 导入数据查看数据
    • 调用PCA函数
    • 做出分类散点图
      • 代码解释
      • 两种方法
        • 方法一:重复写三次
        • 方法二:for循环
    • 探索降维后的数据
      • 输出降维后的可解释性方差(信息量)
      • 输出降维后的方差贡献率(信息量占比)
      • 降维后的总信息量占比
    • 选择最好的n_components(特征数)
      • 累积可解释方差贡献率曲线
      • 最大似然估计自选超参数
      • 按信息量占比选超参数
    • 最后需要强调一下
      • PCA.components的另一用法

PCA简单案例

导入库

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from sklearn.datasets.samples_generator import make_blobs
import matplotlib.pyplot as plt

数据构建及预览

#X为样本特征,Y为样本簇类别, 共1000个样本,每个样本3个特征,共4个簇
X, y = make_blobs(n_samples=10000, n_features=3, centers=[[3,3, 3], [0,0,0], [1,1,1], [2,2,2]], cluster_std=[0.2, 0.1, 0.2, 0.2],
random_state =9)
fig = plt.figure()
ax = Axes3D(fig, rect=[0, 0, 1, 1], elev=30, azim=20)
plt.scatter(X[:, 0], X[:, 1], X[:, 2],marker='o')
#先不降维,只对数据进行投影,看看投影后的三个维度的方差分布

在这里插入图片描述
主成分分析——建模模拟前夜_第1张图片

计算所有特征的方差贡献率

from sklearn.decomposition import PCA
pca = PCA(n_components=3)
pca.fit(X)
#返回所保留的n个成分各自的方差百分比
print(pca.explained_variance_ratio_)
print(pca.explained_variance_)

主成分分析——建模模拟前夜_第2张图片

计算降维后方差贡献率

#进行降维,从三维降到2维
pca1 = PCA(n_components=2)
pca1.fit(X)
print(pca1.explained_variance_ratio_)
print(pca1.explained_variance_)
#返回所保留的n个成分各自的方差百分比
'''通过对比,因为上面三个投影后的特征维度的方差分别为:
[ 3.78483785 0.03272285 0.03201892],投影到二维后选择的肯定是前两个特征,而抛弃第三个特征'''

主成分分析——建模模拟前夜_第3张图片

降维后数据可视化

#将降维后的2维数据进行可视化
X_new = pca1.transform(X)
plt.scatter(X_new[:, 0], X_new[:, 1],marker='o')
plt.show()#与原文有点不同
我使用的是pca.fit_transform(x)这个方法

主成分分析——建模模拟前夜_第4张图片

基于鸢尾花数据的主成分分析

导入库

#导入基础库
import pandas as pd
import numpy as np
#导入作图库和PCA库
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.decomposition import PCA

导入数据查看数据

#导入数据
iris = load_iris()
y = iris.target
X = iris.data
X  #查看一下X

主成分分析——建模模拟前夜_第5张图片

#作为数组,X是几维? 二维(样本和特征,大佬说套娃了几个中括号就是几维)
X.shape

在这里插入图片描述

#作为数据表或特征矩阵,X是几维? 四维(四个特征)
pd.DataFrame(X)

主成分分析——建模模拟前夜_第6张图片

调用PCA函数

#调用PCA
pca = PCA(n_components=2) #实例化,n_components表示最终降维数
pca = pca.fit(X) #拟合模型
X_dr = pca.transform(X) #获取新矩阵
X_dr
#也可以fit_transform一步到位
#X_dr = PCA(2).fit_transform(X)

主成分分析——建模模拟前夜_第7张图片
以上数据也可以画点图,但是无法区分三种类别。要将三种鸢尾花的数据分布显示在二维平面坐标系中,对应的两个坐标(两个特征向量)应该是三种鸢尾花降维后的x1和x2,怎样才能取出不同种鸢尾花下的x1和x2呢?要用:X_dr[y ==0, 0] ,这里应用的是布尔索引。

做出分类散点图

代码解释

#布尔索引
y==0#返回一个布尔矩阵

主成分分析——建模模拟前夜_第8张图片

X_dr[y==0,0]#得到y==0(第一类花)的第一列数据

主成分分析——建模模拟前夜_第9张图片

iris.target_names

在这里插入图片描述

两种方法

方法一:重复写三次

#重复写三次
plt.figure()  #建一个画布
plt.scatter(X_dr[y==0, 0], X_dr[y==0, 1], c="red", label=iris.target_names[0])  #取出标签为0的两个特征X1、X2,并标红,其对应的图下标签为setosa
plt.scatter(X_dr[y==1, 0], X_dr[y==1, 1], c="black", label=iris.target_names[1])#取出标签为1的X1、X2,并标红,其对应的图下标签为versicolor
plt.scatter(X_dr[y==2, 0], X_dr[y==2, 1], c="orange", label=iris.target_names[2])#取出标签为2的X1、X2,并标红,其对应的图下标签为virginica
plt.legend() #显示图注释(target_name分别对应哪个颜色的点
plt.title('PCA of IRIS dataset')
plt.show()

主成分分析——建模模拟前夜_第10张图片

方法二:for循环

下面二者也要按顺序循环

colors = ['red', 'black', 'orange']
iris.target_names

在这里插入图片描述

#用for循环写,其中对于012进行循环,还包括对应的颜色循环,对应的花种类循环
colors = ['red', 'black', 'orange']
iris.target_names
plt.figure()   #给一个画布
for i in [0, 1, 2]:
    plt.scatter(X_dr[y == i, 0]   #画散点图,y=i时的第0列
               ,X_dr[y == i, 1]   #y=i时的第1列
               ,alpha=.7          #为了图形好看设置的透明度,重合不会掩盖
               ,c=colors[i]       #在colors列表中按i=0,1,2进行循环
               ,label=iris.target_names[i]  #在label列表中按i=0,1,2进行循环
               )
plt.legend()
plt.title('PCA of IRIS dataset')
plt.show()

主成分分析——建模模拟前夜_第11张图片
鸢尾花的分布被展现在我们眼前了,明显这是一个分簇的分布,并且每个簇之间的分布相对比较明显,也许versicolor和virginia这两种花之间会有一些分类错误,但setosa肯定不会被分错。这样的数据很容易分类,可以遇见,KNN,随机森林,神经网络,朴素贝叶斯,Adaboost这些分类器在鸢尾花数据上,未调整的时候都可以有95%上下的准确率。

探索降维后的数据

输出降维后的可解释性方差(信息量)

想要得到降维前的只需去掉pca即可

#属性explained_variance,查看降维后每个新特征向量上所带的信息量大小(可解释性方差的大小)
pca.explained_variance_ #(因为有x1 x2,所以返回两个特征所带信息(方差),从前到后信息量逐步减少)

在这里插入图片描述

输出降维后的方差贡献率(信息量占比)

#属性explained_variance_ratio,查看降维后每个新特征向量所占的信息量占原始数据总信息量的百分比
#又叫做可解释方差贡献率
pca.explained_variance_ratio_ #大部分信息都被有效地集中在了第一个特征上

在这里插入图片描述

降维后的总信息量占比

#降维后的信息量占比
pca.explained_variance_ratio_.sum()

在这里插入图片描述

选择最好的n_components(特征数)

累积可解释方差贡献率曲线

当参数components中不填写任何值,则默认返回min(X.shape)个特征,一般来说,样本量都会大于特征数目,所以什么都不填就相当于转换了新特征空间,但没有减少特征的个数。一般来说,不会使用这种输入方式。但我们却可以使用这种输入方式来画出累计可解释方差贡献率曲线,以此选择最好的n_components的整数取值。累积可解释方差贡献率曲线是一条以降维后保留的特征个数为横坐标,降维后新特征矩阵捕捉到的可解释方差贡献率为纵坐标的曲线,能够帮助我们决定n_components最好的取值。

pca_line = PCA().fit(X)
pca_line.transform(X).shape #pca内部不写的话还是4列

在这里插入图片描述

pca_line.explained_variance_ratio_#可以通过累加这个获得累计方差贡献率的数字及图像`在这里插入代码片`

在这里插入图片描述

plt.plot([1,2,3,4],np.cumsum(pca_line.explained_variance_ratio_)) #把0123改成1234好理解一些,是四个特征
plt.xticks([1,2,3,4]) #这是为了限制坐标轴显示为整数,没有0.5 1.5 2.5
plt.xlabel("number of components after dimension reduction")#x轴名
plt.ylabel("cumulative explained variance")                 #y轴名
plt.show()                              

主成分分析——建模模拟前夜_第12张图片

最终发现可以选两个特征,也可以选三个特征。

plt.plot([1,2,3,4],np.cumsum(pca_line.explained_variance_ratio_)) #把0123改成1234好理解一些,是四个特征

最大似然估计自选超参数

除了输入整数,n_components还有哪些选择呢?之前我们提到过,矩阵分解的理论发展在业界独树一帜,勤奋智慧的数学大神Minka, T.P.在麻省理工学院媒体实验室做研究时找出了让PCA用最大似然估计(maximum likelihood estimation)自选超参数的方法,输入“mle”作为n_components的参数输入,就可以调用这种方法。

pca_mle = PCA(n_components="mle")
pca_mle = pca_mle.fit(X) #进行拟合
X_mle = pca_mle.transform(X)#导出结果
X_mle

主成分分析——建模模拟前夜_第13张图片
可以发现,mle为我们自动选择了3个特征。我们用可解释性方差比来解释为什么选三个特征:

pca_mle.explained_variance_ratio_.sum()

在这里插入图片描述

得到了比设定2个特征时更高的信息含量,对于鸢尾花这个很小的数据集来说,3个特征对应这么高的信息含量,并不需要去纠结于只保留2个特征,毕竟三个特征也可以可视化。不过对于几十万个的数据量来说计算量必然很大,可能mle会使其崩掉,可以停止。

按信息量占比选超参数

做法是让n_components等于[0,1]之间的浮点数,即确定信息量占比下界。此时必须让参数svd_solver ==‘full’。比如说,如果我们希望保留97%的信息量,就可以输入n_components = 0.97,PCA会自动选出能够让保留的信息量超过97%的特征数量。

#让n_components等于[0,1]之间的浮点数时,必须让参数svd_solver ==‘full’,表示希望降维后的总解释性方差占比大于n_components
#此时n_components指定的百分比,即是说,希望保留百分之多少的信息量。
pca_f = PCA(n_components=0.97,svd_solver="full") #PCA在分解的时候可以不使用特征值分解,而使用奇异值分解来减少计算量
pca_f = pca_f.fit(X)
X_f = pca_f.transform(X)
X_f

主成分分析——建模模拟前夜_第14张图片
此时的各特征可解释方差占比为:

pca_f.explained_variance_ratio_

在这里插入图片描述
同时可以看出此方法选择了两个特征。
可解释的总信息占比为:

pca_f.explained_variance_ratio_.sum()

在这里插入图片描述

最后需要强调一下

PCA(2).fit(X).components_ #返回了两行四列的二维数组
#反映了降维过后的新特征空间V(k,n)

在这里插入图片描述

PCA(2).fit(X).components_.shape 

在这里插入图片描述

PCA.components的另一用法

def myplot(score,coeff,labels=None):
    xs = score[:,0]
    ys = score[:,1]
    n = coeff.shape[0]

    plt.scatter(xs ,ys, c = y) #without scaling
    for i in range(n):
        plt.arrow(0, 0, coeff[i,0], coeff[i,1],color = 'r',alpha = 0.5)
        if labels is None:
            plt.text(coeff[i,0]* 1.15, coeff[i,1] * 1.15, "Var"+str(i+1), color = 'b', ha = 'center', va = 'center')
        else:
            plt.text(coeff[i,0]* 1.15, coeff[i,1] * 1.15, labels[i], color = 'o', ha = 'center', va = 'center')

plt.xlabel("PC{}".format(1))
plt.ylabel("PC{}".format(2))
plt.grid()

主成分分析——建模模拟前夜_第15张图片

myplot(X_f[:,0:2], pca. components_) 

主成分分析——建模模拟前夜_第16张图片
此图可展示所选两个主成分的方差大小?
这里有点没弄懂 来源在此

你可能感兴趣的:(数据分析,可视化,python,数据分析)