はじめに
この実験では、手書き数字の分類に対するさまざまなオンラインソルバの性能を比較します。scikit-learn ライブラリを使用してデータの読み込みと前処理、および分類器の学習とテストを行います。目的は、異なる割合の学習データの下で異なるソルバがどのように機能するかを観察することです。
VM のヒント
VM の起動が完了したら、左上隅をクリックしてノートブックタブに切り替え、Jupyter Notebook を使って練習しましょう。
Jupyter Notebook の読み込みには数秒かかる場合があります。Jupyter Notebook の制限により、操作の検証は自動化できません。
学習中に問題が発生した場合は、Labby にお問い合わせください。セッション後にフィードバックを提供してください。すぐに問題を解決いたします。
データの読み込みと前処理
まず、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 分類器が同様の性能を示すことがわかりました。この比較は、特定の問題やデータセットに最適な分類器を選択するのに役立ちます。