【机器学习实战】使用SGD、随机森林对MNIST数据集实现多分类(jupyterbook)
创始人
2024-03-24 17:59:29
0

1. 获取数据集并重新划分数据集

# 获取MNIST数据集
from sklearn.datasets import fetch_openml
mnist = fetch_openml('mnist_784', version=1, cache=True, as_frame=False)# 查看测试器和标签
X, y = mnist['data'], mnist['target']
X_train, X_test, y_train, y_test = X[:60000], X[60000:], y[:60000], y[60000:]
# 对数据进行洗牌,防止输入许多相似实例导致的执行性能不佳
import numpy as np
shuffle_index = np.random.permutation(60000)
X_train, y_train = X_train[shuffle_index], y_train[shuffle_index]# 重新创建目标向量(以是5和非5作为二分类标准)
y_train_5 = (y_train == '5')
y_test_5 = (y_test == '5')

在这里插入图片描述

2. 使用SGD随机梯度下降进行多分类

some_digit = X[36000]from sklearn.linear_model import SGDClassifiersgd_clf = SGDClassifier(random_state=42)
sgd_clf.fit(X_train, y_train)
sgd_clf.predict([some_digit])

在这里插入图片描述

3. 对二分类算法强制使用一对一、一对多策略进行多分类

3.1 SGD

# 1. 使用OvO(一对一)策略,基于SGD创建多分类器
from sklearn.multiclass import OneVsOneClassifierovo_clf = OneVsOneClassifier(SGDClassifier(random_state=42))
ovo_clf.fit(X_train, y_train)
ovo_clf.predict([some_digit])

在这里插入图片描述

3.2 随机森林

# 1. 训练随机森林(因为随机森林本身就可以进行多分类)
from sklearn.ensemble import RandomForestClassifierforest_clf = RandomForestClassifier(random_state=42)
forest_clf.fit(X_train, y_train)
forest_clf.predict([some_digit])

在这里插入图片描述

4. 对模型进行评估(使用准确率)

4.1 数据未标准化

# 1. 使用交叉验证对SGD多分类器进行评估
from sklearn.model_selection import cross_val_scorecross_val_score(sgd_clf, X_train, y_train, cv=3, scoring="accuracy")

4.2 数据标准化后

# 2. 对训练集进行标准化,再进行评估看看
from sklearn.preprocessing import StandardScalerscaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train.astype(np.float64)) # 标准化
cross_val_score(sgd_clf, X_train_scaled, y_train, cv=3, scoring="accuracy")

在这里插入图片描述

5. 绘制混淆矩阵并进行分类错误分析

5.1 原始混淆矩阵

# 混淆矩阵
from sklearn.model_selection import cross_val_predict
from sklearn.metrics import confusion_matrix
y_train_pred = cross_val_predict(sgd_clf, X_train_scaled, y_train, cv=3)
conf_mx = confusion_matrix(y_train, y_train_pred)
# 绘制混淆矩阵的图像
import matplotlib.pyplot as pltplt.matshow(conf_mx, cmap=plt.cm.gray)
plt.show()

在这里插入图片描述

  • 结论:
    • 大多数图片都在主对角线上,说明它们被正确分类。
    • 数字5稍微暗一点,可能数据集中5的图片比较少,也可能是分类器在5上的执行效果不如其他数字好。

5.2 将正确分类的剔除后只留下错误的

# 将混淆矩阵中的每个值 除以 相应类别中的图片数量
row_sums = conf_mx.sum(axis=1, keepdims=True) # 同行相加
norm_conf_mx = conf_mx / row_sums# 用0填充对角线,保存错误,重新绘制混淆矩阵
np.fill_diagonal(norm_conf_mx, 0)
plt.matshow(norm_conf_mx, cmap=plt.cm.gray)
plt.show()

在这里插入图片描述

  • 结论:
    • 第8列、第9列比较亮,说明许多图片被错分为8和9;
    • 第8行、第9行也偏亮,说明8、9容易和其他数字混淆;
    • 行1很暗,说明大多数1都被正确分类;
    • 数字5被分成8的数量比8分成5的数量更多。

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
苏州离哪个飞机场近(苏州离哪个... 本篇文章极速百科小编给大家谈谈苏州离哪个飞机场近,以及苏州离哪个飞机场近点对应的知识点,希望对各位有...
客厅放八骏马摆件可以吗(家里摆... 今天给各位分享客厅放八骏马摆件可以吗的知识,其中也会对家里摆八骏马摆件好吗进行解释,如果能碰巧解决你...