Kaggle Digit Recognizer 描述
Link: https://www.kaggle.com/c/digit-recognizer
题目描述
MNIST是计算机视觉领域的“hello world”数据集。 自1999年发布以来,这种手写图像的经典数据集已经成为基准分类算法的基础。 随着新的机器学习技术的出现,MNIST仍然是研究人员和学习者的可靠资源。
这个题目,您的目标是正确识别数以万计的手写图像数据集中的数字。 我们鼓励您尝试不同的算法,以便第一手掌握哪些方法或者技术可行。
给一张图片,图片里面写了一个数字可能是0-9,然后需要设计算法判断出这个数字是0-9中哪一个数字。
小提示
若对神经网络比较熟悉,可以直接建立一个单层神经网络,输入是784个像素,经过一个全链接层,然后激励函数和softmax,输出为一个one-hot编码的预测结果,共10个类别,分别代表0-9,选择对应概率最大的作为预测数字。
以上是没有数据预处理的方法。但如果我们对数据做一个小处理:比如提取每行像素值最大的元素和每列最大的元素,则输入数据从784维降到了28+28=56维。这个时候再经过一个单层神经网络,也可以获得一个很好的预测结果,而且由于数据降维,我们的训练时间会大大减少。
先修技能:
具有Neural Network的基本知识:
解释术语
Neural Network:在机器学习和认知科学领域,人工神经网络,是一种模仿生物神经网络的结构和功能的数学模型或计算模型,用于对函数进行估计或近似。神经网络由大量的人工神经元联结进行计算。大多数情况下人工神经网络能在外界信息的基础上改变内部结构,是一种自适应系统。现代神经网络是一种非线性统计性数据建模工具。典型的神经网络具有以下三个部分:
1、结构:结构指定了网络中的变量和它们的拓扑关系。例如,神经网络中的变量可以是神经元连接的权重和神经元的激励值。
2、激励函数:大部分神经网络模型具有一个短时间尺度的动力学规则,来定义神经元如何根据其他神经元的活动来改变自己的激励值。一般激励函数依赖于网络中的权重(即该网络的参数)。
3、学习规则:学习规则指定了网络中的权重如何随着时间推进而调整,这一般被看做是一种长时间尺度的动力学规则。一般情况下,学习规则依赖于神经元的激励值,它也可能依赖于监督者提供的目标值和当前权重的值。例如,用于手写识别的一个神经网络,有一组输入神经元,输入神经元会被输入图像的数据所激发。在激励值被加权并通过一个函数(由网络的设计者确定)后,这些神经元的激励值被传递到其他神经元。这个过程不断重复,直到输出神经元被激发。最后,输出神经元的激励值决定了识别出来的是哪个字母。
SVM:在机器学习中,支持向量机(SVM)是在分类与回归分析中分析数据的监督式学习模型与相关的学习算法。给定一组训练实例,每个训练实例被标记为属于两个类别中的一个或另一个。SVM训练算法创建一个将新的实例分配给两个类别之一的模型,使其成为非概率二元线性分类器。SVM模型是将实例表示为空间中的点,这样映射就使得单独类别的实例被尽可能宽的明显的间隔分开。然后,将新的实例映射到同一空间,并基于它们落在间隔的哪一侧来预测所属类别。
KNN:在模式识别领域中,最近邻居法(KNN算法,又译K-近邻算法)是一种用于分类和回归的非参数统计方法。在这两种情况下,输入包含特征空间中的k个最接近的训练样本。在k-NN分类中,输出是一个分类族群。一个对象的分类是由其邻居的“多数表决”确定的。k个最近邻居(k为正整数,通常较小)中最常见的分类决定了赋予该对象的类别。若k = 1,则该对象的类别直接由最近的一个节点赋予。在k-NN回归中,输出是该对象的属性值。该值是其k个最近邻居的值的平均值。
输入格式
数据文件train.csv
和test.csv
包含从0到9的手绘数字的灰度图像。
每幅图像的高度为28像素,宽度为28像素,总共为784像素。图像用灰度值表示,也就是每个像素都有一个与之相关的像素值,表示该像素的亮度或暗度,数字越高意味着越暗。这个像素值是一个0到255之间的整数。
训练数据集train.csv
有785列。第一列称为Label
,是用户绘制的数字。其余列包含关联图像的像素值。
训练集中的每个像素列都有一个名称,如pixelx,其中x是0到783之间的整数。为了在图像上定位这个像素,假设我们已经将x分解为x = i * 28 + j,其中i和j是0到27之间的整数。然后,pixelx位于28 x 28矩阵的第i行和第j列(索引为零)。
例如,像素31表示位于从左边开始的第四列的像素,以及从顶端开始的第二行,如下面的ASCII图所示。
在视觉上,如果我们省略“像素”前缀,则像素组成像这样的图像:
输出格式
您的提交文件sample_submission.csv
应采用以下格式:第一行:ImageId,Label。从第二行开始,对于测试集test.csv
中的28000个图像,每个图像对应输出一行,其中包含ImageId和您预测的数字。 例如,如果您预测第一个图像是3,第二个图像是7,第三个图像是8,那么您的提交文件将如下所示:
ImageId,Label
1,3
2,7
3,8
(27997 more lines)
目标
本次比赛的目标是拍摄一个单个的手写数字图像,并确定这个数字是什么。
对于测试集中的每个ImageId,请预测出正确的数字。
评价
使用 准确率(accuracy) 最后评判标准
TP,True Positive,将正类预测为正类的数目
FP,False Positive, 将负类预测为正类数
TN,True Negative,将负类预测为负类数
FN,False Negative,将正类预测为负类数
$$Accuracy = (TP+TN)/(TP+FN+FP+TN)$$
$$ Accuracy=\frac{TP+TN}{TP+FN+FP+TN} $$
代码与数据
train:
https://www.kaggle.com/c/digit-recognizer/download/train.csv
test:
https://www.kaggle.com/c/digit-recognizer/download/test.csv
correct_submission:
sample_submission.csv:
https://www.kaggle.com/c/digit-recognizer/download/sample_submission.csv
完整代码
(DEEP Learning version)精确度 = 1.0
https://www.kaggle.com/jiuzhang/welcome-to-deep-learning-cnn-99/
(KNN version)精确度 = 0.7
https://www.kaggle.com/jiuzhang/jiuzhang-knn-sk-learn
测评配置环境
python
pip install -U scikit-learn
pip install -U numpy
pip install pandas
测评代码
from sklearn.metrics import accuracy_score
import pandas as pd
y_test = pd.read_csv(data_dir + "correct_submission.csv") # 正确答案
y_pred = pd.read_csv(data_dir + "prediction_test.csv") # 用户预测的答案
accuracy = accuracy_score(y_test['Label'],y_pred['Label'])