当前位置:   article > 正文

sklearn的系统学习——PCA降维(案例及完整python代码)_pca降维python代码

pca降维python代码

在实际操作数据集的过程中,难免会遇到很多高维特征的数据,计算量也会暴增。为了在减少计算量的同时提高算法准确率,可尝试降维

PCA(Principal Component Analysis),即主成分分析方法,是一种使用最广泛的数据降维算法。

下文将列出三个案例,分别是人脸识别、降噪和处理手写数据集。

案例一:人脸识别

  1. import matplotlib.pyplot as plt
  2. import pandas as pd
  3. from sklearn.datasets import load_iris
  4. from sklearn.ensemble import RandomForestClassifier
  5. from sklearn.model_selection import cross_val_score
  6. from sklearn.model_selection import train_test_split
  7. from sklearn.decomposition import PCA
  8. ##########人脸识别########
  9. from sklearn.datasets import fetch_lfw_people
  10. from sklearn.decomposition import PCA
  11. faces = fetch_lfw_people(min_faces_per_person=60) #每个人60张照片
  12. print(faces.data.shape) #二维 1277*2914 2914=62*47
  13. print(faces.images.shape) #三维:1277矩阵中图像个数,62每个图像的特征矩阵的行,47每个图像的特征矩阵的列
  14. x1 = faces.data
  15. #创建画布 subplots子图画布(45列)
  16. fig, axes = plt.subplots(4,5
  17. ,figsize=(8,4) #画布大小
  18. ,subplot_kw= {'xticks':[],'yticks':[]}) #不要显示坐标轴
  19. axes[0][0].imshow(faces.images[0,:,:]) #填图
  20. #循环填补 由于45列 比较复杂,所以直接1-20,方法就是将axes降维至1
  21. [* axes.flat] #惰性对象
  22. print(len([* axes.flat])) #列表没有shape
  23. [*enumerate(axes.flat)] #索引加内容的元组
  24. for i,ax in [*enumerate(axes.flat)]:
  25. ax.imshow(faces.images[i, :, :],cmap='gray') #选择色彩模式,灰色
  26. print(fig)
  27. print(axes) #axes和fig相互对应,一个框fig对应一个axes
  28. axes[0][0].imshow(faces.images[0,:,:])
  29. ####开始降维
  30. pca_face = PCA(150).fit(x1)
  31. v = pca_face.components_
  32. print(v.shape)
  33. #可视化v
  34. fig,axes = plt.subplots(3,6
  35. ,figsize=(8,4)
  36. ,subplot_kw={'xticks':[],'yticks':[]})
  37. for i,ax in enumerate(axes.flat):
  38. ax.imshow(v[i,:].reshape(62,47),cmap='gray')

案例二:降噪

  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. def plot(data):
  7. fig,axes = plt.subplots(
  8. 4,10
  9. ,figsize=(10,4)
  10. ,subplot_kw={'xticks':[],'yticks':[]}
  11. )
  12. for i,ax in enumerate(axes.flat):
  13. ax.imshow(data[i].reshape(8,8),cmap='binary')
  14. plot(digits.data)
  15. ##为图像数据添加噪音
  16. rng = np.random.RandomState(42) #规定numpy 中的随机模式
  17. #在指定的数据集中,随机抽取服从正态分布的数据。两个参数分别是指定的数据集,和抽取的正态分布的方差
  18. noisy = rng.normal(digits.data,2)#从原有的数据集中随机地抽取一个满足正态分布的数据集,第一个参数是数据集,第二个参数是方差,如果方差越大那么随机抽取的数据越凌乱,与原数据的结构一致
  19. plot(noisy)
  20. #降维50%
  21. pca = PCA(0.5,svd_solver='full').fit(noisy)
  22. x_dd = pca.transform(noisy)
  23. x_dd.shape
  24. #转回原来的维度,可视化
  25. without_noise = pca.inverse_transform(x_dd) ##必须转回去,因为plot函数的(m,n),n必须是64
  26. plot(without_noise)

案例三:手写数据集

  1. from sklearn.decomposition import PCA
  2. from sklearn.model_selection import cross_val_score
  3. from sklearn.ensemble import RandomForestClassifier as RFC
  4. import numpy as np
  5. import pandas as pd
  6. import matplotlib.pyplot as plt
  7. ####导入数据
  8. data = pd.read_csv('digit.csv')
  9. x = data.iloc[:,1:]
  10. y = data.iloc[:,0]
  11. print(x.shape)#(42000, 784)
  12. ####画累计方差贡献率曲线,找最佳降维后维度的范围u
  13. pca = PCA().fit(x) #默认参数,什么都不填数据最小维度(行42000、列784)————》784
  14. plt.figure(figsize=(20,5))
  15. plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
  16. plt.plot(np.cumsum(pca.explained_variance_ratio_))
  17. plt.xlabel('降维后的特征数目')
  18. plt.ylabel('累计可解释性方差比例之和')
  19. plt.show()
  20. #####由上图可知数据集大概在特征数量为1-100之间特征比较有用,拉出来专门绘制
  21. #####降维后的学习曲线,继续缩小最佳维度的范围
  22. # score = []
  23. # for i in range(1,101,10):
  24. # x_dr = PCA(i).fit_transform(x)
  25. # once = cross_val_score(RFC(n_estimators=10,random_state=42),x_dr,y,cv=5).mean()
  26. # score.append(once)
  27. # plt.figure(figsize=[20,5])
  28. # plt.plot(range(1,101,10),score)
  29. # plt.xlabel('特征数')
  30. # plt.ylabel('随机森林交叉验证分数')
  31. # plt.show()
  32. #####在20左右达到最高,之后平稳,所以取10-25
  33. # score = []
  34. # for i in range(10,25):
  35. # x_dr = PCA(i).fit_transform(x)
  36. # once = cross_val_score(RFC(n_estimators=10,random_state=42),x_dr,y,cv=5).mean()
  37. # score.append(once)
  38. # plt.figure(figsize=[20,5])
  39. # plt.plot(range(10,25),score)
  40. # plt.xlabel('特征数')
  41. # plt.ylabel('随机森林交叉验证分数')
  42. # plt.show()
  43. ###降到21
  44. x_dr = PCA(22).fit_transform(x)
  45. # once = cross_val_score(RFC(n_estimators=10,random_state=42),x_dr,y,cv=5).mean()
  46. # print(once) #0.9161428571428571
  47. # once1 = cross_val_score(RFC(n_estimators=100,random_state=42),x_dr,y,cv=5).mean()
  48. # print(once1) #0.9444761904761905
  49. #####此时分数已经很高了,但是相距原来的96点多,还差一些
  50. #由于已经降维到22维,所以考虑一下换模型KNN
  51. from sklearn.neighbors import KNeighborsClassifier as KNN
  52. # score_knn = cross_val_score(KNN(),x_dr,y,cv=5).mean
  53. # print(score_knn) #0.9676 这里打印出来<built-in method mean of numpy.ndarray object at 0x000001FB15A201B0>
  54. # score = []
  55. # for i in range(10):
  56. # once = cross_val_score(KNN(i+1),x_dr,y,cv=5).mean()
  57. # score.append(once)
  58. # plt.figure(figsize=[20,5])
  59. # plt.plot(range(10),score)
  60. # plt.xlabel('特征数')
  61. # plt.ylabel('KNN交叉验证分数')
  62. # plt.show() #取3的时候最大
  63. # %%timeit #jupyter里计算时间
  64. import time
  65. start = time.time()
  66. sc = cross_val_score(KNN(3),x_dr,y,cv=5).mean()
  67. end = time.time()
  68. print(sc) #0.9686666666666668
  69. print(end-start)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/106849
推荐阅读
相关标签
  

闽ICP备14008679号