手書き数字分類のオンラインソルバの比較

Machine LearningMachine LearningBeginner
今すぐ練習

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

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

はじめに

この実験では、手書き数字の分類に対するさまざまなオンラインソルバの性能を比較します。scikit-learnライブラリを使用してデータの読み込みと前処理、および分類器の学習とテストを行います。目的は、異なる割合の学習データの下で異なるソルバがどのように機能するかを観察することです。

VMのヒント

VMの起動が完了したら、左上隅をクリックしてノートブックタブに切り替え、Jupyter Notebookを使って練習しましょう。

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

学習中に問題が発生した場合は、Labbyにお問い合わせください。セッション後にフィードバックを提供してください。すぐに問題を解決いたします。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL sklearn(("Sklearn")) -.-> sklearn/CoreModelsandAlgorithmsGroup(["Core Models and Algorithms"]) sklearn(("Sklearn")) -.-> sklearn/DataPreprocessingandFeatureEngineeringGroup(["Data Preprocessing and Feature Engineering"]) sklearn(("Sklearn")) -.-> sklearn/ModelSelectionandEvaluationGroup(["Model Selection and Evaluation"]) ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) sklearn/CoreModelsandAlgorithmsGroup -.-> sklearn/linear_model("Linear Models") sklearn/DataPreprocessingandFeatureEngineeringGroup -.-> sklearn/preprocessing("Preprocessing and Normalization") sklearn/ModelSelectionandEvaluationGroup -.-> sklearn/model_selection("Model Selection") ml/FrameworkandSoftwareGroup -.-> ml/sklearn("scikit-learn") subgraph Lab Skills sklearn/linear_model -.-> lab-49286{{"手書き数字分類のオンラインソルバの比較"}} sklearn/preprocessing -.-> lab-49286{{"手書き数字分類のオンラインソルバの比較"}} sklearn/model_selection -.-> lab-49286{{"手書き数字分類のオンラインソルバの比較"}} ml/sklearn -.-> lab-49286{{"手書き数字分類のオンラインソルバの比較"}} end

データの読み込みと前処理

まず、scikit-learnから手書き数字のデータセットを読み込み、学習用とテスト用のセットに分割します。また、データを平均0、分散1にスケーリングします。

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler

## 数字のデータセットを読み込む
X, y = datasets.load_digits(return_X_y=True)

## データを学習用とテスト用に分割する
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

## データを平均0、分散1にスケーリングする
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

分類器を定義する

分類用のいくつかのオンラインソルバを定義します。それぞれ異なるハイパーパラメータを持ちます。以下の分類器を使用します。

  • SGDClassifier
  • Perceptron
  • PassiveAggressiveClassifier
  • LogisticRegression
from sklearn.linear_model import SGDClassifier, Perceptron, PassiveAggressiveClassifier, LogisticRegression

classifiers = [
    ("SGD", SGDClassifier(max_iter=1000)),
    ("Perceptron", Perceptron(max_iter=1000)),
    ("Passive-Aggressive I", PassiveAggressiveClassifier(max_iter=1000, loss="hinge", C=1.0, tol=1e-4)),
    ("Passive-Aggressive II", PassiveAggressiveClassifier(max_iter=1000, loss="squared_hinge", C=1.0, tol=1e-4)),
    ("LogisticRegression", LogisticRegression(max_iter=1000))
]

分類器を学習して評価する

学習データの1%から95%までの異なる割合で各分類器を学習し、テストセットでの性能を評価します。このプロセスを10回繰り返して、テスト誤差率のより正確な推定値を得ます。

heldout = [0.01, 0.05, 0.25, 0.5, 0.75, 0.9, 0.95]
rounds = 10
xx = 1.0 - np.array(heldout)

for name, clf in classifiers:
    print("Training %s" % name)
    yy = []
    for i in heldout:
        yy_ = []
        for r in range(rounds):
            X_train_, X_test_, y_train_, y_test_ = train_test_split(X_train, y_train, test_size=i, random_state=r)
            clf.fit(X_train_, y_train_)
            y_pred = clf.predict(X_test_)
            yy_.append(1 - np.mean(y_pred == y_test_))
        yy.append(np.mean(yy_))
    plt.plot(xx, yy, label=name)

plt.legend(loc="upper right")
plt.xlabel("Proportion of training data")
plt.ylabel("Test error rate")
plt.show()

結果を解釈する

グラフから、SGDClassifier、Perceptron、およびPassive-Aggressive分類器は同様の性能を示し、Passive-Aggressive II分類器がやや良好な性能を示していることがわかります。LogisticRegression分類器は全体的に最も良好な性能を示し、学習データのすべての割合に対して最も低いテスト誤差率を示しています。

まとめ

この実験では、手書き数字の分類に対する異なるオンラインソルバの性能を比較しました。LogisticRegression分類器が全体的に最も良好な性能を示し、SGDClassifier、Perceptron、およびPassive-Aggressive分類器が同様の性能を示すことがわかりました。この比較は、特定の問題やデータセットに最適な分類器を選択するのに役立ちます。