MNISTは、機械学習やDeepLearningなどで最も利用されていると言えるデータセットの1つです。
主成分分析などの次元削減手法、k-meansやBMM(混合ベルヌーイモデル)、DeepLearningなどのクラスタリングなど、その利用方法は多岐にわたっており、あらゆるところで目にする機会があるのではないでしょうか。
自分でモデルを考案した時などに、MNISTを用いることは非常によくあるので、今回は自分の備忘録を兼ねて、MNISTデータセットを用意して、使う方法についてまとめていきます。
- MNISTデータセットの説明
- scikit-learnを用いてMNISTデータセットを準備する方法
- MNISTの便利な前処理 コード
MNISTデータセットとは
MNISTの読み方は、「エムニスト」であり、正式名称は、(Modified National Institute of Standards and Technology database)です。
データセットの内容は、0~9の手書き文字のデータが入っており、縦28px、横28pxで、合計784pxの白黒画像になっています。各ピクセルは、8bit つまり、0~255までの値をとります。

データセットの枚数は、訓練データとして60,000枚、テストデータが10,000枚で合計70,000ののデータセットです。
MNISTデータセットを用意する
kerasやpytorchなど、様々なライブラリがMNISTデータセットをダウンロードするコマンドを用意していますが、今回の記事ではscikit-learnを用いてMNISTデータセットを準備します。
ここでは、scikit-learn経由で、MNISTデータセットを準備し、可視化するところまでやっていきます。
まずライブラリ等々をインストールします。
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.datasets import fetch_openml
sklearnのdatasetsモジュールに含まれる、fetch_openmlは、機械学習に用いられるデータセットをダウンロードできる関数になっています。
今回は、MNISTデータセットをダウンロードしたいので、fetch_openml関数の第一引数にmnist_784を指定してダウンロードします。
mnist = fetch_openml('mnist_784', version= 1, as_frame= False)
mnistの画像本体が入ったリストを変数X、その文字が何を示しているかの正解ラベルのリストを変数yに代入します。
X, y = mnist["data"], mnist["target"]
Xとyのリストはこのようになっています。
X.shape
=> (70000, 784)
y.shape
=> (70000,)
Xのindex1番目であるX[1]の画像を表示してみましょう。ここでは、28×28の多重配列に直した上で、可視化します。
img = X[1].reshape(28, 28)
plt.imshow(img, cmap="Greys")

無事に、手書き文字の「0」を表示することができました。
MNISTデータセットの使い方・詳細編
ここでは、MNISTデータセットを扱う際にすることが多い前処理のプログラムを網羅的にまとめます。参考にしてみてください。
二値化処理を行う
MNISTのデータセットを二値化します。二値化するアルゴリズムの多数あるのですが、今回は0~255の範囲の中、ちょうど中間である128を閾値として、画像を二値化します。
# 閾値値の設定
threshold = 128
# 二値化処理
binary = (X[1] > threshold) * 1
# 画像を(28x28)の多重配列に変形して、imshowで可視化
plt.imshow(binary.reshape(28, 28), cmap="Greys")

無事に、二値化処理することができました。