サポートベクターマシンの例 - 3次元を視覚化する

データ分類でよく使われるアルゴリズムの一つであるサポートベクターマシン(SVM, Support Vector Machine)は、2次元だけでなく3次元データでも強力な性能を発揮します。今回のサポートベクターマシンの例題ポストでは Pythonそして scikit-learn, matplotlib ライブラリを使用して 3次元サポートベクターマシン(SVM)を実装して、その結果を可視化する方法を集中的に見てみましょう。

3次元空間での分類境界はより複雑になる可能性がありますが、視覚化することで簡単に理解することができます。今回の例でSVMが3次元データをどのように処理するのか確認してみましょう。

서포트 벡트 머신 예제 3차원 포스트 그림
( サポートベクトマシンの実行結果 - 3次元 )

3次元サポートベクターマシン(SVM)の理解

SVMは、データを2つのクラスに分類できる最適な境界(ハイパープレーンを見つけるアルゴリズムです。3次元では、このハイパープレーンが平面として現れ、データを異なるクラスに分けることができます。今回の例では、3つの特徴を持つデータを使用して、3D分類境界を視覚化します。

Pythonコードの段階的な説明

1.必要なライブラリのインポート

まず、3次元データを生成し、SVMを実装するために必要なライブラリを呼び出します。

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D # 3Dビジュアライゼーションのためのモジュール
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
  • mpl_toolkits.mplot3d.Axes3D: 3Dグラフを描画するために必要なモジュールです。
  • SVC: scikit-learnが提供するサポートベクターマシン(SVM)分類器です。

2.サンプルデータ作成

次に、3次元データを生成してSVMを学習させます。

# 3つの特徴を持つ3Dデータを生成します。
X, y = datasets.make_classification(n_samples=100, n_features=3, n_informative=3, n_redundant=0, random_state=42)

# 学習用とテスト用データを分離します。
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
  • n_samples=100: 100個のサンプルを生成します。
  • n_features=3: 各サンプルが3つの特徴を持つように設定します。
  • n_informative=3: 3つの特徴全てが分類に重要な情報です。

3.SVMモデルの生成と学習

生成したデータを使用してSVMモデルを学習します。

# 3DデータのためのSVMモデル生成
model = SVC(kernel='linear')

# モデル学習
model.fit(X_train, y_train)
  • kernel='linear': 線形カーネルを使用して、データ間の分類境界を見つけます。

4.SVM3D結果の可視化

これで、学習されたSVMモデルの結果を 3D可視化で確認してみましょう。 3次元では、分類境界が平面で表示されます。

# 学習されたSVMモデルの3D分類境界を視覚化する関数です。
def plot_3d_decision_boundary(X, y, model):
fig = plt.figure(figsize=(10, 8))
ax = fig.add_subplot(111, projection='3d')

#データポイントを3D空間に描画する
ax.scatter(X[:, 0], X[:, 1], X[:, 2], c=y, cmap='coolwarm', s=60, edgecolors='k')

# 境界可視化のためのグリッド設定
xlim = (X[:, 0].min(), X[:, 0].max())
ylim = (X[:, 1].min(), X[:, 1].max())
zlim = (X[:, 2].min(), X[:, 2].max())

xx, yy = np.meshgrid(np.linspace(xlim[0], xlim[1], 30)、

完全な統合コード

以下は、3次元サポートベクターマシン(SVM)モデルの全コードをコメントとともに説明した統合コードです。

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D # 3Dグラフを描画するためのモジュール
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC import SVC

# 1.3Dデータの生成
# 3つの特徴を持つ100個のサンプルを生成します。
# n_informative=3: 3つの有意な特徴のみ使用、n_redundant=0: 不要な特徴なし。
X, y = datasets.make_classification(n_samples=100, n_features=3, n_informative=3、
                                    n_redundant=0, random_state=42)

# 2.データセットを学習用とテスト用に分離します。
# 70%のデータを学習用に、30%のデータをテスト用に使用します。
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 3.SVMモデルの生成
#線形カーネルを使うSVMモデルを生成します。
model = SVC(kernel='linear')

# 4.モデル学習
#の学習データを使ってSVMモデルを学習させます。
model.fit(X_train, y_train)

# 5.3D可視化関数を定義します。
def plot_3d_decision_boundary(X, y, model):
    # 3Dグラフのためのプロット生成
    fig = plt.figure(figsize=(10, 8))
    ax = fig.add_subplot(111, projection='3d')

    # 5.1データポイントの可視化
    # 各クラスに応じて色分けして3D空間にデータを表示します。
    ax.scatter(X[:, 0], X[:, 1], X[:, 2], c=y, cmap='coolwarm', s=60, edgecolors='k')

    # 5.2 境界可視化のためのグリッド設定
    xlim = (X[:, 0].min(), X[:, 0].max())
    ylim = (X[:, 1].min(), X[:, 1].max())
    zlim = (X[:, 2].min(), X[:, 2].max())

    xx, yy = np.meshgrid(np.linspace(xlim[0], xlim[1], 30), np.linspace(ylim[0], ylim[1], 30))

    # 5.3 結晶境界平面の計算
    #線形SVMの重みと切片を利用して境界平面を定義します。
    #モデルのcoef_は、結晶境界面の傾きを表します。
    Z = (-model.coef_[0][0][0] * xx - model.coef_[0][1] * yy - model.intercept_) / model.coef_[0][2].

    # 5.4 結晶境界面の可視化
    ax.plot_surface(xx, yy, Z, color='green', alpha=0.3)

    # 5.5 軸のラベル設定
    ax.set_xlabel("Feature 1")
    ax.set_ylabel("Feature 2")
    ax.set_zlabel("Feature 3")
    ax.set_title("SVM 3D Decision Boundary")

    # 5.6 グラフ表示
    plt.show()

# 6.テストデータを使用してSVMの決定バウンダリを可視化します。
plot_3d_decision_boundary(X_test, y_test, model)

コードの説明:

  1. データ生成: make_classification 関数で3次元データを生成してSVMで学習できるようにします。 n_features=3を使用して3次元データを作成します。
  2. データ分割: train_test_splitを使ってデータを学習用とテスト用に分離します。
  3. SVMモデルの生成と学習: SVC クラスを利用して線形カーネルを使うSVMモデルを生成し、学習データを通じてモデルを学習させます。
  4. 3D可視化: mpl_toolkits.mplot3d.Axes3D モジュールを使用して3D視覚化を実装し、SVMが学習した分類境界面を視覚化します。 ax.plot_surface 関数でSVMの決定境界面を視覚化します。

よくある質問(FAQ)

Q1.3次元データでSVMの決定境界はどのように現れますか?
A1.3次元データでは、SVMの決定境界は平面として現れます。この平面は2つのクラスを分離し、SVMは最も近いデータポイント(サポートベクトル)からのこの平面の距離を最大化する方法で学習します。

Q2.カーネル関数とは何ですか?
A2.カーネル関数はSVMでデータを高次元空間に変換し、非線形データを線形に分離するのに役立つ関数です。 今回の例では、線形カーネル(リニア)を使用しましたが、RBFカーネル、多項式カーネルなど様々なカーネルが存在します。

Q3. SVMの coef_インターセプトは何ですか?
A3. coef_は SVM で結晶境界の勾配を表す値です、 インターセプトは結晶境界の切片を表します。この2つの値により、分類境界(平面)を定義することができます。

Q4.3次元データ以外にも、より高い次元のデータを可視化することはできますか?
A4.3次元までは可視化が可能ですが、4次元以上のデータは可視化ができません。 しかし、高次元データでもSVMは強力な性能を発揮します。高次元データを扱う場合は、次元削減手法(PCAなど)を用いて視覚化することができます。

Q5.非線形データの分類にもSVMは使えますか?
A5. はい、非線形データを分類する場合、RBFカーネルや多項式カーネルなどの非線形カーネルを使用してSVMを適用することができます。カーネル法を使用すると、複雑なデータ分布も効果的に分類することができます。

仕上げ

今回の記事では、Pythonを使って3次元サポートベクターマシン(SVM)を実装し、その結果を可視化する方法を紹介しました。 SVMが3次元データでどのように分類境界を設定し、学習するのか、可視化された結果から直感的に確認することができました。
実際のデータにSVMを適用してみたり、様々なカーネル関数や高次元データを使用してSVMの性能をより深く掘り下げてみましょう。

類似の投稿