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

Machine LearningMachine LearningBeginner
今すぐ練習

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

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

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

VM のヒント

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

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

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


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL sklearn(("Sklearn")) -.-> sklearn/ModelSelectionandEvaluationGroup(["Model Selection and Evaluation"]) sklearn(("Sklearn")) -.-> sklearn/UtilitiesandDatasetsGroup(["Utilities and Datasets"]) ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) sklearn(("Sklearn")) -.-> sklearn/CoreModelsandAlgorithmsGroup(["Core Models and Algorithms"]) sklearn/CoreModelsandAlgorithmsGroup -.-> sklearn/neural_network("Neural Network Models") sklearn/ModelSelectionandEvaluationGroup -.-> sklearn/model_selection("Model Selection") sklearn/UtilitiesandDatasetsGroup -.-> sklearn/datasets("Datasets") sklearn/UtilitiesandDatasetsGroup -.-> sklearn/exceptions("Exceptions and Warnings") ml/FrameworkandSoftwareGroup -.-> ml/sklearn("scikit-learn") subgraph Lab Skills sklearn/neural_network -.-> lab-49216{{"MLP 分類器で手書き数字を分類する"}} sklearn/model_selection -.-> lab-49216{{"MLP 分類器で手書き数字を分類する"}} sklearn/datasets -.-> lab-49216{{"MLP 分類器で手書き数字を分類する"}} sklearn/exceptions -.-> lab-49216{{"MLP 分類器で手書き数字を分類する"}} ml/sklearn -.-> lab-49216{{"MLP 分類器で手書き数字を分類する"}} end

ライブラリのインポート

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

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 の最初の層の重みを可視化し、学習の挙動についての洞察を得ました。