SGD による分離ハイパープレーンの描画

Beginner

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

はじめに

この実験では、確率的勾配降下法(SGD)を用いたサポートベクターマシン(SVM)を使ってデータを分類する方法を学びます。SVM は、機械学習において分類と回帰分析に広く使われる強力な分類アルゴリズムです。SVM の背後にある考え方は、データをクラスに分離する最適なハイパープレーンをできるだけ大きなマージンで見つけることです。マージンとは、ハイパープレーンと各クラスから最も近いデータポイントとの距離です。確率的勾配降下法(SGD)は、SVM アルゴリズムの最適なパラメータを見つけるために使われる最適化アルゴリズムです。

VM のヒント

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

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

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

必要なライブラリをインポートしてデータを生成する

まず、必要なライブラリをインポートして、分類に適したデータセットを生成する必要があります。この例では、Scikit-learn のmake_blobs関数を使って 50 個の分離可能なポイントを生成します。

import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import SGDClassifier
from sklearn.datasets import make_blobs

## we create 50 separable points
X, Y = make_blobs(n_samples=50, centers=2, random_state=0, cluster_std=0.60)

SGD を使って SVM モデルを学習する

次に、SGD を使って SVM モデルを学習する必要があります。Scikit-learn のSGDClassifierクラスを使ってモデルを学習します。SVM アルゴリズムを使うためにlossパラメータを「hinge」に設定し、正則化強度を制御するためにalphaパラメータを 0.01 に設定します。また、反復回数を制限するためにmax_iterパラメータを 200 に設定します。

## fit the model
clf = SGDClassifier(loss="hinge", alpha=0.01, max_iter=200)
clf.fit(X, Y)

最大マージンを分離するハイパープレーンを描画する

最後に、SGD を使った SVM アルゴリズムで得た最大マージンを分離するハイパープレーンを描画することができます。np.meshgridを使って点のグリッドを作成し、その後、SVM モデルのdecision_functionメソッドを使ってグリッド上の各点に対する決定関数を計算します。その後、plt.contourを使って決定境界を描画し、plt.scatterを使ってデータポイントを描画します。

## plot the line, the points, and the nearest vectors to the plane
xx = np.linspace(-1, 5, 10)
yy = np.linspace(-1, 5, 10)

X1, X2 = np.meshgrid(xx, yy)
Z = np.empty(X1.shape)
for (i, j), val in np.ndenumerate(X1):
    x1 = val
    x2 = X2[i, j]
    p = clf.decision_function([[x1, x2]])
    Z[i, j] = p[0]
levels = [-1.0, 0.0, 1.0]
linestyles = ["dashed", "solid", "dashed"]
colors = "k"
plt.contour(X1, X2, Z, levels, colors=colors, linestyles=linestyles)
plt.scatter(X[:, 0], X[:, 1], c=Y, cmap=plt.cm.Paired, edgecolor="black", s=20)

plt.axis("tight")
plt.show()

まとめ

この実験では、確率的勾配降下法(SGD)を用いたサポートベクターマシン(SVM)を使ってデータを分類する方法を学びました。分類に適したデータセットを生成し、SGD を使って SVM モデルを学習し、最大マージンを分離するハイパープレーンを描画しました。SVM は、機械学習において分類と回帰分析に広く使われる強力な分類アルゴリズムです。SVM の背後にある考え方は、データをクラスに分離する最適なハイパープレーンをできるだけ大きなマージンで見つけることです。確率的勾配降下法(SGD)は、SVM アルゴリズムの最適なパラメータを見つけるために使われる最適化アルゴリズムです。