Kaggle - Digit Recognizer(1) - 手書きの数字認識

今回からはDigit Recognizerコンペに参加していきたいと思います。

Digit Recognizer

有名な手書きの数字認識問題です。

全5回の記事でKaggleに提出することを目標とします。

データの確認

まずは必要なライブラリをインポートします。

[ソース]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import  numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import os
from tqdm import tqdm
import seaborn as sns
from sklearn.model_selection import train_test_split
import warnings
warnings.filterwarnings("ignore")

import torch
import torch.nn as nn
import torchvision
from torch.utils.data import TensorDataset, DataLoader, Dataset

訓練データと検証データを読み込み、訓練データの一部を表示します。

[ソース]

1
2
3
train_csv = pd.read_csv('../input/digit-recognizer/train.csv', dtype = np.float32)
test_csv = pd.read_csv('../input/digit-recognizer/test.csv', dtype = np.float32)
train_csv.head(5)

[結果]

正解ラベル(label)とピクセルごとの値が設定されています。

ピクセルごとのデータだとどんな数字かわかりませんが、のちほど画像として表示します。


ラベルとそれ以外にデータを分割し、Numpy配列に変換し配列の形を表示します。

[ソース]

1
2
3
4
5
labels = train_csv.pop('label')
labels = labels.to_numpy() # convert to numpy array

data = train_csv.to_numpy() / 255.0 # normalization
print('Data shape:', data.shape, 'Labels shape:', labels.shape)

[結果]

ラベルデータが42000個あり、ピクセルデータが42000個×784ピクセルあることが分かります。


ラベルデータごとの度数をグラフ化します。

[ソース]

1
2
sns.countplot(labels)
plt.title('Class Distribution')

[結果]

1から9までの数字がそれぞれ4000個前後存在することが分かります。


最後にピクセルデータを画像として表示します。

[ソース]

1
2
3
4
5
6
7
plt.figure(figsize=(12, 10))
for i in range(20):
plt.subplot(5, 4, i+1)
plt.grid(False)
plt.xticks([])
plt.yticks([])
plt.imshow(data[i].reshape(28,28))

[結果]

縦28ピクセル、横28ピクセルの手書きの数字であったことが分かります。

次回はPyTorch用にデータを変換したり、 ロジスティック回帰モデルを準備したりする予定です。