技術共有

【機械学習】機械学習におけるサポートベクターマシンと主成分分析の応用

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

サポート ベクター マシン (SVM) は、線形および非線形の分類、回帰、および外れ値の検出に適した強力で多用途の機械学習モデルです。この記事では、サポート ベクター マシン アルゴリズムと scikit-learn でのその実装を紹介し、主成分分析と scikit-learn でのその応用について簡単に説明します。

1. サポートベクターマシンの概要

サポート ベクター マシン (SVM) は、機械学習の分野で広く使用されているアルゴリズムであり、少ないコンピューティング リソースで優れた精度を提供するという特性が好まれています。 SVM は分類タスクと回帰タスクの両方に使用できますが、分類問題で最も広く使用されています。

サポートベクターマシンとは何ですか?

サポート ベクター マシンの目標は、 NNいいえ 次元空間 ( NNいいえ はフィーチャの数)、データ ポイントを明確に区別できる超平面を見つけます。この超平面により、さまざまなカテゴリのデータ ポイントを分離し、超平面からできるだけ遠ざけることができ、分類の堅牢性が確保されます。

ここに画像の説明を挿入します

データポイントを効果的に分離するために、複数の超平面が存在する場合があります。私たちの目標は、最大のマージン、つまり 2 つのクラス間の最大距離を持つ超平面を選択することです。マージンを最大化すると、分類精度が向上します。

超平面とサポート ベクトル

ここに画像の説明を挿入します

超平面は、データ ポイントを分割する決定境界です。超平面の両側にあるデータ ポイントは、さまざまなカテゴリに分類できます。超平面の次元はフィーチャの数によって異なります。入力フィーチャが 2 の場合、超平面は直線になり、フィーチャが 3 の場合、超平面は 2 次元平面になります。特徴の数が 3 を超えると、超平面を直感的に理解することが難しくなります。

ここに画像の説明を挿入します

サポート ベクトルは、超平面に最も近い点を指し、超平面の位置と方向に影響を与えます。これらのサポート ベクターを使用すると、分類器のマージンを最大化できます。サポート ベクターを削除すると超平面の位置が変更されるため、SVM を構築する上でサポート ベクターは非常に重要です。

大きなマージンの直感

ロジスティック回帰では、シグモイド関数を使用して線形関数の出力値を範囲 [0,1] に圧縮し、しきい値 (0.5) に基づいてラベルを割り当てます。 SVM では、線形関数の出力値を使用して分類を決定します。出力が 1 より大きい場合、その出力は 1 つのクラスに属し、出力が -1 の場合、そのクラスは別のクラスに属します。 SVM は出力値のしきい値を 1 と -1 に設定することで限界範囲 [-1,1] を形成します。

2. データの前処理と視覚化

サポートベクターマシンを使用した良性および悪性のがん診断の予測。

データセットに関する基本情報

  • 特徴の数は 30 です。例:
    • 半径 (中心点から外周点までの平均距離)
    • テクスチャ (グレースケール値の標準偏差)
    • 周囲
    • エリア
    • 滑らかさ(半径の長さの局所的な変化)
    • コンパクトさ (周長^2 / 面積 - 1.0)
    • 凹面度(輪郭の凹んだ部分の度合い)
    • ディンプル(輪郭の凹部分の数)
    • 対称
    • フラクタル次元 (「海岸線近似」 - 1)
  • データセットには 569 個のサンプルが含まれており、クラス分布は悪性サンプルが 212 個、良性サンプルが 357 個です。
  • 対象カテゴリ:
    • 悪性の
    • 良性の

必要なライブラリをインポートする

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

%matplotlib inline
sns.set_style('whitegrid')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

データセットをロードする

from sklearn.datasets import load_breast_cancer

cancer = load_breast_cancer()

# 创建 DataFrame
col_names = list(cancer.feature_names)
col_names.append('target')
df = pd.DataFrame(np.c_[cancer.data, cancer.target], columns=col_names)
df.head()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

データの概要

df.info()print(cancer.target_names)
# ['malignant', 'benign']

# 数据描述:
df.describe()
# 统计摘要:
df.info()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

データの視覚化

特徴ペアの散布図行列
sns.pairplot(df, hue='target', vars=[
    'mean radius', 'mean texture', 'mean perimeter', 'mean area',
    'mean smoothness', 'mean compactness', 'mean concavity',
    'mean concave points', 'mean symmetry', 'mean fractal dimension'
])
  • 1
  • 2
  • 3
  • 4
  • 5
カテゴリ分布棒グラフ
sns.countplot(x=df['target'], label="Count")
  • 1

ここに画像の説明を挿入します

平均面積と平均平滑度の散布図
plt.figure(figsize=(10, 8))
sns.scatterplot(x='mean area', y='mean smoothness', hue='target', data=df)
  • 1
  • 2

ここに画像の説明を挿入します

変数間の相関関係のヒートマップ
plt.figure(figsize=(20,10))
sns.heatmap(df.corr(), annot=True)
  • 1
  • 2

ここに画像の説明を挿入します

3. モデルトレーニング(問題解決)

機械学習において、モデルのトレーニングは問題の解決策を見つけるための重要なステップです。以下に使い方を紹介します scikit-learn モデルのトレーニングを実行し、さまざまなカーネルでのサポート ベクター マシン (SVM) のパフォーマンスを実証します。

データの準備と前処理

まず、データを準備して前処理する必要があります。以下は、データ前処理のコード例です。

from sklearn.model_selection import cross_val_score, train_test_split
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler, MinMaxScaler

X = df.drop('target', axis=1)
y = df.target

print(f"'X' shape: {X.shape}")
print(f"'y' shape: {y.shape}")
# 'X' shape: (569, 30)
# 'y' shape: (569,)

pipeline = Pipeline([
    ('min_max_scaler', MinMaxScaler()),
    ('std_scaler', StandardScaler())
])

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

私たちが使用するコードでは MinMaxScaler そしてStandardScaler データをスケールします。データはトレーニング セットとテスト セットに分割され、データの 30% がテストに使用されます。

モデルのパフォーマンスを評価する

モデルのパフォーマンスを評価するには、次のように定義します。 print_score トレーニングおよびテスト結果の精度、分類レポート、混同行列を出力できる関数:

from sklearn.metrics import accuracy_score, confusion_matrix, classification_report
import pandas as pd

def print_score(clf, X_train, y_train, X_test, y_test, train=True):
    if train:
        pred = clf.predict(X_train)
        clf_report = pd.DataFrame(classification_report(y_train, pred, output_dict=True))
        print("Train Result:n================================================")
        print(f"Accuracy Score: {accuracy_score(y_train, pred) * 100:.2f}%")
        print("_______________________________________________")
        print(f"CLASSIFICATION REPORT:n{clf_report}")
        print("_______________________________________________")
        print(f"Confusion Matrix: n {confusion_matrix(y_train, pred)}n")
    else:
        pred = clf.predict(X_test)
        clf_report = pd.DataFrame(classification_report(y_test, pred, output_dict=True))
        print("Test Result:n================================================")        
        print(f"Accuracy Score: {accuracy_score(y_test, pred) * 100:.2f}%")
        print("_______________________________________________")
        print(f"CLASSIFICATION REPORT:n{clf_report}")
        print("_______________________________________________")
        print(f"Confusion Matrix: n {confusion_matrix(y_test, pred)}n")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

サポート ベクター マシン (SVM)

サポート ベクター マシン (SVM) は、パフォーマンスがハイパーパラメーターによって影響を受ける強力な分類アルゴリズムです。以下では、SVM の主なパラメーターとそれらがモデルのパフォーマンスに与える影響を紹介します。

  • Cパラメータ : トレーニング ポイントを正しく分類することと、スムーズな決定境界を持つこととの間のトレードオフを制御します。小さい CC(緩い) 誤分類コスト (ペナルティ) は低くなりますが (ソフトマージン)、大きくなります。 CC(厳密) 誤分類によりコストが高くなり (ハード マージン)、モデルが入力データをより厳密に解釈するように強制されます。
  • ガンマパラメータ : 単一のトレーニング セットの影響範囲を制御します。大きい γガンマγ 影響範囲を近づける (データ ポイントに近いほど重みが高くなります)、小さくします。 γガンマγ リーチを広げます (より広範なソリューション)。
  • 次数パラメータ: 多項式カーネル関数 ('poly' )、他のカーネルでは無視されます。最適なハイパーパラメータ値は、グリッド検索を通じて見つけることができます。

リニアカーネルSVM

線形カーネル SVM は、ほとんどの状況、特にデータ セットに多数の特徴がある場合に適しています。以下は、線形カーネル SVM を使用したコード例です。

from sklearn.svm import LinearSVC

model = LinearSVC(loss='hinge', dual=True)
model.fit(X_train, y_train)

print_score(model, X_train, y_train, X_test, y_test, train=True)
print_score(model, X_train, y_train, X_test, y_test, train=False)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

トレーニングとテストの結果は次のとおりです。

トレーニング結果:

Accuracy Score: 86.18%
_______________________________________________
CLASSIFICATION REPORT:
                  0.0         1.0  accuracy   macro avg  weighted avg
precision    1.000000    0.819079  0.861809    0.909539      0.886811
recall       0.630872    1.000000  0.861809    0.815436      0.861809
f1-score     0.773663    0.900542  0.861809    0.837103      0.853042
support    149.000000  249.000000  0.861809  398.000000    398.000000
_______________________________________________
Confusion Matrix: 
 [[ 94  55]
 [  0 249]]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

試験結果:

Accuracy Score: 89.47%
_______________________________________________
CLASSIFICATION REPORT:
                 0.0         1.0  accuracy   macro avg  weighted avg
precision   1.000000    0.857143  0.894737    0.928571      0.909774
recall      0.714286    1.000000  0.894737    0.857143      0.894737
f1-score    0.833333    0.923077  0.894737    0.878205      0.890013
support    63.000000  108.000000  0.894737  171.000000    171.000000
_______________________________________________
Confusion Matrix: 
 [[ 45  18]
 [  0 108]]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

多項式カーネル SVM

多項式カーネル SVM は非線形データに適しています。以下は、2 次多項式カーネルを使用したコード例です。

from sklearn.svm import SVC

model = SVC(kernel='poly', degree=2, gamma='auto', coef0=1, C=5)
model.fit(X_train, y_train)

print_score(model, X_train, y_train, X_test, y_test, train=True)
print_score(model, X_train, y_train, X_test, y_test, train=False)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

トレーニングとテストの結果は次のとおりです。

トレーニング結果:

Accuracy Score: 96.98%
_______________________________________________
CLASSIFICATION REPORT:
                  0.0         1.0  accuracy   macro avg  weighted avg
precision    0.985816    0.961089  0.969849    0.973453      0.970346
recall       0.932886    0.991968  0.969849    0.962427      0.969849
f1-score     0.958621    0.976285  0.969849    0.967453      0.969672
support    149.000000  249.000000  0.969849  398.000000    398.000000
_______________________________________________
Confusion Matrix: 
 [[139  10]
 [  2 247]]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

試験結果:

Accuracy Score: 97.08%
_______________________________________________
CLASSIFICATION REPORT:
                 0.0         1.0  accuracy   macro avg  weighted avg
precision   0.967742    0.972477   0.97076    0.970109      0.970733
recall      0.952381    0.981481   0.97076    0.966931      0.970760
f1-score    0.960000    0.976959   0.97076    0.968479      0.970711
support    63.000000  108.000000   0.97076  171.000000    171.000000
_______________________________________________
Confusion Matrix: 
 [[ 60   3]
 [  2 106]]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

放射基底関数 (RBF) カーネル SVM

放射基底関数 (RBF) カーネルは、非線形データの処理に適しています。以下は、RBF コアを使用したコード例です。

model = SVC(kernel='rbf', gamma=0.5, C=0.1)
model.fit(X_train, y_train)

print_score(model, X_train, y_train, X_test, y_test, train=True)
print_score(model, X_train, y_train, X_test, y_test, train=False)
  • 1
  • 2
  • 3
  • 4
  • 5

トレーニングとテストの結果は次のとおりです。

トレーニング結果:

Accuracy Score: 62.56%
_______________________________________________
CLASSIFICATION REPORT:
             0.0         1.0  accuracy   macro avg  weighted avg
precision    0.0    0.625628  0.625628    0.312814      0.392314
recall       0.0    1.000000  0.625628    0.500000      0.625628
f1-score     0.0    0.769231  0.625628    0.384615      0.615385
support    149.0  249.0    0.625628  398.0        398.0
_______________________________________________
Confusion Matrix: 
 [[  0 149]
 [  0 249]]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

試験結果:

Accuracy Score: 64.97%
_______________________________________________
CLASSIFICATION REPORT:
             0.0         1.0  accuracy   macro avg  weighted avg
precision    0.0    0.655172  0.649661    0.327586      0.409551
recall       0.0    1.000000  0.649661    0.500000      0.649661
f1-score     0.0    0.792453  0.649661    0.396226      0.628252
support    63.0  108.0    0.649661  171.0        171.0
_______________________________________________
Confusion Matrix: 
 [[  0  63]
 [  0 108]]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

要約する

上記のモデルのトレーニングと評価のプロセスを通じて、さまざまな SVM カーネルのパフォーマンスの違いを観察できます。線形カーネル SVM は、精度とトレーニング時間の点で優れたパフォーマンスを発揮し、より高いデータ次元を伴う状況に適しています。多項式カーネル SVM および RBF カーネル SVM は、非線形データに対するパフォーマンスが向上しますが、特定のパラメーター設定の下ではオーバーフィッティングが発生する可能性があります。モデルのパフォーマンスを向上させるには、適切なカーネルとハイパーパラメーターを選択することが重要です。

4. SVMデータの準備

デジタル入力 : SVM は入力データが数値であると想定します。入力データがカテゴリ変数の場合は、それらをバイナリのダミー変数 (カテゴリごとに 1 つの変数) に変換する必要がある場合があります。

二項分類 :Basic SVM はバイナリ分類問題に適しています。 SVM は主にバイナリ分類に使用されますが、回帰およびマルチクラス分類用の拡張バージョンもあります。

X_train = pipeline.fit_transform(X_train)
X_test = pipeline.transform(X_test)
  • 1
  • 2

モデルのトレーニングと評価

以下に、さまざまな SVM カーネルのトレーニングとテストの結果を示します。

リニアカーネルSVM

print("=======================Linear Kernel SVM==========================")
model = SVC(kernel='linear')
model.fit(X_train, y_train)

print_score(model, X_train, y_train, X_test, y_test, train=True)
print_score(model, X_train, y_train, X_test, y_test, train=False)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

トレーニング結果:

Accuracy Score: 98.99%
_______________________________________________
CLASSIFICATION REPORT:
                  0.0         1.0  accuracy   macro avg  weighted avg
precision    1.000000    0.984190   0.98995    0.992095      0.990109
recall       0.973154    1.000000   0.98995    0.986577      0.989950
f1-score     0.986395    0.992032   0.98995    0.989213      0.989921
support    149.000000  249.000000   0.98995  398.000000    398.000000
_______________________________________________
Confusion Matrix: 
 [[145   4]
 [  0 249]]

测试结果

Accuracy Score: 97.66%
_______________________________________________
CLASSIFICATION REPORT:
                 0.0         1.0  accuracy   macro avg  weighted avg
precision   0.968254    0.981481  0.976608    0.974868      0.976608
recall      0.968254    0.981481  0.976608    0.974868      0.976608
f1-score    0.968254    0.981481  0.976608    0.974868      0.976608
support    63.000000  108.000000  0.976608  171.000000    171.000000
_______________________________________________
Confusion Matrix: 
 [[ 61   2]
 [  2 106]]
  • 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
多項式カーネル SVM
print("=======================Polynomial Kernel SVM==========================")
from sklearn.svm import SVC

model = SVC(kernel='poly', degree=2, gamma='auto')
model.fit(X_train, y_train)

print_score(model, X_train, y_train, X_test, y_test, train=True)
print_score(model, X_train, y_train, X_test, y_test, train=False)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

トレーニング結果:

Accuracy Score: 85.18%
_______________________________________________
CLASSIFICATION REPORT:
                  0.0         1.0  accuracy   macro avg  weighted avg
precision    0.978723    0.812500  0.851759    0.895612      0.874729
recall       0.617450    0.991968  0.851759    0.804709      0.851759
f1-score     0.757202    0.893309  0.851759    0.825255      0.842354
support    149.000000  249.000000  0.851759  398.000000    398.000000
_______________________________________________
Confusion Matrix: 
 [[ 92  57]
 [  2 247]]

测试结果:

Accuracy Score: 82.46%
_______________________________________________
CLASSIFICATION REPORT:
                 0.0         1.0  accuracy   macro avg  weighted avg
precision   0.923077    0.795455  0.824561    0.859266      0.842473
recall      0.571429    0.972222  0.824561    0.771825      0.824561
f1-score    0.705882    0.875000  0.824561    0.790441      0.812693
support    63.000000  108.000000  0.824561  171.000000    171.000000
_______________________________________________
Confusion Matrix: 
 [[ 36  27]
 [  3 105]]
  • 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
放射基底関数カーネル SVM
print("=======================Radial Kernel SVM==========================")
from sklearn.svm import SVC

model = SVC(kernel='rbf', gamma=1)
model.fit(X_train, y_train)

print_score(model, X_train, y_train, X_test, y_test, train=True)
print_score(model, X_train, y_train, X_test, y_test, train=False)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

トレーニング結果:

Accuracy Score: 100.00%
_______________________________________________
CLASSIFICATION REPORT:
             0.0    1.0  accuracy  macro avg  weighted avg
precision    1.0    1.0       1.0        1.0           1.0
recall       1.0    1.0       1.0        1.0           1.0
f1-score     1.0    1.0       1.0        1.0           1.0
support    149.0  249.0       1.0      398.0         398.0
_______________________________________________
Confusion Matrix: 
 [[149   0]
 [  0 249]]

测试结果:

Accuracy Score: 63.74%
_______________________________________________
CLASSIFICATION REPORT:
                 0.0         1.0  accuracy   macro avg  weighted avg
precision   1.000000    0.635294  0.637427    0.817647      0.769659
recall      0.015873    1.000000  0.637427    0.507937      0.637427
f1-score    0.031250    0.776978  0.637427    0.404114      0.502236
support    63.000000  108.000000  0.637427  171.000000    171.000000
_______________________________________________
Confusion Matrix: 
 [[  1  62]
 [  0 108]]
  • 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

ベクター マシンのハイパーパラメーター調整をサポート

from sklearn.model_selection import GridSearchCV

param_grid = {'C': [0.01, 0.1, 0.5, 1, 10, 100], 
              'gamma': [1, 0.75, 0.5, 0.25, 0.1, 0.01, 0.001], 
              'kernel': ['rbf', 'poly', 'linear']} 

grid = GridSearchCV(SVC(), param_grid, refit=True, verbose=1, cv=5)
grid.fit(X_train, y_train)

best_params = grid.best_params_
print(f"Best params: {best_params}")

svm_clf = SVC(**best_params)
svm_clf.fit(X_train, y_train)
print_score(svm_clf, X_train, y_train, X_test, y_test, train=True)
print_score(svm_clf, X_train, y_train, X_test, y_test, train=False)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

トレーニング結果:

Accuracy Score: 98.24%
_______________________________________________
CLASSIFICATION REPORT:
                  0.0         1.0  accuracy   macro avg  weighted avg
precision    0.986301    0.980159  0.982412    0.983230      0.982458
recall       0.966443    0.991968  0.982412    0.979205      0.982412
f1-score     0.976271    0.986028  0.982412    0.981150      0.982375
support    149.000000  249.000000  0.982412  398.000000    398.000000
_______________________________________________
Confusion Matrix: 
 [[144   5]
 [  2 247]]

测试结果:

Accuracy Score: 98.25%
_______________________________________________
CLASSIFICATION REPORT:
                 0.0         1.0  accuracy   macro avg  weighted avg
precision   0.983871    0.981651  0.982456    0.982761      0.982469
recall      0.968254    0.990741  0.982456    0.979497      0.982456
f1-score    0.976000    0.986175  0.982456    0.981088      0.982426
support    63.000000  108.000000  0.982456  171.000000    171.000000
_______________________________________________
Confusion Matrix: 
 [[ 61   2]
 [  1 107]]
  • 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

5. 主成分分析

PCA の概要

主成分分析 (PCA) は、データを低次元空間に投影することで線形次元削減を実現する手法です。具体的な手順は次のとおりです。

  • 特異値分解を使用する: 特異値分解を通じてデータを低次元空間に投影します。
  • 教師なし学習: PCA では、次元削減のためにラベル付きデータは必要ありません。
  • 特徴変換: データ内の最も大きな差異を説明する特徴を見つけてみてください。

PCAの可視化

高次元データを直接視覚化するのは難しいため、PCA を使用して最初の 2 つの主成分を見つけ、データを 2 次元空間で視覚化できます。これを達成するには、各特徴の分散が単位分散になるように、まずデータを正規化する必要があります。

from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt

# 数据标准化
scaler = StandardScaler()
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

# PCA 降维
pca = PCA(n_components=2)
X_train = pca.fit_transform(X_train)
X_test = pca.transform(X_test)

# 可视化前两个主成分
plt.figure(figsize=(8,6))
plt.scatter(X_train[:,0], X_train[:,1], c=y_train, cmap='plasma')
plt.xlabel('First Principal Component')
plt.ylabel('Second Principal Component')
plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

ここに画像の説明を挿入します

最初の 2 つの主成分を通じて、2 次元空間内の異なるカテゴリのデータ ポイントを簡単に分離できます。

コンポーネントの説明

次元削減は強力ですが、コンポーネントの意味を直接理解するのは困難です。各コンポーネントは、PCA オブジェクトをフィッティングすることで取得できる元の特徴の組み合わせに対応します。

コンポーネント関連のプロパティには次のものがあります。

  • 成分スコア: 変換された変数値。
  • 荷重(重量): 特徴量の組み合わせの重み。
  • データ圧縮と情報保存: 重要な情報を保持しながら、PCA によるデータ圧縮を実現します。
  • ノイズフィルタリング: 次元削減プロセス中にノイズを除去できます。
  • 特徴抽出とエンジニアリング: 新しい特徴を抽出して構築するために使用されます。

サポートベクターマシン(SVM)モデルのパラメータ調整

モデルのトレーニングにサポート ベクター マシン (SVM) を使用する場合、最適なモデルを取得するためにハイパーパラメーターを調整する必要があります。以下は、グリッド検索 (GridSearchCV) を使用して SVM パラメーターを調整するためのサンプル コードです。

from sklearn.svm import SVC
from sklearn.model_selection import GridSearchCV

# 定义参数网格
param_grid = {'C': [0.01, 0.1, 0.5, 1, 10, 100], 
              'gamma': [1, 0.75, 0.5, 0.25, 0.1, 0.01, 0.001], 
              'kernel': ['rbf', 'poly', 'linear']} 

# 网格搜索
grid = GridSearchCV(SVC(), param_grid, refit=True, verbose=1, cv=5)
grid.fit(X_train, y_train)
best_params = grid.best_params_
print(f"Best params: {best_params}")

# 使用最佳参数训练模型
svm_clf = SVC(**best_params)
svm_clf.fit(X_train, y_train)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

トレーニング結果:

Accuracy Score: 96.48%
_______________________________________________
CLASSIFICATION REPORT:
                  0.0         1.0  accuracy   macro avg  weighted avg
precision    0.978723    0.957198  0.964824    0.967961      0.965257
recall       0.926174    0.987952  0.964824    0.957063      0.964824
f1-score     0.951724    0.972332  0.964824    0.962028      0.964617
support    149.000000  249.000000  0.964824  398.000000    398.000000
_______________________________________________
Confusion Matrix: 
 [[138  11]
 [  3 246]]

测试结果:

Accuracy Score: 96.49%
_______________________________________________
CLASSIFICATION REPORT:
                 0.0         1.0  accuracy   macro avg  weighted avg
precision   0.967213    0.963636  0.964912    0.965425      0.964954
recall      0.936508    0.981481  0.964912    0.958995      0.964912
f1-score    0.951613    0.972477  0.964912    0.962045      0.964790
support    63.000000  108.000000  0.964912  171.000000    171.000000
_______________________________________________
Confusion Matrix: 
 [[ 59   4]
 [  2 106]]
  • 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

6. まとめ

この記事では次のことを学びました。

  • サポート ベクター マシン (SVM): SVM の基本概念と Python でのその実装を理解します。
  • SVMカーネル機能: 線形、放射基底関数 (RBF) および多項式カーネル関数を含みます。
  • データの準備: SVM アルゴリズム用のデータを準備する方法。
  • ハイパーパラメータ調整: グリッド検索による SVM ハイパーパラメータの調整。
  • 主成分分析 (PCA): PCA を使用してデータの複雑さを軽減し、scikit-learn で再利用する方法。

参照する:初心者向けサポートベクターマシンと PCA チュートリアル
私の関連コラムをお勧めします:


ここに画像の説明を挿入します