zoukankan      html  css  js  c++  java
  • 机器学习实战基础(二十二):sklearn中的降维算法PCA和SVD(三) PCA与SVD 之 重要参数n_components

     重要参数n_components 

    n_components是我们降维后需要的维度,即降维后需要保留的特征数量,降维流程中第二步里需要确认的k值,一般输入[0, min(X.shape)]范围中的整数。一说到K,大家可能都会想到,类似于KNN中的K和随机森林中的n_estimators,这是一个需要我们人为去确认的超参数,并且我们设定的数字会影响到模型的表现。

    如果留下的特征太多,就达不到降维的效果,如果留下的特征太少,那新特征向量可能无法容纳原始数据集中的大部分信息,因此,n_components既不能太大也不能太小。
    那怎么办呢?可以先从我们的降维目标说起:如果我们希望可视化一组数据来观察数据分布,我们往往将数据降到三维以下,很多时候是二维,即n_components的取值为2。

    1 迷你案例:高维数据的可视化

    1. 调用库和模块

    import matplotlib.pyplot as plt
    from sklearn.datasets import load_iris
    from sklearn.decomposition import PCA

    2. 提取数据集

    iris = load_iris()
    y = iris.target
    X = iris.data
    #作为数组,X是几维?
    X.shape
    #作为数据表或特征矩阵,X是几维?
    import pandas as pd
    pd.DataFrame(X)

    3. 建模

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

    4. 可视化

    #要将三种鸢尾花的数据分布显示在二维平面坐标系中,对应的两个坐标(两个特征向量)应该是三种鸢尾花降维后的
    x1和x2,怎样才能取出三种鸢尾花下不同的x1和x2呢?
     
    X_dr[y == 0, 0] #这里是布尔索引,看出来了么?
     
    #要展示三中分类的分布,需要对三种鸢尾花分别绘图
    #可以写成三行代码,也可以写成for循环
    
    """
    plt.figure()
    plt.scatter(X_dr[y==0, 0], X_dr[y==0, 1], c="red", label=iris.target_names[0])
    plt.scatter(X_dr[y==1, 0], X_dr[y==1, 1], c="black", label=iris.target_names[1])
    plt.scatter(X_dr[y==2, 0], X_dr[y==2, 1], c="orange", label=iris.target_names[2])
    plt.legend()
    plt.title('PCA of IRIS dataset')
    plt.show()
    """
     
    colors = ['red', 'black', 'orange']
    iris.target_names
     
    plt.figure()
    for i in [0, 1, 2]:
        plt.scatter(X_dr[y == i, 0]
                    ,X_dr[y == i, 1]
                    ,alpha=.7
                    ,c=colors[i]
                    ,label=iris.target_names[i]
                   )
    plt.legend()
    plt.title('PCA of IRIS dataset')
    plt.show()

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

    6. 探索降维后的数据

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

    7. 选择最好的n_components:累积可解释方差贡献率曲线

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

    2 最大似然估计自选超参数

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

    pca_mle = PCA(n_components="mle")
    pca_mle = pca_mle.fit(X)
    X_mle = pca_mle.transform(X)
     
    X_mle
    #可以发现,mle为我们自动选择了3个特征
     
    pca_mle.explained_variance_ratio_.sum()
    #得到了比设定2个特征时更高的信息含量,对于鸢尾花这个很小的数据集来说,3个特征对应这么高的信息含量,并不
    需要去纠结于只保留2个特征,毕竟三个特征也可以可视化

    3 按信息量占比选超参数

    输入[0,1]之间的浮点数,并且让参数svd_solver =='full',表示希望降维后的总解释性方差占比大于n_components指定的百分比,即是说,希望保留百分之多少的信息量。
    比如说,如果我们希望保留97%的信息量,就可以输入n_components = 0.97,PCA会自动选出能够让保留的信息量超过97%的特征数量。

    pca_f = PCA(n_components=0.97,svd_solver="full")
    pca_f = pca_f.fit(X)
    X_f = pca_f.transform(X)
     
    pca_f.explained_variance_ratio_
  • 相关阅读:
    阿里云 CentOS 安装JDK
    【JSP&Servlet学习笔记】5.Servlet进阶AIP、过滤器与监听器
    【JSP&Servlet学习笔记】4.会话管理
    【HeadFirst设计模式】13.与设计模式相处
    【HeadFirst设计模式】12.复合模式
    【HeadFirst设计模式】11.代理模式
    【HeadFirst设计模式】10.状态模式
    【HeadFirst设计模式】9.迭代器与组合模式
    【HeadFirst设计模式】8.模板方法模式
    【HeadFirst设计模式】7.适配器模式与外观模式
  • 原文地址:https://www.cnblogs.com/qiu-hua/p/12987969.html
Copyright © 2011-2022 走看看