サポート ベクター マシン (SVM) は、最も人気のある教師あり学習アルゴリズムの 1 つで、分類問題や回帰問題に使用されます。ただし、主に機械学習の分類問題に使用されます。
SVM アルゴリズムの目標は、n 次元空間をクラスに分離できる最適な線または決定境界を作成し、将来新しいデータ ポイントを正しいカテゴリに簡単に分類できるようにすることです。この最良の決定境界は超平面と呼ばれます。
SVM は、超平面の作成に役立つ極端な点/ベクトルを選択します。このような極端なケースはサポート ベクターと呼ばれ、そのためアルゴリズムはサポート ベクター マシンと呼ばれます。以下の図を考えてみましょう。この図には、決定境界または超平面を使用して分類された 2 つの異なるカテゴリがあります。
例: SVM は、KNN 分類器で使用した例で理解できます。犬のいくつかの特徴も備えた奇妙な猫を見たとして、それが猫であるか犬であるかを正確に識別できるモデルが必要な場合、そのようなモデルは SVM アルゴリズムを使用して作成できます。まず、猫と犬のさまざまな特徴を学習できるように、猫と犬の多くの画像を使用してモデルをトレーニングし、次にこの奇妙な生き物でテストします。したがって、サポート ベクターがこれら 2 つのデータ (猫と犬) の間に決定境界を作成し、極端なケース (サポート ベクトル) を選択すると、猫と犬の極端なケースが表示されます。サポート ベクターに基づいて、猫として分類されます。以下の図を考えてみましょう。
SVM アルゴリズムは次の目的で使用できます。 顔検出、画像分類、テキスト分類、 等
第 3 正規形
SVMの種類
SVM には次の 2 つのタイプがあります。
SVM アルゴリズムの超平面とサポート ベクトル:
超平面: n 次元空間でクラスを分離するために複数の線/決定境界が存在する可能性がありますが、データ ポイントの分類に役立つ最適な決定境界を見つける必要があります。この最良の境界は、SVM の超平面として知られています。
超平面の寸法は、データセット内に存在するフィーチャによって異なります。つまり、フィーチャが 2 つある場合 (画像に示すように)、超平面は直線になります。そして、特徴が 3 つある場合、超平面は 2 次元平面になります。
私たちは常に最大のマージンを持つ超平面を作成します。これはデータ点間の最大距離を意味します。
サポートベクター:
超平面に最も近く、超平面の位置に影響を与えるデータ点またはベクトルは、サポート ベクトルと呼ばれます。これらのベクトルは超平面をサポートするため、サポート ベクトルと呼ばれます。
SVMはどのように機能しますか?
線形SVM:
SVM アルゴリズムの動作は、例を使用することで理解できます。 2 つのタグ (緑と青) を持つデータセットがあり、そのデータセットには 2 つの特徴 x1 と x2 があるとします。座標のペア (x1, x2) を緑または青に分類できる分類器が必要です。以下の画像を考えてみましょう。
これは 2 次元空間なので、直線を使用するだけで、これら 2 つのクラスを簡単に分離できます。ただし、これらのクラスを複数の行で区切ることができます。以下の画像を考えてみましょう。
したがって、SVM アルゴリズムは、最適なラインまたは決定境界を見つけるのに役立ちます。この最良の境界または領域は、 超平面 。 SVM アルゴリズムは、両方のクラスからの線の最も近い点を見つけます。これらのポイントはサポート ベクターと呼ばれます。ベクトルと超平面の間の距離は次のように呼ばれます。 マージン 。 SVM の目標は、このマージンを最大化することです。の 超平面 最大マージンを持つものは、 最適超平面 。
非線形SVM:
データが線形に配置されている場合は直線で区切ることができますが、非線形データの場合は 1 本の直線を引くことができません。以下の画像を考えてみましょう。
したがって、これらのデータ ポイントを分離するには、もう 1 つの次元を追加する必要があります。線形データの場合は 2 次元 x と y を使用したため、非線形データの場合は 3 次元の z を追加します。次のように計算できます。
z=x<sup>2</sup> +y<sup>2</sup>
3 次元を追加すると、サンプル空間は次の図のようになります。
そこで、SVM は次の方法でデータセットをクラスに分割します。以下の画像を考えてみましょう。
私たちは 3 次元空間にいるので、x 軸に平行な平面のように見えます。これを z=1 の 2 次元空間に変換すると、次のようになります。
したがって、非線形データの場合は半径 1 の円周が得られます。
機械学習の種類
サポートベクターマシンのPython実装
次に、Python を使用して SVM アルゴリズムを実装します。ここでは同じデータセットを使用します ユーザーデータ 、ロジスティック回帰と KNN 分類で使用しました。
データの前処理ステップまで、コードは同じままです。以下はコードです:
#Data Pre-processing Step # importing libraries import numpy as nm import matplotlib.pyplot as mtp import pandas as pd #importing datasets data_set= pd.read_csv('user_data.csv') #Extracting Independent and dependent Variable x= data_set.iloc[:, [2,3]].values y= data_set.iloc[:, 4].values # Splitting the dataset into training and test set. from sklearn.model_selection import train_test_split x_train, x_test, y_train, y_test= train_test_split(x, y, test_size= 0.25, random_state=0) #feature Scaling from sklearn.preprocessing import StandardScaler st_x= StandardScaler() x_train= st_x.fit_transform(x_train) x_test= st_x.transform(x_test)
上記のコードを実行した後、データを前処理します。コードは次のようなデータセットを提供します。
テスト セットのスケーリングされた出力は次のようになります。
SVM 分類器をトレーニング セットに適合させる:
これで、トレーニング セットが SVM 分類子に適合されます。 SVM 分類子を作成するには、以下をインポートします。 SVC からのクラス Sklearn.svm 図書館。以下はそのコードです。
from sklearn.svm import SVC # 'Support vector classifier' classifier = SVC(kernel='linear', random_state=0) classifier.fit(x_train, y_train)
上記のコードでは、 カーネル='リニア' ここでは線形分離可能なデータ用の SVM を作成しています。ただし、非線形データの場合は変更できます。そして、分類器をトレーニング データセット(x_train, y_train)に適合させました。
出力:
Out[8]: SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0, decision_function_shape='ovr', degree=3, gamma='auto_deprecated', kernel='linear', max_iter=-1, probability=False, random_state=0, shrinking=True, tol=0.001, verbose=False)
モデルのパフォーマンスは、 の値を変更することで変更できます。 C(正則化係数)、ガンマ、カーネル 。
ここで、テスト セットの出力を予測します。このために、新しいベクトル y_pred を作成します。以下はそのコードです。
#Predicting the test set result y_pred= classifier.predict(x_test)
y_pred ベクトルを取得した後、次の結果を比較できます。 y_pred そして y_test 実際の値と予測値の差を確認します。
出力: 以下は、テスト セットの予測の出力です。
次に、ロジスティック回帰分類器と比較して、誤った予測がどれだけあるかという SVM 分類器のパフォーマンスを確認します。混同行列を作成するには、 混乱マトリックス sklearnライブラリの関数。関数をインポートした後、新しい変数を使用して呼び出します。 cm 。この関数は主に 2 つのパラメータを取ります。 y_true (実際の値) と y_pred (分類子によって返されるターゲット値)。以下はそのコードです。
#Creating the Confusion matrix from sklearn.metrics import confusion_matrix cm= confusion_matrix(y_test, y_pred)
出力:
上の出力画像からわかるように、66+24= 90 個の正しい予測と、8+2= 10 個の正しい予測があります。したがって、SVM モデルはロジスティック回帰モデルと比較して改善されたと言えます。
ユーザー名
次に、トレーニング セットの結果を視覚化します。以下はそのコードです。
from matplotlib.colors import ListedColormap x_set, y_set = x_train, y_train x1, x2 = nm.meshgrid(nm.arange(start = x_set[:, 0].min() - 1, stop = x_set[:, 0].max() + 1, step =0.01), nm.arange(start = x_set[:, 1].min() - 1, stop = x_set[:, 1].max() + 1, step = 0.01)) mtp.contourf(x1, x2, classifier.predict(nm.array([x1.ravel(), x2.ravel()]).T).reshape(x1.shape), alpha = 0.75, cmap = ListedColormap(('red', 'green'))) mtp.xlim(x1.min(), x1.max()) mtp.ylim(x2.min(), x2.max()) for i, j in enumerate(nm.unique(y_set)): mtp.scatter(x_set[y_set == j, 0], x_set[y_set == j, 1], c = ListedColormap(('red', 'green'))(i), label = j) mtp.title('SVM classifier (Training set)') mtp.xlabel('Age') mtp.ylabel('Estimated Salary') mtp.legend() mtp.show()
出力:
上記のコードを実行すると、次のような出力が得られます。
ご覧のとおり、上記の出力はロジスティック回帰の出力と似ています。出力では、超平面として直線が得られました。 分類器で線形カーネルを使用しました 。また、2D 空間の場合、SVM の超平面は直線であることも上で説明しました。
#Visulaizing the test set result from matplotlib.colors import ListedColormap x_set, y_set = x_test, y_test x1, x2 = nm.meshgrid(nm.arange(start = x_set[:, 0].min() - 1, stop = x_set[:, 0].max() + 1, step =0.01), nm.arange(start = x_set[:, 1].min() - 1, stop = x_set[:, 1].max() + 1, step = 0.01)) mtp.contourf(x1, x2, classifier.predict(nm.array([x1.ravel(), x2.ravel()]).T).reshape(x1.shape), alpha = 0.75, cmap = ListedColormap(('red','green' ))) mtp.xlim(x1.min(), x1.max()) mtp.ylim(x2.min(), x2.max()) for i, j in enumerate(nm.unique(y_set)): mtp.scatter(x_set[y_set == j, 0], x_set[y_set == j, 1], c = ListedColormap(('red', 'green'))(i), label = j) mtp.title('SVM classifier (Test set)') mtp.xlabel('Age') mtp.ylabel('Estimated Salary') mtp.legend() mtp.show()
出力:
上記のコードを実行すると、次のような出力が得られます。
上の出力画像でわかるように、SVM 分類子はユーザーを 2 つの領域 (購入済みまたは未購入) に分割しました。 SUV を購入したユーザーは、赤い散布点のある赤い領域にいます。また、SUV を購入しなかったユーザーは、緑色の散布点のある緑色の領域にいます。超平面は、2 つのクラスを購入済み変数と未購入変数に分割しています。