簡易な手書き文字認識分類器

PythonPythonBeginner
オンラインで実践に進む

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

はじめに

このプロジェクトでは、scikit-learn ライブラリが提供する DIGITS データセットを使って、簡単な手書き文字認識分類器を構築する方法を学びます。手書き文字認識は機械学習における古典的な問題であり、このプロジェクトでは、手書き文字画像に表される数字を正確に予測できる分類器を作成するプロセスを案内します。

🎯 タスク

このプロジェクトでは、以下のことを学びます。

  • DIGITS データセットを読み込み、学習用とテスト用に分割する方法
  • 学習データに対してサポートベクターマシン(SVM)分類器を作成して学習する方法
  • 単一の手書き文字画像を分類する関数を実装する方法
  • サンプルの手書き文字画像を使って分類器をテストする方法

🏆 成果

このプロジェクトを完了すると、以下のことができるようになります。

  • 機械学習タスク用のデータセットを読み込み、前処理する
  • scikit-learn を使って SVM 分類器を作成して学習する
  • 新しいサンプルを分類する予測関数を実装する
  • 機械学習技術を使った手書き文字認識の基本を理解する

Digits データセットを読み込む

このステップでは、scikit-learn ライブラリから DIGITS データセットを読み込む方法を学びます。以下の手順に従ってこのステップを完了しましょう。

handwritten_digit_classifier.pyファイルを開き、必要なライブラリをインポートします。

from sklearn import datasets
from sklearn.model_selection import train_test_split

datasets.load_digits()関数を使って DIGITS データセットを読み込みます。

digits = datasets.load_digits()
X, y = digits.data, digits.target

X変数には 8x8 ピクセルの画像がフラット化されたものが含まれ、y変数には対応する数字のラベル(0-9)が含まれます。

train_test_split()を使ってデータセットを学習用とテスト用に分割します。

X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42
)

これにより、データが 80%の学習用と 20%のテスト用に分割されます。

✨ 解答を確認して練習

SVM 分類器を作成して学習する

このステップでは、学習データに対してサポートベクターマシン(SVM)分類器を作成して学習する方法を学びます。以下の手順に従ってこのステップを完了しましょう。

handwritten_digit_classifier.pyファイルのsklearn.svmモジュールからSVCクラスをインポートします。

from sklearn.svm import SVC

線形カーネルと正則化パラメータ 1 の SVM 分類器を作成します。

clf = SVC(kernel="linear", C=1)

fit()メソッドを使って学習データに対して SVM 分類器を学習させます。

clf.fit(X_train, y_train)

これにより、学習データに対して SVM 分類器が学習されます。

✨ 解答を確認して練習

予測関数を実装する

このステップでは、単一の手書き文字画像を分類するためのpredict(sample)関数を実装します。以下の手順に従ってこのステップを完了しましょう。

handwritten_digit_classifier.pyファイルでnumpyモジュールをインポートします。

import numpy as np

predict(sample)関数を定義します。

def predict(sample):
    """
    Parameters:
    sample -- A list of pixel values of a handwritten character image

    Returns:
    pred -- The predicted label for the handwritten character image as an integer
    """
    ## Reshape the input sample
    sample = np.array(sample).reshape(1, -1)

    ## Use the trained classifier to make a prediction
    pred = clf.predict(sample)

    return int(pred[0])

predict(sample)関数では:

  • 入力のsampleリストを NumPy 配列に変換し、学習データと同じ形式の単一のサンプルに整形します。
  • 学習済みのclf分類器を使って、predict()メソッドを用いて整形された入力サンプルのラベルを予測します。
  • 予測されたラベルを整数として返します。
✨ 解答を確認して練習

分類器をテストする

これで、サンプルの手書き文字画像を使ってpredict(sample)関数をテストすることができます。handwritten_digit_classifier.pyファイルの例を以下に示します。

sample = [
    0.0, 0.0, 6.0, 14.0, 4.0, 0.0, 0.0, 0.0,
    0.0, 0.0, 11.0, 16.0, 10.0, 0.0, 0.0, 0.0,
    0.0, 0.0, 8.0, 14.0, 16.0, 2.0, 0.0, 0.0,
    0.0, 0.0, 1.0, 12.0, 12.0, 11.0, 0.0, 0.0,
    0.0, 0.0, 0.0, 0.0, 11.0, 3.0, 0.0, 0.0,
    0.0, 0.0, 0.0, 0.0, 5.0, 11.0, 0.0, 0.0,
    0.0, 1.0, 4.0, 4.0, 7.0, 16.0, 2.0, 0.0,
    0.0, 7.0, 16.0, 16.0, 13.0, 11.0, 1.0, 0.0
]

result = predict(sample)
print("Predicted Label:", result)

これにより、与えられた手書き文字画像の予測ラベルが出力されるはずです。

handwritten_digit_classifier.pyファイルを実行して例を実行します。

python handwritten_digit_classifier.py
## Predicted Label: 9
✨ 解答を確認して練習

まとめ

おめでとうございます!このプロジェクトを完了しました。あなたは実験(Lab)をもっとたくさん行って技術力を向上させることができます。