MLP 分類器で手書き数字を分類する

Beginner

This tutorial is from open-source community. Access the source code

はじめに

このチュートリアルでは、Scikit-learn を使用して MLPClassifier を作成し、MNIST データセットから手書き数字を分類する方法を紹介します。また、MLP の最初の層の重みを可視化して、学習の挙動を理解します。

VM のヒント

VM の起動が完了したら、左上隅をクリックして Notebook タブに切り替え、Jupyter Notebook を開いて練習を始めましょう。

時々、Jupyter Notebook の読み込みに数秒かかることがあります。Jupyter Notebook の制限により、操作の検証を自動化することはできません。

学習中に問題が発生した場合は、Labby に質問してください。セッション終了後にフィードバックを提供していただければ、迅速に問題を解決します。

ライブラリのインポート

このプロジェクトで必要なライブラリをインポートします。

import warnings
import matplotlib.pyplot as plt
from sklearn.datasets import fetch_openml
from sklearn.exceptions import ConvergenceWarning
from sklearn.neural_network import MLPClassifier
from sklearn.model_selection import train_test_split

データの読み込み

次に、Scikit-learn の fetch_openml 関数を使用して MNIST データセットを読み込みます。

X, y = fetch_openml(
    "mnist_784", version=1, return_X_y=True, as_frame=False, parser="pandas"
)

データの前処理

各ピクセル値を最大ピクセル値である 255.0 で割ることで、データを正規化します。

X = X / 255.0

データの分割

train_test_split 関数を使用して、データセットを訓練データセットとテストデータセットに分割します。

X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0, test_size=0.7)

MLPClassifier の訓練

40 個のニューロンを含む単一の隠れ層を持つ MLPClassifier を作成します。リソースの制約により、MLP を 8 回の反復だけ訓練します。また、制限された反復回数内でモデルが収束しないために投げられる ConvergenceWarning をキャッチします。

mlp = MLPClassifier(
    hidden_layer_sizes=(40,),
    max_iter=8,
    alpha=1e-4,
    solver="sgd",
    verbose=10,
    random_state=1,
    learning_rate_init=0.2,
)

with warnings.catch_warnings():
    warnings.filterwarnings("ignore", category=ConvergenceWarning, module="sklearn")
    mlp.fit(X_train, y_train)

モデルの評価

訓練データセットとテストデータセットでの精度を計算することで、MLPClassifier を評価します。

print("Training set score: %f" % mlp.score(X_train, y_train))
print("Test set score: %f" % mlp.score(X_test, y_test))

重みの可視化

最後に、MLP の最初の層の重みを可視化します。4x4 のサブプロットのグリッドを作成し、各重みを 28x28 ピクセルのグレースケール画像として表示します。

fig, axes = plt.subplots(4, 4)
vmin, vmax = mlp.coefs_[0].min(), mlp.coefs_[0].max()
for coef, ax in zip(mlp.coefs_[0].T, axes.ravel()):
    ax.matshow(coef.reshape(28, 28), cmap=plt.cm.gray, vmin=0.5 * vmin, vmax=0.5 * vmax)
    ax.set_xticks(())
    ax.set_yticks(())

plt.show()

まとめ

このチュートリアルでは、Scikit-learn を使用して MLPClassifier を作成し、MNIST データセットの手書き数字を分類する方法を学びました。また、MLP の最初の層の重みを可視化し、学習の挙動についての洞察を得ました。