课程名称:Python3入门机器学习 经典算法与应用 入行人工智能
课程章节:7-8;7-9;7-10;7-11
主讲老师:liuyubobobo
导入函数
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()
数据团成一坨了,很难分清数据,准确率可能会比较低下
导入函数
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()
导入数据
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算法可以优先考虑,很适合