【kaggle竞赛】从手写图像数据集中正确识别数字

1. 题目:

在本次比赛中,您的目标是从数以万计的手写图像数据集中正确识别数字。

1.1. Goal 目标✨

本次比赛的目标是拍摄手写个位数的图像,并确定该数字是什么。
对于测试集中的每个标签,您都应该预测正确的标签。

本次比赛的评估标准是预测的分类准确性(正确图像的百分比)。

1.2. Dataset Description 数据集描述

数据文件 train.csv 和 test.csv 包含手绘图数字的灰度图像,从 0 到 9。
每张图像高 28 像素,宽 28 像素,总共 784 像素。每个像素都有一个与之关联的像素值,表示该像素的明暗,数字越大表示越暗。此像素值是介于 0 和 255 之间的整数(含 0 和 255)。

2. 数据处理📊

2.1. python库📦

导入需要的库和包

# basic
import numpy as np
import pandas as pd

# visuals
import matplotlib.pyplot as plt
import seaborn as sns

# Scikit-learn
from sklearn.model_selection import train_test_split
from sklearn.metrics import confusion_matrix,ConfusionMatrixDisplay,classification_report

# tensorflow
from keras.models import Sequential
from keras.layers import Conv2D,Dense,Flatten,MaxPooling2D,BatchNormalization,Dropout,SpatialDropout2D
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from keras.utils import to_categorical
from tensorflow.keras.callbacks import ReduceLROnPlateau,EarlyStopping

2.2. 观察数据

train_df = pd.read_csv(r'D:\WorkSpace\Kaggle\DigitRecognizer\data\InputData\train.csv')
test_df = pd.read_csv(r'D:\WorkSpace\Kaggle\DigitRecognizer\data\InputData\test.csv')
print(train_df.shape)
print(test_df.shape)
print(train_df.head())
print(test_df.head())

train数据是42000785,test是28000784,这还是我自参加kaggle以来接触过的最大的数据了,通过784个特征列去预测一个标签值。有点挑战难度呀🤣

👻像素点都是0和1,取决于像素是黑色的还是白色的,接着观察下去吧。

打印一下描述信息:

print(train_df.describe())
print(test_df.describe())

train数据的标签值的平均值是4.45,方差为2.884,方差不是特别大,最小值是0,最大值是9,其他特征列均为0,是因为分母太大啦,test数据也是一样的情况呀。

查看一下数据是否存在缺失值,盲猜是不存在缺失值的,因为都是图片呀,只有所有的像素点都存在才能构成原始图片,像素点还是要给全的吧。(虽然不排除图像损失需要根据已有的像素点去猜测原始图像,但这一题似乎并不考察这个点😎)

print(train_df.isnull().sum())
print(test_df.isnull().sum())

👻果然如我所料,无论是train还是test的每一列都确实不存在缺失值。

数据不需要处理呀,我们也基本了解train和test数据集啦。

3. 数据探索和数据分析EDA

3.1. 📊标签值分布

这个题是数字识别器,那train训练集中的数字是如何分布的呢,均匀还是不均匀,还是需要观察一下。

sns.countplot(data=train_df, x='label', palette='icefire').set_title('train set Label Distribution')
plt.show()

一共有0-9共十个数字,train训练集中的这十个数字分布还是比较平均的,让我们之后的预测会更加简单一些,至少可以在之后的学习和理解数字背后的模式出现不平衡。

太好啦,数字都是均匀分布(撒花)🎇🎇🎇

这个配色好好看,是“icefire”冰火色。

3.2. 数据可视化

3.2.1. 将数据调整为合适的图像🖼️

看看数据集里面的这些数字是什么样子的吧。

首先先将训练集和测试集的标签和特征分开,分别存储。然后将特征列数据的值重塑为适合卷积神经网络的形状。

在卷积神经网络中,输入数据通常是一个四维张量,其形状为[bath_size,height,width,channels]=[每个训练批次的样本数量,图像的高度,图形的宽度,图像的通道数],在处理图像数据时,需要将其重塑为这种形状,以便于在卷积神经网络中使用。

将train和test数据集的特征列都重塑为适合卷积神经网络的形状,[-1,28,28,1],然后除以255,这意味着每个样本都是一个28*28的灰度图像,其中每个像素的值都在0道1之间。

然后绘制了一个2*5的图像网格,绘制了在1-1000中随机选择的训练集图像,每个图像都是它的标签。这些图像可以帮助我们可视化数据集中的图像,以确保数据集被正确的加载和处理。

最后将所有子图都输出。

labels = train_df.label
features_train = train_df.drop(columns='label')
features_test = test_df

features_train = features_train.values.reshape(-1, 28, 28, 1)
features_test = features_test.values.reshape(-1, 28, 28, 1)

features_train = features_train / 255
features_test = features_test / 255

fig, axes = plt.subplots(2, 5, figsize=(10, 5))
for i in range(2):
    for j in range(5):
        idx = np.random.randint(1, 1000)
        ax = axes[i, j]

        ax.imshow(features_train[idx], cmap='gray')
        ax.set_title(f'Label: {labels[idx]}')
        ax.axis('off')
plt.show()

很显然手写数字并不像印刷体那样规范,比如“4”,都不像一个数字,再怎么说都像一个9。

在我随机选择的同时还存在许多非常不规范的图形,比如“7”、“9”,这两个手写形状还是比较难以辨认的,要不是看Label标签,我都不敢认这是“7”和“9”🤣

3.3. 数据增强

其实我的代码中没有比较这一步,但是我看到很多大佬都做了这一步,恰好我也不知道,就顺便学习一下。

数据增强是深度学习中的一种技术,可以从已有的数据中获取更多的数据。数据增强通过对原始数据进行一系列的变换和修改,生成新的训练样本,从而扩展训练集的规模和多样性。常用的数据增强的方法包括镜像翻转、旋转、平移、剪裁、颜色变换等,这些操作可以在不改变图像语义信息的情况下引入一些变化,使模型具有更好的鲁棒性。

数据增强使用的好处,降低数据采集和数据标记的成本,通过赋予模型更多的多样性和灵活性来改进模型的泛化,提高模型在预测中的准确性,因为它使用更多的数据来训练模型,减少数据的过拟合,通过增加少数类中的样本的来处理数据集中的不平衡。

epochs = 150
batch_size = 256
test_size = 0.1
optimizer = keras.optimizers.Adam(learning_rate=0.001)

# 1.3 数据增强
X_train, X_val, y_train, y_val = train_test_split(features_train, labels, test_size=test_size, random_state=42)
train_datagen = ImageDataGenerator(
    rotation_range=18,
    width_shift_range=0.2,
    height_shift_range=0.2,
    shear_range=0.2,
    zoom_range=0.2,
    horizontal_flip=False,
)

train_datagen.fit(X_train)

train_generator = train_datagen.flow(x=X_train, y=y_train,batch_size=batch_size)

这段代码使用ImageDataGenerator类来生成一个数据增强器,数据增强器被定义为train_datagen,其中使用了一些不同的参数来指定要应用的数据增强操作,如旋转、平移、缩放等。train_datagen.fit(X_train)训练train数据集,train_generator被定义为一个生成器,它可以按批次生成增强后的训练数据

4. 构建深度学习模型🤭

Keras是一个用Python编写的深度学习的API,运行在机器学习平台Tensorflow之上,它的目的是为了让开发者能够快速实验和享受愉快的开发体验。

4.1. 构建模型

首先导入Sequential类,用于创建一个顺序模型,即按照顺序添加各种层的神经网络的模型。

model.add(Conv2D(32,3,activation=‘relu’,padding=‘same’,input_shape=(28,28,1)))这句代码表示向模型添加一个二维卷积层,该层有32个卷积核,每个卷积核的大小是33,激活函数是“relu”,填充方式是same,即保持输入和输出的尺寸相同,输入的形状是(28,28,1),即2828的灰度图像。

下一句代码相似,只是不需要指定输入的形状,因为模型可以自动推断出来。

model.add(MaxPooling2D(2))这句代码是添加一个最大池化层,该层可以对输入的特征图进行下采样,减少参数的数量,提高模型的效率,参数“2”表示池化串口的大小是2*2。

接下来是做两次几乎重复操作,仅仅增加卷积核的数量,最后一次向模型中添加一个Flatten层,该层可以将多维的输入一维化,方便后面连接全连接层。

model.add(Dense(512,activation=‘relu’));model.add(Dropout(0.2));这两句代码向模型中添加一个全连接层,该层有512个神经元,激活函数是“relu”,然后向模型中添加一个Dropout层。

model.add(Dense(10,activation=‘softmax’))这句代码是向模型中添加一个全连接层,该层有10个神经元,激活函数是“softmax”,用于输出10个类别的概率分布。

最后打印出模型的结构和参数数量。

这就是基本的机器学习中的神经网络训练。训练完这段代码后,我迫切的像安装jupter notebook,因为pycharm每次训练实在太花时间了。

model = Sequential()

model.add(Conv2D(32,3,activation='relu',padding='same',input_shape=(28,28,1)))
model.add(Conv2D(32,3, activation = 'relu', padding ='same'))
model.add(MaxPooling2D(2))


model.add(Conv2D(64,3,activation='relu',padding='same'))
model.add(Conv2D(64,3, activation = 'relu', padding ='same'))
model.add(MaxPooling2D(2))

model.add(Conv2D(128, 3, padding = 'same', activation = 'relu'))
model.add(Conv2D(128, 3, padding = 'same', activation = 'relu'))
model.add(Flatten())

model.add(Dense(512,activation='relu'))
model.add(Dropout(0.2))

model.add(Dense(10,activation='softmax'))

model.summary()

打印模型的结构以及其各参数。

![](https://img-blog.csdnimg.cn/img_convert/694e00d85b1d2578134cc7eddf382722.jpeg)

4.2. 定义回调函数

这段代码定义了两个回调函数:

第一个是learning_rate_reduction,用于验证集准确率停止提高时,降低学习率。监控的指标是验证准确率,如果在2个周期内没有提高,就出发学习率衰减,学习率衰减的因子是0.5,学习率的最小值是0.00001,学习率不能低于这个值。

第二个是early_stoping,用于在验证集损失停止下降时,提前结束训练。监控的指标是验证集损失,如果在5个周期内没有下降,就提前结束训练,可以恢复最佳权重。

learning_rate_reduction = ReduceLROnPlateau(monitor = 'val_accuracy',
                                            patience=2,
                                            factor=0.5,
                                            min_lr = 0.00001,
                                            verbose = 1)

early_stoping = EarlyStopping(monitor='val_loss',patience= 5,restore_best_weights=True,verbose=0)

4.3. 编译训练模型

这段代码首先是编译一个神经网络模型,选择“Adam”算法作为优化器,用于更新模型的权重;“分类交叉熵”作为损失函数,用于衡量模型的预测和真是标签之间的差异;评估指标选择“accuracy”准确率,用于评估模型的性能。

然后就开始训练一个神经网络模型,用训练数据和验证数据来更新模型的权重,以提高模型的性能。

使用上面定义的两个函数作为回调函数,每次训练的批量大小是10,即每次使用10个样本来更新权重,训练的总周期数是10,即重复训练30次。

model.compile(optimizer='adam',loss='categorical_crossentropy',metrics=['accuracy'])

digit = model.fit(X_train,y_train,
                  validation_data=(X_val,y_val),
                  callbacks=[learning_rate_reduction,early_stoping],
                  batch_size = 10,
                  epochs = 30,
                  verbose=1
                 )

模型最多训练30次,但是我们设定了提前停止的函数,如果val_accuracy连续5次没有出现下降就停止,模型训练时的精确度为0.9995。

4.4. 评估训练和验证数据的准确性和损失😘

分别使用evaluate函数对训练数据和测试数据进行评估,以计算模型的性能指标。

loss,acc = model.evaluate(X_train,y_train,batch_size = 10, verbose = 0)

print('The accuracy of the model for training data is:',acc*100)
print('The Loss of the model for training data is:',loss)

# Evaluvate for validation generator
loss,acc = model.evaluate(X_val,y_val,batch_size = 10, verbose = 0)

print('The accuracy of the model for validation data is:',acc*100)
print('The Loss of the model for validation data is:',loss)

使用evaluate函数进行模型评估,train数据集的精确度和损失度分别为99.833和0.00534;test数据集的精确度和损失度分别为99.1369和0.40。

4.5. 绘制损失和准确率曲线图🥰

将模型训练的历史记录转换为一个数据框,包括训练集和验证集的损失和准确率。

error = pd.DataFrame(digit.history)

plt.figure(figsize=(18,5),dpi=200)
sns.set_style('darkgrid')

plt.subplot(121)
plt.title('Cross Entropy Loss',fontsize=15)
plt.xlabel('Epochs',fontsize=12)
plt.ylabel('Loss',fontsize=12)
plt.plot(error['loss'])
plt.plot(error['val_loss'])

plt.subplot(122)
plt.title('Classification Accuracy',fontsize=15)
plt.xlabel('Epochs',fontsize=12)
plt.ylabel('Accuracy',fontsize=12)
plt.plot(error['accuracy'])
plt.plot(error['val_accuracy'])

plt.show()

左边的那幅图是交叉熵损失降低的图,右边是分类的精确度。前面的几轮训练,交叉熵损失飞快降低,分类精确度也对应增加,这是因为前几轮训练会非常规范的数据的精确度,随着训练的轮次增加,模型训练精度逐渐放缓。

5. 数据预测📊

(终于到预测啦🎉)

现在将预测和评估创建的测试数据集的标签。

batch_size表示每次预测的批量大小。

使用np.argmax函数,从result的每一行中找出最大数值的下标,返回一个一维数组。

result = model.predict(X_test, batch_size = 10,verbose = 0)

y_pred = np.argmax(result, axis = 1)

5.1. 评估模型性能

评估测试数据的准确率,用百分比表示,然后打印测试数据的损失。

loss,acc = model.evaluate(X_test,y_test, batch_size = 10, verbose = 0)

print('The accuracy of the model for testing data is:',acc*100)
print('The Loss of the model for testing data is:',loss)

测试集的精确度是98.869,损失率是0.044.

5.2. 创建测试数据的分类报告

print(classification_report(y_true, y_pred,target_names=labels))

0-9这十个数字预测数据的精度都达到了98%以上,训练结果很不错🎊

5.3. 创建测试数据的混淆矩阵

混淆矩阵是一种用于评估分类模型性能的表格,它显示了模型对每个类别的预测情况,以及预测正确和错误的数量。

使用了confusion_matrix函数,根据真实标签y_true和预测标签y_pred,计算混淆矩阵。

混淆矩阵绘制为热力图,使用seaborn库的heatmap完成。

confusion_mtx = confusion_matrix(y_true,y_pred)

sns.set_style('ticks')
f,ax = plt.subplots(figsize = (20,8),dpi=200)
sns.heatmap(confusion_mtx, annot=True, linewidths=0.1, cmap = "gist_yarg_r", linecolor="black", fmt='.0f', ax=ax,cbar=False, xticklabels=labels, yticklabels=labels)

plt.xlabel("Predicted Label",fontsize=10)
plt.ylabel("True Label",fontsize=10)
plt.title("Confusion Matrix",fontsize=13)

plt.show()

5.4. 预测测试数据

test_data = reshape(test)

# prediction
pred = model.predict(test_data, batch_size = 10,verbose = 0)

prediction = np.argmax(pred, axis = 1)

submission = pd.read_csv('D:\WorkSpace\Kaggle\DigitRecognizer\data\OutputData\sample_submission.csv')

submission['Label'] = prediction

submission.head()

submission.to_csv(r'D:\WorkSpace\Kaggle\DigitRecognizer\data\OutputData\predict.csv,index=False)

打印一下需要提交数据的格式。

5.5. 提交数据

在kaggle上提交答案,看一下能对多少。

公榜上是329名,还是大佬的模型好啊。

这个题对于我来说很难,深度学习我也没有学习过,更多的是去参考了一些大佬的文章,跑通了baseline,也只是写文章记录下来。

前两天听讲座,认识一个kaggle大佬,参加kaggle竞赛,拿了很多奖金,今年秋招,拿了一个25k的offer,这是我努力的方向,学习目标,加油!🥰

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/466899.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

《我的AUTOSAR之路》ECUM(二) 唤醒处理

ECUM唤醒 1 EcuM 唤醒源2 EcuM 唤醒源配置3 Can 通道唤醒源调用解析1 EcuM 唤醒源 AUTOSAR 唤醒过程包含的步骤 检查唤醒源和上报唤醒时间唤醒源保护唤醒过程是独立于 EcuM 休眠阶段的,但是唤醒时间可以用于休眠阶段 在整个 Ecu 所有阶段,唤醒事件都可以存在唤醒不单单指 Ecu …

【Nutx3】middleware目录介绍

简言 记录下nuxt3middleware目录的使用方法。 middleware middleware是存放路由中间件的文件目录。 路由中间件有三种: 匿名(或内联)路由中间件直接在页面中定义。已命名的路由中间件,放在 middleware/ 中,页面使用…

4.1_4 文件的物理结构

文章目录 4.1_4 文件的物理结构(一)文件块、磁盘块(二)文件分配方式——连续分配(三)文件分配方式——链接分配(1)链接分配——隐式链接(2)链接分配——显式链…

慢sql优化

1.避免使用select *,而是明确列出需要的列, 2.小表驱动大表,in适用于左边大表,右边小表。 exists适用于左边小表,右边大表。 3.批量操作:如果每次插入数据库数据,都要连接一次数据库&#xf…

若依 ruoyi-cloud [网关异常处理]请求路径:/system/user/getInfo,异常信息:404

这里遇到的情况是因为nacos中的配置文件与项目启动时的编码不一样,若配置文件中有中文注释,那么用idea启动项目的时候,在参数中加上 -Dfile.encodingutf-8 ,保持编码一致,(用中文注释的配置文件&#xff0c…

杂货铺 | vscode配置C/C++环境(亲测极简ver)

文章目录 📚Step1:下载安装VSCode📚Step2:下载安装g📚Step3:编辑环境变量📚Step4:安装vscode插件📚Step5:建好文件夹⭐️📚Step6:开始…

linux(Ubuntu22) 一篇带你学会Linux,详细篇

Linux 简介 精通Linux,自带python,系统开源 电脑可安装双系统 c盘安装win D盘安装linux 在一套硬件上只能同时运行一个操作系统 虚拟机 模拟真实环境 在虚拟机内运行操作系统 需要硬件支持虚拟化 开启VT-X VM…

深度剖析:数字经济下人工智能水平的新测算模型数据集

数据来源:企业年报时间跨度:1991-2022年数据范围:各企业数据指标: 年份 股票代码 公司名称 总词频 词频加1取对数 人工智能 计算机视觉 图像识别 知识图谱 智能教育 增强现实 智能政务 特征提…

【小迪安全】学习cho1

介绍了一些名词: POC、EXP、Payload与Shellcode nc -lvvp 端口号 监听服务器端口 个人用机使用最多的是:windows10 服务器用机使用最多的是:Windows8,12,16 流量被防火墙拦截了,到这里进行给与权限 文件…

资深HR是如何做人力资源管理的?企业人力资源该如何分析?

人力资源管理旨在通过招聘、甄选、培训、薪酬、绩效、职业规划等多方面的有效手段,科学合理地管理企业的人力资源,以满足当前及未来的发展需求,并确保实现企业既定目标。在人才竞争激烈的时代,许多初涉人力资源领域的从业者都对人…

python 深度学习 记录遇到的报错问题12

本篇继python 深度学习 记录遇到的报错问题11_undefined symbol: __nvjitlinkadddata_12_1, version-CSDN博客 目录 一、AttributeError: module ‘tensorflow‘ has no attribute ‘app‘ 二、AttributeError: module tensorflow has no attribute placeholder 三、Attribu…

html密码访问单页自定义跳转页面源码

内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 三、学习资料下载 一、详细介绍 密码访问单页自定义跳转页面,修改了的密码访问单页,添加了js自定义密码跳转页面。需要正确输入密码才能跳转目标网址。 二、效果展示 1.部分代码 代码如下&…

9. 编程常见错误归类

编程常见错误归类 9.1 编译型错误9.2 链接型错误9.3 运行时错误 9.1 编译型错误 编译型错误⼀般都是语法错误,这类错误⼀般看错误信息就能找到⼀些蛛丝马迹的,双击错误信息也能初步的跳转到代码错误的地方或者附近。编译错误,随着语言的熟练…

2024蓝桥杯每日一题(DFS)

备战2024年蓝桥杯 -- 每日一题 Python大学A组 试题一:奶牛选美 试题二:树的重心 试题三:大臣的差旅费 试题四:扫雷 试题一:奶牛选美 【题目描述】 听说最近两斑点的奶牛最受欢迎,…

【云呐】固定资产管理系统的功能有哪些?管理工具

为了提高经营效率,降低企业成本,许多企业选择固定资产管理系统。那么,固定资产管理系统有什么作用呢? 资产登记:  固定资产管理系统可以方便地登记公司的固定资产,包括资产名称、规格型号、购买日期、使…

18个惊艳的可视化大屏(第26辑):航空与运输业

hello,我是贝格前端工场老司机,这是第26期了,本次带来可视化大屏在航空与运输业的应用案例,喜欢文章的别忘点赞关注,文章底部也有其他行业的案例。 可视化大屏在航空与运输业中具有以下九大价值: 实时监控…

新火种AI|英伟达GTC大会在即,它能否撑住场面,为AI缔造下一个高度?

作者:小岩 编辑:彩云 英伟达不完全属于AI行业,但神奇的是,整个AI领域都有着英伟达的传说。因为几乎所有的AI巨头都需要英伟达的芯片来提供算力支持。 也正因此,纵使AI赛道人来人往,此起彼伏,…

Netty中的核心概念

事件传播机制 当pipeline中有多个handler时,netty内部的事件是如何向后传递到每个handler中的? 结论:需要在当前handler中手动将当前事件传递下去 1,如果handler是直接实现的接口,使用ChannelHandlerContext的fireXXX…

针对BSV区块链新推出的网络访问规则NAR和警报系统AS的解释与问答

​​发表时间:2024年2月22日 BSV区块链社区团队最近开设了一个Twitter(X)话题空间,讨论BSV区块链协会最新推出的网络访问规则和警报系统的相关问题。 本次讨论由BSV区块链社区负责人Brett Banfe主持,以便社区成员更好…

【开源】SpringBoot框架开发毕业生追踪系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 登陆注册模块2.2 学生基本配置模块2.3 就业状况模块2.4 学历深造模块2.5 信息汇总分析模块2.6 校友论坛模块 三、系统设计3.1 用例设计3.2 实体设计 四、系统展示五、核心代码5.1 查询我的就业状况5.2 初始化就业状况5.…