Python の Scikit-Learn を使用して他の SVM フレーバーを実装する

Python の Scikit-Learn を使用して他の SVM フレーバーを実装する

概要

このガイドは、サポート ベクター マシン (SVM) に関する XNUMX つのガイドの XNUMX 番目で最後の部分です。 このガイドでは、偽造された紙幣の使用例を引き続き扱い、SVM の背後にある一般的な考え方について簡単に要約し、カーネル トリックとは何かを理解し、Scikit-Learn を使用してさまざまな種類の非線形カーネルを実装します。

SVM ガイドの完全なシリーズでは、他のタイプの SVM について学習するだけでなく、単純な SVM、SVM の事前定義されたパラメーター、C およびガンマ ハイパーパラメーター、およびそれらをグリッド検索とクロス検証で調整する方法についても学習します。

以前のガイドを読みたい場合は、最初の XNUMX つのガイドを参照するか、最も関心のあるトピックを確認してください。 以下は、各ガイドで取り上げるトピックの表です。

  1. Python の Scikit-Learn を使用して SVM とカーネル SVM を実装する
  • ユースケース: 紙幣を忘れる
  • SVMの背景
  • 単純な (線形) SVM モデル
    • データセットについて
    • データセットのインポート
    • データセットの探索
  • Scikit-Learn を使用した SVM の実装
    • トレーニング/テスト セットへのデータの分割
    • モデルのトレーニング
    • 予測する
    • モデルの評価
    • 結果の解釈
  1. SVM ハイパーパラメータについて
  • Cハイパーパラメータ
  • ガンマ ハイパーパラメータ

3. Python の Scikit-Learn を使用して他の SVM フレーバーを実装する

  • SVM の一般的な考え方 (要約)
  • カーネル (トリック) SVM
  • Scikit-Learn を使用した非線形カーネル SVM の実装
  • ライブラリのインポート
    • データセットのインポート
    • データを特徴 (X) とターゲット (y) に分割する
    • トレーニング/テスト セットへのデータの分割
    • アルゴリズムのトレーニング
  • 多項式カーネル
    • 予測する
    • アルゴリズムの評価
  • ガウスカーネル
    • 予測と評価
  • シグモイドカーネル
    • 予測と評価
  • 非線形カーネル性能の比較

興味深い SVM カーネルのバリエーションを見る前に、SVM とは何かを思い出してみましょう。

SVM の一般的な考え方

1 次元で線形に分離可能なデータの場合 (図 1 を参照)、典型的な機械学習アルゴリズムのアプローチは、誤分類エラーが最小化されるようにデータを分割する境界を見つけようとすることです。 図 XNUMX をよく見ると、データ ポイントを正しく分割する複数の境界 (無限) があることに注意してください。 XNUMX つの破線と実線はすべて、データの有効な分類です。

複数の決定境界

図 1: 複数の決定境界

SVM が 決定境界、それ自体とクラスの最も近いデータポイントとの間の距離を最大化する境界を選択します。 最も近いデータ ポイントがサポート ベクターであり、距離を次の両方でパラメーター化できることは既にわかっています。 C および gamma ハイパーパラメータ。

その決定境界を計算する際に、アルゴリズムは考慮すべきポイントの数とマージンがどこまで進むかを選択します。これにより、マージン最大化問題が構成されます。 そのマージン最大化問題を解決する際に、SVM はサポート ベクター (図 2 を参照) を使用し、使用されている関数に従ってより多くのポイントを正しく分類しながら、マージン距離を大きく保つ最適な値を見つけようとします。データを分離します。

サポート ベクターによる決定境界

図 2: サポート ベクターによる決定境界

これが、SVM が単に決定境界を見つけるのではなく、最終的に最適な決定境界を見つけるという点で、他の分類アルゴリズムと異なる理由です。

サポート ベクターの検出、決定境界とサポート ベクターの間のマージンの計算、およびそのマージンの最大化の背後には、統計および計算方法から派生した複雑な数学があります。 今回は、数学がどのように展開するかについての詳細には触れません。

機械学習アルゴリズムをより深く掘り下げて、謎めいた呪文のようなものではないことを確認することは常に重要です。ただし、現時点ですべての数学的詳細を知らなくても、アルゴリズムを実行して結果を得ることができなくなるわけではありません。

アドバイス: アルゴリズム プロセスを要約したので、データ ポイント間の距離が SVM が選択する決定境界に影響することは明らかです。そのため、 データのスケーリング 通常、SVM 分類器を使用する場合に必要です。 使ってみて scikit-learn の標準スケーラー メソッド データを準備してから、コードを再度実行して、結果に違いがあるかどうかを確認します。

カーネル (トリック) SVM

前のセクションでは、SVM の一般的な考え方を思い出して整理しました。これを使用して、線形分離可能なデータの最適な決定境界を見つける方法を確認しました。 ただし、図 3 に示すような非線形分離可能なデータの場合、直線を決定境界として使用できないことは既にわかっています。

非線形分離可能なデータ

図 3: 非線形に分離可能なデータ

むしろ、最初に説明したカーネル SVM と呼ばれる SVM の修正版を使用できます。

基本的に、カーネル SVM が行うことは、低次元の非線形分離可能なデータを高次元の対応する形式に射影することです。 非線形に分離可能なデータを高次元に投影すると、分離可能になるようにデータの形状が変化するため、これはトリックです。 たとえば、3 次元について考えると、各クラスのデータ ポイントが別の次元に割り当てられ、分離可能になる可能性があります。 データの次元を増やす XNUMX つの方法は、指数化することです。 繰り返しますが、これには複雑な数学が関係していますが、SVM を使用するために心配する必要はありません。 むしろ、Python の Scikit-Learn ライブラリを使用して、線形カーネルを使用したのと同じ方法で非線形カーネルを実装して使用できます。

Scikit-Learn を使用した非線形カーネル SVM の実装

このセクションでは、同じデータセットを使用して、既にわかっている XNUMX つの特徴に従って、紙幣が本物か偽造かを予測します。

残りのステップは典型的な機械学習のステップであり、非線形カーネル SVM をトレーニングする部分に到達するまでは、ほとんど説明する必要がないことがわかります。

ライブラリのインポート

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
from sklearn.model_selection import train_test_split

データセットのインポート

data_link = "https://archive.ics.uci.edu/ml/machine-learning-databases/00267/data_banknote_authentication.txt"
col_names = ["variance", "skewness", "curtosis", "entropy", "class"] bankdata = pd.read_csv(data_link, names=col_names, sep=",", header=None)
bankdata.head()mes)

データを特徴 (X) とターゲット (y) に分割する

X = bankdata.drop('class', axis=1)
y = bankdata['class']

トレーニング/テスト セットへのデータの分割

SEED = 42 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.20, random_state = SEED)

アルゴリズムのトレーニング

カーネル SVM をトレーニングするには、同じものを使用します。 SVC Scikit-Learn のクラス svm 図書館。 違いは、カーネル パラメータの値にあります。 SVC とに提供されます。

単純な SVM の場合、カーネル パラメーターの値として「線形」を使用しました。 ただし、前述したように、カーネル SVM の場合、ガウス、多項式、シグモイド、または計算可能なカーネルを使用できます。 多項式、ガウス、およびシグモイド カーネルを実装し、その最終メトリックを調べて、どれがより高いメトリックを持つクラスに適合するように見えるかを確認します。

1.多項式カーネル

代数では、多項式は次の形式の式です。

$$
2a*b^3 + 4a – 9
$$

これには、次のような変数があります。 a および b、定数、この例では、 9 および係数 (変数を伴う定数)、 2 および 4を選択します。 3 は多項式の次数と見なされます。

多項式関数を使用するときに最もよく説明できるデータの種類があります。ここでは、カーネルが行うことは、次数を選択する多項式にデータをマップすることです。 次数が高いほど、関数はよりデータに近づこうとするため、決定境界はより柔軟になります (オーバーフィットしやすくなります)。次数が低いほど、柔軟性が低くなります。

ベストプラクティス、業界で認められた標準、および含まれているチートシートを含む、Gitを学習するための実践的で実用的なガイドを確認してください。 グーグルGitコマンドを停止し、実際に 学ぶ それ!

したがって、実装するために 多項式カーネルを選択するだけでなく、 poly カーネルの値も渡します。 degree のパラメータ SVC クラス。 以下はコードです:

from sklearn.svm import SVC
svc_poly = SVC(kernel='poly', degree=8)
svc_poly.fit(X_train, y_train)

予測する

アルゴリズムのトレーニングが完了したら、次のステップはテスト データで予測を行うことです。

前に行ったように、次のスクリプトを実行してそうすることができます。

y_pred_poly = svclassifier.predict(X_test)

アルゴリズムの評価

いつものように、最後のステップは多項式カーネルで評価を行うことです。 分類レポートと混同行列のコードを数回繰り返したので、それを次の関数に変換しましょう。 display_results それぞれを受け取った後 y_test, y_pred と Seaborn の混同行列のタイトル cm_title:

def display_results(y_test, y_pred, cm_title): cm = confusion_matrix(y_test,y_pred) sns.heatmap(cm, annot=True, fmt='d').set_title(cm_title) print(classification_report(y_test,y_pred))

これで、関数を呼び出して、多項式カーネルで得られた結果を確認できます。

cm_title_poly = "Confusion matrix with polynomial kernel"
display_results(y_test, y_pred_poly, cm_title_poly)

出力は次のようになります。

 precision recall f1-score support 0 0.69 1.00 0.81 148 1 1.00 0.46 0.63 127 accuracy 0.75 275 macro avg 0.84 0.73 0.72 275
weighted avg 0.83 0.75 0.73 275

Python の Scikit-Learn PlatoBlockchain Data Intelligence を使用した他の SVM フレーバーの実装。垂直検索。あい。

これで、ガウス カーネルとシグモイド カーネルに対して同じ手順を繰り返すことができます。

2.ガウスカーネル

ガウス カーネルを使用するには、「rbf」を kernel SVC クラスのパラメーター:

svc_gaussian = SVC(kernel='rbf', degree=8)
svc_gaussian.fit(X_train, y_train)

このカーネルをさらに探索する場合、グリッド検索を使用して別のカーネルと組み合わせることができます。 C および gamma 値。

予測と評価

y_pred_gaussian = svc_gaussian.predict(X_test)
cm_title_gaussian = "Confusion matrix with Gaussian kernel"
display_results(y_test, y_pred_gaussian, cm_title_gaussian)

ガウス カーネル SVM の出力は次のようになります。

 precision recall f1-score support 0 1.00 1.00 1.00 148 1 1.00 1.00 1.00 127 accuracy 1.00 275 macro avg 1.00 1.00 1.00 275
weighted avg 1.00 1.00 1.00 275

Python の Scikit-Learn PlatoBlockchain Data Intelligence を使用した他の SVM フレーバーの実装。垂直検索。あい。

3.シグモイドカーネル

最後に、カーネル SVM の実装にシグモイド カーネルを使用しましょう。 次のスクリプトを見てください。

svc_sigmoid = SVC(kernel='sigmoid')
svc_sigmoid.fit(X_train, y_train)

シグモイド カーネルを使用するには、'sigmoid' を kernel のパラメータ SVC とに提供されます。

予測と評価

y_pred_sigmoid = svc_sigmoid.predict(X_test)
cm_title_sigmoid = "Confusion matrix with Sigmoid kernel"
display_results(y_test, y_pred_sigmoid, cm_title_sigmoid)

シグモイド カーネルを使用したカーネル SVM の出力は次のようになります。

 precision recall f1-score support 0 0.67 0.71 0.69 148 1 0.64 0.59 0.61 127 accuracy 0.65 275 macro avg 0.65 0.65 0.65 275
weighted avg 0.65 0.65 0.65 275

Python の Scikit-Learn PlatoBlockchain Data Intelligence を使用した他の SVM フレーバーの実装。垂直検索。あい。

非線形カーネル性能の比較

さまざまなタイプの非線形カーネルのパフォーマンスを簡単に比較すると、シグモイド カーネルのメトリックが最も低く、パフォーマンスが最悪のように見えるかもしれません。

ガウス カーネルと多項式カーネルの中で、ガウス カーネルが完全な 100% の予測率を達成したことがわかります。これは通常疑わしく、オーバーフィットを示している可能性がありますが、多項式カーネルはクラス 68 の 1 インスタンスを誤分類しました。

したがって、ハイパーパラメーターをさらに検索し、各関数の形状を理解し、データを調査し、トレーニングとテストの結果を比較して、アルゴリズムが適切かどうかを確認することなく、すべてのシナリオまたは現在のシナリオでどのカーネルが最適に機能するかについての厳格なルールはありません。一般化しています。

すべてのカーネルをテストし、プロジェクトのコンテキストに従って期待される結果が得られるパラメーターとデータ準備の組み合わせを備えたカーネルを選択することがすべてです。

さらに進む – ハンドヘルド エンド ツー エンド プロジェクト

あなたの好奇心旺盛な性質は、さらに先へ進みたいと思わせますか? 私たちは私たちをチェックアウトすることをお勧めします ガイド付きプロジェクト: 「実践的な住宅価格予測–Pythonでの機械学習」.

Python の Scikit-Learn PlatoBlockchain Data Intelligence を使用した他の SVM フレーバーの実装。垂直検索。あい。

このガイド付きプロジェクトでは、強力な従来の機械学習モデルとディープ ラーニング モデルを構築し、Ensemble Learning を利用してメタ学習者をトレーニングし、Scikit-Learn および Keras モデルのバッグから住宅価格を予測する方法を学習します。

Tensorflow の上に構築された深層学習 API である Keras を使用して、アーキテクチャを実験し、積み重ねられたモデルのアンサンブルを構築し、 メタ学習者 家の価格を計算するためのニューラル ネットワーク (レベル 1 モデル)。

深層学習は素晴らしいですが、それに頼る前に、次のようなより単純な手法で問題を解決することもお勧めします。 浅い学び アルゴリズム。 私たちのベースラインパフォーマンスは、 ランダム フォレスト回帰 アルゴリズム。 さらに、次のような手法を使用して、Scikit-Learn を介してモデルのアンサンブルを作成することを検討します。 バギング および 投票.

これはエンド ツー エンドのプロジェクトであり、すべての機械学習プロジェクトと同様に、最初に – を使用します。 探索的データ分析、続いて データの前処理 そして最後に 建物の浅い および ディープラーニングモデル 以前に調査してクリーニングしたデータに合わせます。

まとめ

この記事では、SVM について簡単にまとめ、カーネルのトリックについて学び、さまざまな種類の非線形 SVM を実装しました。

各カーネルを実装し、さらに先に進むことをお勧めします。 さまざまなカーネルのそれぞれを作成するために使用された数学、それらが作成された理由、およびそれらのハイパーパラメーターに関する違いを調べることができます。 そのようにして、テクニックと、コンテキストと利用可能なデータに応じて適用するのに最適なカーネルのタイプについて学びます。

各カーネルがどのように機能し、いつそれらを使用するかを明確に理解することは、あなたの旅に間違いなく役立ちます. 進行状況と幸せなコーディングを教えてください!

タイムスタンプ:

より多くの スタックアバス