继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

【九月打卡】第8天 Python3入门机器学习

黄义舜
关注TA
已关注
手记 36
粉丝 4
获赞 32

①课程介绍


课程名称:Python3入门机器学习 经典算法与应用 入行人工智能
课程章节:7-6,7-7
主讲老师:liuyubobobo

内容导读


  • 第一部分 sklearn使用实际数据进行PCA降维
  • 第二部分 PCA主成分保留信息可视化

②课程详细


第一部分 sklearn使用实际数据进行PCA降维

导入函数

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)
y_train.shape
#(1347, )
  • 对数据进行分析,一个64维的数据,应该是一个8x8的图片数据化的格式
  • 对于手写字体会有很多的空白区域,也就是不需要的信息,PCA降维的话很合适
  • 接下来就展示一下PCA降维之后的情况

在不使用降维的数据使用knn算法看看准确率

%%time
from sklearn.neighbors import KNeighborsClassifier

knn_clf = KNeighborsClassifier()
knn_clf.fit(X_train,y_train)
knn_clf.score(X_test, y_test)

CPU times: total: 172 ms
Wall time: 831 ms
KNeighborsClassifier()
0.9866666666666667
准确率和时间都很高,knn算法很适合小数据集中的手写字体

降维到两维然后knn算法运行

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)

对X_train,X_test进行PCA降维到2维,也就是大幅度压缩数据,
再用低维数据进行knn计算

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

knn运算

knn_clf.score(X_test_reduction,y_test)

0.6066666666666667
可以看到准确率降得很厉害
但是X数据原来是64个维度仅仅保留2个维度,就能达到60%的准确率,实属不易,
这个函数可以看到仅剩的两个主成分分别保留了几成信息

pca.explained_variance_ratio_

#array([0.14566817, 0.13735469])
#现在只有两维,代表这个第一个轴能解释0.14的数据,第二个轴能解释0.13的数据
#也就是剩下的72%都丢失了

第二部分 PCA主成分保留信息可视化

从第一部分我们使用这个函数可以看出降到多少维度的保留信息,那我们不进行降维,就可以看到PCA之后的主成分的分布

pca.explained_variance_ratio_

降维降到X_train.shape[1])64维,也就是不进行降维,

#这个就是对这个影响最大,到最小排列的轴,最下面几乎就不影响
pca = PCA(n_components=X_train.shape[1])
pca.fit(X_train)
pca.explained_variance_ratio_

从上到下可以清晰看出,主成分从上到下,保留的信息逐级递减,这也就是PCA的特色,14%,13%,11.7%,8.9%逐级递减的保留信息的程度
array([1.45668166e-01, 1.37354688e-01, 1.17777287e-01, 8.49968861e-02,
5.86018996e-02, 5.11542945e-02, 4.26605279e-02, 3.60119663e-02,
3.41105814e-02, 3.05407804e-02, 2.42337671e-02, 2.28700570e-02,
1.80304649e-02, 1.79346003e-02, 1.45798298e-02, 1.42044841e-02,
1.29961033e-02, 1.26617002e-02, 1.01728635e-02, 9.09314698e-03,
8.85220461e-03, 7.73828332e-03, 7.60516219e-03, 7.11864860e-03,
6.85977267e-03, 5.76411920e-03, 5.71688020e-03, 5.08255707e-03,
4.89020776e-03, 4.34888085e-03, 3.72917505e-03, 3.57755036e-03,
3.26989470e-03, 3.14917937e-03, 3.09269839e-03, 2.87619649e-03,
2.50362666e-03, 2.25417403e-03, 2.20030857e-03, 1.98028746e-03,
1.88195578e-03, 1.52769283e-03, 1.42823692e-03, 1.38003340e-03,
1.17572392e-03, 1.07377463e-03, 9.55152460e-04, 9.00017642e-04,
5.79162563e-04, 3.82793717e-04, 2.38328586e-04, 8.40132221e-05,
5.60545588e-05, 5.48538930e-05, 1.08077650e-05, 4.01354717e-06,
1.23186515e-06, 1.05783059e-06, 6.06659094e-07, 5.86686040e-07,
1.71368535e-33, 7.44075955e-34, 7.44075955e-34, 7.15189459e-34])
接下来我就对这个进行可视化

#y为保留了多少信息,x为维度
plt.plot([i for i in range(X_train.shape[1])], 
         [np.sum(pca.explained_variance_ratio_[:i]) for i in range(X_train.shape[1])])
plt.show()

图片描述
可以看出保留64个轴,能达到保留100%的程度,20个轴,能保留90%左右的数据信息
我们可以通过,百分比进行选择准确率,如下来使用pca

pca = PCA(0.95)
pca.fit(X_train)
X_train_reduction = pca.transform(X_train)
X_test_reduction = pca.transform(X_test)

查看维度

pca.n_components_

28
#降维到28个维度能保证95%的信息被保留

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

0.98
可以看出数据准确率并没有收到影响,依然很不错
接下来我要对数据降维之后进行可视化,可以很清晰的观察数据分布

pca = PCA(n_components=2)
pca.fit(X)
X_reduction = pca.transform(X)
for i in range(10):
    plt.scatter(X_reduction[y==i,0], X_reduction[y==i,1], alpha=0.8)
plt.show()

图片描述
#从二维的数据中能分析出什么信息

  • 蓝色数据,和橙色数据降到二维也能很好地进行分类
  • 有些数据不能很好地分辨可能还需要多个轴,升维才能线性可分

③课程思考


  • 对于我来说,PCA在实际中用处极大,降维升维,可谓是必不可少的操作,特别是再图像识别领域,动不动就几千几万的维度,而且很多维度的信息是不重要的,就很需要降维来进行。
  • 而PCA降维之后一般升维比较少,但是降维升维,也有比较好的降噪效果。

④课程截图



打开App,阅读手记
1人推荐
发表评论
随时随地看视频慕课网APP