为了账号安全,请及时绑定邮箱和手机立即绑定

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

①课程介绍


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

内容导读


  • 第一部分 使用大数据MNIST进行PCA降维测试
  • 第二部分 对手写字体降到二维进行可视化处理
  • 第三部分 PCA降噪
  • 第四部分 PCA降噪可视化

②课程详细


第一部分 使用大数据MNIST进行PCA降维测试

导入函数

import numpy as np
import matplotlib
import matplotlib.pyplot as plt
from sklearn.datasets import fetch_openml

导入数据集

mnist = fetch_openml('mnist_784')

导入数据X,y

X = mnist['data']
y = mnist['target']

这个数据集帮你分好类了,不用进行train_test_split的分割

X_train = np.array(X[:60000], dtype=float)
y_train = np.array(y[:60000], dtype=float)
X_test = np.array(X[:10000], dtype=float)
y_test = np.array(y[:10000], dtype=float)

导入knn算法

from sklearn.neighbors import KNeighborsClassifier

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

对大数据手写数据集进行预测

#很慢,
%time knn_clf.score(X_test, y_test)

CPU times: total: 1min 57s
Wall time: 49.1 s
0.9818

进行PCA降维处理

from sklearn.decomposition import PCA
pca = PCA(0.9)
pca.fit(X_train)
X_train_stand = pca.transform(X_train)
X_test_stand = pca.transform(X_test)

查看前几主成分

pca.explained_variance_ratio_

降维之后进行knn算法运行查看效率

knn_clf2 = KNeighborsClassifier()
%time knn_clf2.fit(X_train_stand, y_train)

CPU times: total: 31.2 ms
Wall time: 38.7 ms
很快
进行预测

%time knn_clf2.score(X_test_stand, y_test)

CPU times: total: 42.7 s
Wall time: 26.8 s
0.9858
快了将近1倍,

第二部分 对手写字体降到二维进行可视化处理

处理数据

np.array(X[:1]).reshape(28,28)

取出单个数据用于可视化处理

some_digit = np.array(X[1:2])

查看可视化数据是多少

y[1]

'0’
这个手写数据数据是0
接下来进行可视化看看

some_digit_image = some_digit.reshape(28, 28)
plt.imshow(some_digit_image, cmap = matplotlib.cm.binary)
plt.show()

图片描述
通过可视化的手段物品们可以看出这是一个0,而我们需要机器能识别出这是0-9中的哪一个数字
接下来我们降维到三维对数据分布进行查看
降维

pca2 = PCA(n_components=3)
pca2.fit(X)
X_reduction = pca2.transform(X)

查看降维后数据的维度

X_reduction.shape

(70000, 3)

ax = plt.axes(projection='3d')
for i in range(1):
    ax.scatter3D(X_reduction[y==str(i),0], X_reduction[y==str(i),1], X_reduction[y==str(i),2], alpha=0.2)
plt.show()

图片描述
数据团成一坨了,很难分清数据,准确率可能会比较低下

第三部分 PCA降噪

导入函数

import numpy as np
import matplotlib
import matplotlib.pyplot as plt

导入数据

X =np.empty((100,2))
X[:,0] = np.random.uniform(0., 100., size=100)
X[:,1] = 0.75 * X[:,0] + 3 + np.random.normal(0, 5, size=100)

可视化

plt.scatter(X[:,0], X[:,1])
plt.show()

图片描述
进行PCA降维然后升维查看数据分布,并进行可视化

from sklearn.decomposition import PCA
pca = PCA(n_components=1)
pca.fit(X)
X_reduction = pca.transform(X)
X_restore = pca.inverse_transform(X_reduction)

进行可视化

plt.scatter(X[:,0], X[:,1])
plt.scatter(X_restore[:,0], X_restore[:,1],color='r', marker='+')
plt.show()

图片描述

第四部分 PCA降噪可视化

导入数据

from sklearn import datasets

digits = datasets.load_digits()
X = digits.data
y = digits.target

加一个正太话分布的噪音

noisy_digits = X + np.random.normal(0, 4, size=X.shape)

对可视化数据进行调整,

example_digits = noisy_digits[y==0,:][:10]
for num in range(1,10):
    example_digits = np.vstack([example_digits, noisy_digits[y==num,:][:10]])

对手写数据数据进行可视化

def plot_digits(data):
    fig, axes = plt.subplots(10, 10, figsize=(10, 10),
                             subplot_kw={'xticks':[], 'yticks':[]},
    gridspec_kw=dict(hspace=0.1, wspace=0.1)) 
    for i, ax in enumerate(axes.flat):
        ax.imshow(data[i].reshape(8, 8),
                  cmap='binary', interpolation='nearest',
                  clim=(0, 16))

    plt.show()
    
plot_digits(example_digits)

图片描述
可以看到噪音还是很多的
PCA降维,在升维,发现噪音少了很多,同样也丢失了一部分数据

components = pca.transform(example_digits)
filtered_digits = pca.inverse_transform(components)
plot_digits(filtered_digits)

图片描述
这个是处理之前的,数据,从可视化的角度可以看出确实,
在降维,升维的过程中丢失了一些信息
在降噪和关键信息间要选取一个平衡,视情况而定,调整

X_1 = X[y==0,:][:10]
for num in range(1,10):
    X_1= np.vstack([X_1, X[y==num,:][:10]])
    
plot_digits(X_1)

图片描述

③课程思考


  • 一个有意思的现象,在舍去10%的数据的信息反而准确率上升了,这说明舍去的这部分数据对最终准确率是有负相关的,也就是PCA的降噪

  • 在手写字体图片识别领域,降维算法和KNN算法可以优先考虑,很适合

④课程截图


点击查看更多内容
1人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消