サポートベクターマシンの例 - 3次元を視覚化する
データ分類でよく使われるアルゴリズムの一つであるサポートベクターマシン(SVM, Support Vector Machine)は、2次元だけでなく3次元データでも強力な性能を発揮します。今回のサポートベクターマシンの例題ポストでは Pythonそして scikit-learn, matplotlib ライブラリを使用して 3次元サポートベクターマシン(SVM)を実装して、その結果を可視化する方法を集中的に見てみましょう。
3次元空間での分類境界はより複雑になる可能性がありますが、視覚化することで簡単に理解することができます。今回の例でSVMが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 SVCmpl_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)コードの説明:
- データ生成:
make_classification関数で3次元データを生成してSVMで学習できるようにします。n_features=3を使用して3次元データを作成します。 - データ分割:
train_test_splitを使ってデータを学習用とテスト用に分離します。 - SVMモデルの生成と学習:
SVCクラスを利用して線形カーネルを使うSVMモデルを生成し、学習データを通じてモデルを学習させます。 - 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の性能をより深く掘り下げてみましょう。





