无神经网络 数字识别器 0.97903

70 阅读5分钟

Digit Recognizer 🔢 (数字识别器)

使用著名的 MNIST 数据学习计算机视觉基础知识

Start.png

❤️‍🔥纯属感兴趣的选择 <( ̄︶ ̄)↗[GO!]

竞争描述🎯

MNIST


MNIST( “修改后的国家标准与技术研究所” )实际上是计算机视觉的 “你好” 数据集。

自 1999 年发布以来,这个经典的手写图像数据集一直作为基准分类算法的基础。

随着新的机器学习技术的出现,MNIST 仍然是研究人员和学习者的可靠资源。

目标


在这场比赛中,你的目标是从成千上万的手写图像数据集 正确识别数字

我们 鼓励您尝试不同的算法,以第一手了解哪些算法运行良好,以及如何比较技术。

数据集描述📑

数据文件 train.csvtest.csv 包含手绘数字的灰度图像,从 09

图像


每张图像高 28 像素,宽 28 像素, 总共 784 像素

每个像素都有一个单独地像素值,表示该像素的亮度或暗度, 数字越高表示越暗

该像素值是一个 介于 0255 之间的整数

数据集


训练数据集(train.csv)有 785 列。

第一列称为 “label” ,是用户 绘制的数字

其余的列包含关联图像的像素值。

特征值


训练集中的每个像素列都有一个类似 pixelx 的名称,其中 x0783 之间的整数,包括 0783

为了在图像上定位这个像素,假设我们将 x 分解为 x = i * 28 + j ,其中 ij 是介于 027 之间的整数。

然后 pixelx 位于 28 x 28 矩阵的第 i 行和第 j 列,(索引为 0)。

使用模型🦜

  1. 逻辑回归 LogisticRegression
  2. 支持向量机 SVC
  3. 随机森林 (Bagging) RandomForestClassifier
  4. LightGBM (Boosting) LGBMClassifier
  5. 投票 (Voting) VotingClassifier
  6. 堆叠 (Stacking) StackingClassifier

(神经网络还未学习)

# 经典三件套
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

from sklearn.model_selection import train_test_split	# 数据集分割
from sklearn.pipeline import Pipeline			# 流程化
from sklearn.preprocessing import StandardScaler		# 标准化
from sklearn.decomposition import PCA			# 降维
from sklearn.linear_model import LogisticRegression	# 别管有没有用,先逻辑回归
from sklearn.metrics import roc_auc_score			# 计算AUC
from sklearn.model_selection import cross_val_score	# 交叉验证(数据集庞大,不建议用)
from sklearn.metrics import classification_report		# 分数报告(只看准确率就行)
from sklearn.svm import SVC				# 支持向量机 (SVM)
from sklearn.ensemble import RandomForestClassifier	# 随机森林 (Bagging)
from lightgbm import LGBMClassifier, early_stopping, log_evaluation	# LightGBM (Boosting)
from sklearn.ensemble import VotingClassifier		# 投票 (Voting)
from sklearn.ensemble import StackingClassifier		# 堆叠 (Stacking)

亮点发现💡

  • 随机森林像把重要性平均分给多个特征,红色更淡且分散;

  • LGBM像放大镜聚焦在关键特征上,红色更浓。

Comparison_Chart.png

通过 随机森林(分散热力) 与 LGBM(聚焦热力) 的对比:


直观展现了 BaggingBoosting 集成方法的核心差异

—— 群体智慧优化稳定性 vs 迭代强化关键特征精准性

这种差异为模型选择 (稳定性优先特征解释性优先) 及特征工程优化方向提供了直接判据。

直白地讲


两种机器学习模型(随机森林 和 LGBM)做决策时是有 "关注点" 的差异的。

左边的 随机森林 像很多人投票,每个特征都有点用,结果更稳定但不够精准

右边的 LGBM 像学霸专攻重点,能快速抓住最关键的特征,判断更精准但容易钻牛角尖

学习总结📚

模型对比


  • 图像处理的利器是神经网络 ,而这些机器学习算法虽然也可以进行图像的多分类任务,但相较于神经网络有一定的差距。
  • MNIST 数据集的图像数量为 (42000, 28, 28) 属于大数据量,传统机器学习算法所需运行时间长。这也使得项目推进缓慢且效果一般,因此 边际效益高

名称函数最高得分对比
逻辑回归LogisticRegression0.91985数据需要标准化和降维
支持向量机SVC0.96432数据需要标准化和降维
随机森林RandomForestClassifier0.96396树模型,对数值不敏感
LightGBMLGBMClassifier0.97392树模型,对数值不敏感
投票VotingClassifier0.97660取长补短,但边际效益较高
堆叠StackingClassifier0.97903取长补短,但边际效益较高

result6_light.png

😸杂谈

虽然未学习深度学习的相关知识,但在 ❤️‍🔥兴趣使然下,我还是运用目前所掌握的知识尝试了该项目。


在本次学习的过程中,最有趣的地方莫过于 Kaggle 排名 🐌蜗牛一般的缓慢攀爬速度了 :) 。

作为一个刚刚爬完 Titanic 的 纯机器学习新手 ,这实在让人无可奈何的笑了!

只能说 🚢Titanic 确实该沉 ,它💧是真多啊:

  • 如果您也做过这个项目,您可能也觉得它 该沉
  • 如果您未做过这个项目,那么它可以给你一种 降维打击的快乐

回到本项目,除了排名的有趣,也存在着一些 🪖挑战

  • 首当其冲的就是 数据集 MNIST 的庞大 (我至今做过的最大数据量)
  • 然后就是庞大数据集带来 运行时间的指数级增长 (我就一 Inter Core i5-12500H 笔记本,能当电风扇了
  • 因此我放弃了(随机)网格搜索,只能挑战 手动搜索加运气 😣,因此我所得出的最优可能不是真正的最优(可能真正最优能够到达 0.98 以上)

收获:

  • 了解了使用 PCA 配合 StandardScaler 进行数据降维
  • 更加熟练地使用了 逻辑回归、支持向量机、随机森林、投票、堆叠
  • 基本学会了 LightGBM 的使用 (AdaBoost 和 GradientBoost 并不好用)
  • 对比了 随机森林 与 LightGBM 的特征重要性的不同 (对比图是真漂亮!)

🎯完事收工!去学深度学习去了!<( ̄︶ ̄)↗[GO!]

资源链接🪢

  1. Kaggle
  2. GitHub
  3. GitCode

数据集:Data