3Dグラフ scikit-learn

3Dグラフ

scikit-learnを使用して、3Dグラフ化を行うために、まず問題を設定し、それを解決するサンプルコードを提供します。

ここでは、3つの特徴量を持つサンプルデータセットを使用して、分類問題を解決し、3Dプロットで可視化します。

以下は、サンプルコードの一例です。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC

# サンプルデータ生成
X, y = make_classification(n_samples=100, n_features=3, n_classes=2, n_clusters_per_class=1, n_redundant=0, random_state=42)

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

# 特徴量の標準化
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

# サポートベクトルマシン(SVM)を使って分類モデルを訓練
clf = SVC(kernel='linear', C=1)
clf.fit(X_train, y_train)

# 3Dグラフの設定
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

# グリッドの作成
xx, yy = np.meshgrid(np.linspace(X[:, 0].min(), X[:, 0].max(), 50),
np.linspace(X[:, 1].min(), X[:, 1].max(), 50))
zz = (-clf.intercept_[0] - clf.coef_[0, 0] * xx - clf.coef_[0, 1] * yy) / clf.coef_[0, 2]

# サポートベクトルのプロット
ax.scatter(X_train[:, 0], X_train[:, 1], X_train[:, 2], c=y_train, cmap=plt.cm.Paired, s=100)

# 決定境界をプロット
ax.plot_surface(xx, yy, zz, color='k', alpha=0.5)

ax.set_xlabel('Feature 1')
ax.set_ylabel('Feature 2')
ax.set_zlabel('Feature 3')

plt.show()

このコードは、3つの特徴量を持つサンプルデータを生成し、SVMを使用して二項分類モデルを訓練します。

その後、3Dグラフを使用してデータ決定境界、およびサポートベクトルを可視化します。

このコードを実行すると、3Dプロットが表示されます。

ソースコード解説

このコードは、サポートベクトルマシン(SVM)を使用して2つのクラスに分類し、その結果を3Dグラフで視覚化するものです。

1. ライブラリのインポート:

  • numpy:数値計算のためのPythonライブラリ。
  • matplotlib.pyplot:グラフの描画に使用するPythonライブラリ。
  • mpl_toolkits.mplot3d:3Dプロットを作成するためのMatplotlibのツールキット。
  • sklearn.datasets:機械学習のためのデータセットを生成するためのScikit-learnのサブモジュール。
  • sklearn.model_selection:データを訓練用とテスト用に分割するためのScikit-learnのサブモジュール。
  • sklearn.preprocessing:データの前処理(標準化)を行うためのScikit-learnのサブモジュール。
  • sklearn.svm.SVC:Scikit-learnのSVM分類器をインポート。

2. サンプルデータの生成:

  • make_classification関数を使用して、サンプルデータを生成します。
    このデータは3つの特徴量(n_features=3)と2つのクラス(n_classes=2)から成り、2つのクラスを分類するためのデータセットです。

3. データの訓練用とテスト用への分割:

  • train_test_split関数を使用して、生成されたデータセットを訓練用データとテスト用データに分割します。
    デフォルトで80%が訓練データとなり、20%がテストデータとなります。

4. 特徴量の標準化:

  • StandardScalerを使用して、特徴量を標準化(平均0、分散1)します。
    これは一般的な前処理手法で、特徴量のスケールを調整するのに役立ちます。

5. サポートベクトルマシン(SVM)を使って分類モデルを訓練:

  • SVCを使用して、線形SVM分類モデルを訓練します。
    これにより、データを最適な線形決定境界で分割し、分類モデルが作成されます。

6. 3Dグラフの設定:

  • mpl_toolkits.mplot3dを使用して、3Dプロットを設定します。
  • グリッドを作成し、決定境界を生成します。
  • サポートベクトルを3Dプロット上にプロットします。サポートベクトルは訓練データの中で特に重要なサンプルであり、分類モデルの性能に大きな影響を与えます。
  • 決定境界をプロットし、2つの異なるクラスを分ける境界を視覚化します。

7. 軸ラベル:

  • 各軸には “Feature 1”、”Feature 2”、および “Feature 3” のラベルが付いており、それぞれの軸がデータの特徴量を表しています。

8. plt.show()を使用して、3Dグラフを表示します。

このコードは、SVMを使用して分類モデルを訓練し、そのモデルの決定境界とサポートベクトルを3Dグラフで可視化するための例です。

結果解説

このグラフの主な要素とその要素の説明を行います。

1. 3Dプロット:

  • グラフは3次元空間内にあり、3つの特徴量に対応しています。
    これらの特徴量は “Feature 1”、”Feature 2”、および “Feature 3” です。

2. サポートベクトル:

  • サポートベクトルは訓練データセット内のサンプルで、分類器の決定境界に最も近いサンプルです。
    グラフ内では、サポートベクトルがプロットされており、それらは散布図内で色分けされています。
    異なる色は異なるクラスを表しており、サポートベクトルは分類器の決定境界に最も影響を与える点です。

3. 決定境界:

  • 決定境界は、2つの異なるクラスを分けるための境界線を示しています。
    この境界は、サポートベクトルマシンが学習した分類ルールに基づいて設定されており、直線として描かれています。
    境界はクラス1とクラス2を区別するための境界線であり、クラス1の点とクラス2の点が異なる側に存在します。

4. 軸ラベル:

  • 各軸には “Feature 1”、”Feature 2”、および “Feature 3” のラベルがあり、それぞれの軸がどの特徴量を表しているかを示しています。

この3Dグラフは、SVMによって学習された分類モデルが、3つの特徴量に基づいてデータを効果的に分類していることを視覚的に示しています。

境界線は、2つの異なるクラスを区別するための基準を提供し、サポートベクトルは分類器の重要な要素であることが強調されています。