• sklearn机器学习——day04


    降推算法PCA及实现

    PCA使用的信息量衡量指标,就是样本方差,又称可解释性方 差,方差越大,特征所带的信息量越多

                           

     案例:高维数据的可视化

    1. #调用库和模块
    2. import matplotlib.pyplot as plt
    3. from sklearn.datasets import load_iris
    4. from sklearn.decomposition import PCA
    5. #提取数据集
    6. iris = load_iris()
    7. y = iris.target
    8. X = iris.data
    9. #作为数组,X是几维?
    10. X.shape
    11. #作为数据表或特征矩阵,X是几维?
    12. import pandas as pd
    13. pd.DataFrame(X)
    14. # 建模
    15. #调用PCA
    16. pca = PCA(n_components=2) #实例化
    17. pca = pca.fit(X) #拟合模型
    18. X_dr = pca.transform(X) #获取新矩阵
    19. X_dr
    20. #也可以fit_transform一步到位
    21. #X_dr = PCA(2).fit_transform(X)
    22. #可视化
    23. #要将三种鸢尾花的数据分布显示在二维平面坐标系中,对应的两个坐标(两个特征向量)应该是三种鸢尾花降维后的
    24. x1和x2,怎样才能取出三种鸢尾花下不同的x1和x2呢?
    25. X_dr[y == 0, 0] #这里是布尔索引,看出来了么?
    26. #要展示三中分类的分布,需要对三种鸢尾花分别绘图
    27. #可以写成三行代码,也可以写成for循环
    28. """
    29. plt.figure()
    30. plt.scatter(X_dr[y==0, 0], X_dr[y==0, 1], c="red", label=iris.target_names[0])
    31. plt.scatter(X_dr[y==1, 0], X_dr[y==1, 1], c="black", label=iris.target_names[1])
    32. plt.scatter(X_dr[y==2, 0], X_dr[y==2, 1], c="orange", label=iris.target_names[2])
    33. plt.legend()
    34. plt.title('PCA of IRIS dataset')
    35. plt.show()
    36. """
    37. colors = ['red', 'black', 'orange']
    38. iris.target_names
    39. plt.figure()
    40. for i in [0, 1, 2]:
    41. plt.scatter(X_dr[y == i, 0]
    42. ,X_dr[y == i, 1]
    43. ,alpha=.7
    44. ,c=colors[i]
    45. ,label=iris.target_names[i]
    46. )
    47. plt.legend()
    48. plt.title('PCA of IRIS dataset')
    49. plt.show()

     优化调参

    累积可解释方差贡献率曲线,以此选择最好的n_components的整数取值

    1. import numpy as np
    2. pca_line = PCA().fit(X)
    3. plt.plot([1,2,3,4],np.cumsum(pca_line.explained_variance_ratio_))
    4. plt.xticks([1,2,3,4]) #这是为了限制坐标轴显示为整数
    5. plt.xlabel("number of components after dimension reduction")
    6. plt.ylabel("cumulative explained variance ratio")
    7. plt.show()

    除了输入整数,n_components还有哪些选择呢?

    最大似然估计自选超参数,找出了让PCA用最大似然估计(maximum likelihood estimation)自选超参数的方法,输入“mle”作为n_components的参数输入,就可以调用这种方法

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

    案例:人脸识别中n_components的运用

    1. from sklearn.datasets import fetch_lfw_people
    2. from sklearn.decomposition import PCA
    3. import matplotlib.pyplot as plt
    4. import numpy as np
    5. faces = fetch_lfw_people(min_faces_per_person=60)
    6. faces.images.shape
    7. #怎样理解这个数据的维度?
    8. faces.data.shape
    9. #换成特征矩阵之后,这个矩阵是什么样?
    10. X = faces.data
    11. #数据本身是图像,和数据本身只是数字,使用的可视化方法不同
    12. #创建画布和子图对象
    13. fig, axes = plt.subplots(4,5
    14. ,figsize=(8,4)
    15. ,subplot_kw = {"xticks":[],"yticks":[]} #不要显示坐标轴
    16. )
    17. fig
    18. axes
    19. #不难发现,axes中的一个对象对应fig中的一个空格
    20. #我们希望,在每一个子图对象中填充图像(共24张图),因此我们需要写一个在子图对象中遍历的循环
    21. axes.shape
    22. #二维结构,可以有两种循环方式,一种是使用索引,循环一次同时生成一列上的三个图
    23. #另一种是把数据拉成一维,循环一次只生成一个图
    24. #在这里,究竟使用哪一种循环方式,是要看我们要画的图的信息,储存在一个怎样的结构里
    25. #我们使用 子图对象.imshow 来将图像填充到空白画布上
    26. #而imshow要求的数据格式必须是一个(m,n)格式的矩阵,即每个数据都是一张单独的图
    27. #因此我们需要遍历的是faces.images,其结构是(1277, 62, 47)
    28. #要从一个数据集中取出24个图,明显是一次性的循环切片[i,:,:]来得便利
    29. #因此我们要把axes的结构拉成一维来循环
    30. axes.flat
    31. enumerate(axes.flat)
    32. #填充图像
    33. for i, ax in enumerate(axes.flat):
    34. ax.imshow(faces.images[i,:,:]
    35. ,cmap="gray" #选择色彩的模式
    36. )
    37. #https://matplotlib.org/tutorials/colors/colormaps.html
    38. #原本有2900维,我们现在来降到150维
    39. pca = PCA(150).fit(X)
    40. V = pca.components_
    41. V.shape
    42. fig, axes = plt.subplots(3,8,figsize=(8,4),subplot_kw = {"xticks":[],"yticks":[]})
    43. for i, ax in enumerate(axes.flat):
    44. ax.imshow(V[i,:].reshape(62,47),cmap="gray")

    重要接口  案例1:用人脸识别看PCA降维后的信息保存量

    1. from sklearn.datasets import fetch_lfw_people
    2. from sklearn.decomposition import PCA
    3. import matplotlib.pyplot as plt
    4. import numpy as np
    5. faces = fetch_lfw_people(min_faces_per_person=60)
    6. faces.images.shape
    7. #怎样理解这个数据的维度?
    8. faces.data.shape
    9. #换成特征矩阵之后,这个矩阵是什么样?
    10. X = faces.data
    11. pca = PCA(150)
    12. X_dr = pca.fit_transform(X)
    13. X_dr.shape
    14. X_inverse = pca.inverse_transform(X_dr)
    15. X_inverse.shape
    16. fig, ax = plt.subplots(2,10,figsize=(10,2.5)
    17. ,subplot_kw={"xticks":[],"yticks":[]}
    18. )
    19. #和2.3.3节中的案例一样,我们需要对子图对象进行遍历的循环,来将图像填入子图中
    20. #那在这里,我们使用怎样的循环?
    21. #现在我们的ax中是2行10列,第一行是原数据,第二行是inverse_transform后返回的数据
    22. #所以我们需要同时循环两份数据,即一次循环画一列上的两张图,而不是把ax拉平
    23. for i in range(10):
    24. ax[0,i].imshow(face.image[i,:,:],cmap="binary_r")
    25. ax[1,i].imshow(X_inverse[i].reshape(62,47),cmap="binary_r")

    重要接口 案例2:用PCA实现手写数字的噪音过滤

    1. from sklearn.datasets import load_digits
    2. from sklearn.decomposition import PCA
    3. import matplotlib.pyplot as plt
    4. import numpy as np
    5. digits = load_digits()
    6. digits.data.shape
    7. def plot_digits(data):
    8. fig, axes = plt.subplots(4,10,figsize=(10,4)
    9. ,subplot_kw = {"xticks":[],"yticks":[]}
    10. )
    11. for i, ax in enumerate(axes.flat):
    12. ax.imshow(data[i].reshape(8,8),cmap="binary")
    13. plot_digits(digits.data)
    14. np.random.RandomState(42)
    15. #在指定的数据集中,随机抽取服从正态分布的数据
    16. #两个参数,分别是指定的数据集,和抽取出来的正太分布的方差
    17. noisy = np.random.normal(digits.data,2)
    18. plot_digits(noisy)
    19. pca = PCA(0.5).fit(noisy)
    20. X_dr = pca.transform(noisy)
    21. X_dr.shape
    22. without_noise = pca.inverse_transform(X_dr)
    23. plot_digits(without_noise)

    案例:PCA对手写数字数据集的降维

    1. from sklearn.decomposition import PCA
    2. from sklearn.ensemble import RandomForestClassifier as RFC
    3. from sklearn.model_selection import cross_val_score
    4. import matplotlib.pyplot as plt
    5. import pandas as pd
    6. import numpy as np
    7. data = pd.read_csv(r"C:\work\learnbetter\micro-class\week 3 Preprocessing\digit
    8. recognizor.csv")
    9. X = data.iloc[:,1:]
    10. y = data.iloc[:,0]
    11. X.shape
    12. pca_line = PCA().fit(X)
    13. plt.figure(figsize=[20,5])
    14. plt.plot(np.cumsum(pca_line.explained_variance_ratio_))
    15. plt.xlabel("number of components after dimension reduction")
    16. plt.ylabel("cumulative explained variance ratio")
    17. plt.show()
    18. #======【TIME WARNING:2mins 30s】======#
    19. score = []
    20. for i in range(1,101,10):
    21. X_dr = PCA(i).fit_transform(X)
    22. once = cross_val_score(RFC(n_estimators=10,random_state=0)
    23. ,X_dr,y,cv=5).mean()
    24. score.append(once)
    25. plt.figure(figsize=[20,5])
    26. plt.plot(range(1,101,10),score)
    27. plt.show()
    28. #======【TIME WARNING:2mins 30s】======#
    29. score = []
    30. for i in range(10,25):
    31. X_dr = PCA(i).fit_transform(X)
    32. once = cross_val_score(RFC(n_estimators=10,random_state=0),X_dr,y,cv=5).mean()
    33. score.append(once)
    34. plt.figure(figsize=[20,5])
    35. plt.plot(range(10,25),score)
    36. plt.show()
    37. X_dr = PCA(23).fit_transform(X)
    38. #======【TIME WARNING:1mins 30s】======#
    39. cross_val_score(RFC(n_estimators=100,random_state=0),X_dr,y,cv=5).mean()

  • 相关阅读:
    Open3D 泊松盘网格采样
    得失权衡、主体信任与危机感知:“健康码”常态化使用的影响因素研究
    05 观察者(Observer)模式
    Python哪个版本最稳定好用2023.10.19
    差点因为算法错失腾讯offer!多亏了《程序员代码面试指南IT名企算法与数据结构题目最优解》“救了我呀”
    前端秘法基础式(HTML)(第二卷)
    Android-Firebase合规问题解决方案-详细攻略,debug模式破解难题
    vue 环境变量那些事
    Linux——守护进程
    腾讯云轻量应用服务器和云服务器的区别是什么?
  • 原文地址:https://blog.csdn.net/weixin_44267765/article/details/126778837