• 【笔记】scikit-learn中的PCA(真实数据集)


    sklearn中的PCA(真实的数据集)

    (在notebook中)

    加载好需要的内容,手写数字数据集

      import numpy as np
      import matplotlib.pyplot as plt
      from sklearn import datasets
    
      digits = datasets.load_digits()
      X = digits.data
      y = digits.target
    

    首先对数据集进行分割

      from sklearn.model_selection import train_test_split
    
      X_train,X_test,y_train,y_test = train_test_split(X,y,random_state=666)
    

    相应的在X_train中用shape可以看出来,其中有1347个样本,每个样本有64个特征
    结果如下

    我们用KNN来训练,引入方法,进行初始化以后进行fit

      %%time
      from sklearn.neighbors import KNeighborsClassifier
    
      knn_clf = KNeighborsClassifier()
      knn_clf.fit(X_train,y_train)
    

    结果如下

    看一下这样的准确度是多少

      knn_clf.score(X_test,y_test)
    

    结果如下

    这就是我们使用全部的数据集进行训练以后进行识别得到的结果

    然后我们尝试用sklearn中的PCA来进行降维

    引入并进行实例化,维度设置为2,然后进行fit操作,传入以后就可以得到X_train_reduction(对训练数据集降维以后的结果),同样,对测试数据集一样进行降维

      from sklearn.decomposition import PCA
    
      pca = PCA(n_components=2)
      pca.fit(X_train)
      X_train_reduction = pca.transform(X_train)
      X_test_reduction = pca.transform(X_test)
    

    这样就可以生成一个新的KNN识别器,同样的操作以后

      %%time
      knn_clf = KNeighborsClassifier()
      knn_clf.fit(X_train_reduction,y_train)
    

    结果如下

    可以发现计算的时间降低了非常多,这就是对于高维数据来说,将其降维到低维以后将会大大的节省计算的时间

    那么我们再来看一下这个识别器的精度如何

      knn_clf.score(X_test_reduction,y_test)
    

    结果如下

    可以发现,这个精度降低了很多,这不是能接受的,这样就有了一个矛盾,速度提升了许多但是同时精度也降低了很多,很显然两维太低了,那么我们怎么找到好一些的维度数呢,在pca中有pca.explained_variance_ratio_,这个数据就告诉我们维持的方差,那么想要方差维持最大,这就可以找到

      pca.explained_variance_ratio_
    

    结果如下(这个意思就是有两个比例,一个0.14上下,一个0.13上下,其就是两个轴,第一个轴可以解释原数据的14.5%的方差,第二个可以解释原数据13.7%的方差,也就是这个二维一共包含了方差的28%上下,剩下的全部都丢失了)

    那么我们怎么找呢

    首先实例一下pca,然后传入训练数据集对应的特征数,然后进行fit操作,并打印出

      pca.explained_variance_ratio_
    
      pca = PCA(n_components=X_train.shape[1])
      pca.fit(X_train)
      pca.explained_variance_ratio_
    

    结果如下(这就是对于主成分来说,依次的可以解释的方差是多少,这就可以表示成每一个轴的重要程度)

    这里我们做一个折线图,横轴是维度,纵轴是前i个轴解释的方差的和

      plt.plot([i for i in range(X_train.shape[1])],
         [np.sum(pca.explained_variance_ratio_[:i+1]) for i in       range(X_train.shape[1])])
    

    图像如下(通过这个图就可以看出来相应的需要的维度数以及重要程度)

    在sklearn中的PCA,如果说希望数据保持95%以上的信息,可以直接传入一个0到1的数字,即就是解释多少的方差,然后进行fit

      pca = PCA(0.95)
      pca.fit(X_train)
    

    结果如下

    使用pca.n_components_看一下需要多少的维度
    结果如下(即28个维度就可以保持95%以上)

    这时候来运行一下,同时看一下要多长时间

      X_train_reduction = pca.transform(X_train)
      X_test_reduction = pca.transform(X_test)
    
      %%time
      knn_clf = KNeighborsClassifier()
      knn_clf.fit(X_train_reduction,y_train)
    

    结果如下

    同时我们看一下这个准确度如何

      knn_clf.score(X_test_reduction,y_test)
    

    结果如下

    可以说这样的操作比全样本快,精确度虽然低,这是可以接受的,有时候是可以牺牲精度来换取时间的

    将数据降到二维也不是说一点用没有,其还可以进行可视化

      pca = PCA(n_components=2)
      pca.fit(X)
      X_reduction = pca.transform(X)
      X_reduction.shape
    

    结果如下

    此时就可以对数据进行绘制

      for i in range(10):
          plt.scatter(X_reduction[y==i,0],X_reduction[y==i,1],alpha=0.8)
    

    结果如下

    可以发现,有些数据到了二维也有很好的区分度,那么如果要使用这种数据的话,实际上用二维也是可以的

    感谢观看,文笔有限,博客不出彩,还请多多见谅
  • 相关阅读:
    Bootstrap导航条
    Bootstrap导航
    Bootstrap输入框组
    Bootstrap按钮式下拉菜单
    Bootstrap按钮组
    Bootstrap下拉菜单
    Bootstrap辅助类
    Bootstrap栅格系统
    Bootstrap学习目录
    Bootstrap图标
  • 原文地址:https://www.cnblogs.com/jokingremarks/p/14302619.html
Copyright © 2020-2023  润新知