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

Nov 25 2022
はじめに Support Vector Machine は、最も人気のある機械学習アルゴリズムの 1 つです。分類だけでなく、回帰問題にも使用されます。
SVM (Ref. geospasialis.com)

序章

サポート ベクター マシンは、最も人気のある機械学習アルゴリズムの 1 つです。分類だけでなく、回帰問題にも使用されます。しかし、主に、その使用は機械学習の分野の分類問題で観察されています。サポート ベクター マシンは、少ない処理能力で優れた精度を提供するため、多くの人がサポート ベクター マシンを好みます。サポート ベクター マシンは超平面を介してデータを分離し、新しいデータ ポイントは最適なカテゴリに配置されます。これがサポート ベクター マシンの基本的な目的です。この超平面はサポート ベクター マシンの決定境界とも呼ばれます。2 つのクラスのデータ ポイントを分割するために使用できるさまざまな超平面があります。最大のマージンを持つ平面を見つける — つまり、

猫と犬を正しく区別できるモデルが必要な場合は、犬にも似ている珍しい猫を観察するとします。このようなモデルは、SVM アルゴリズムを利用して構築できます。この奇妙な動物でテストする前に、猫と犬のさまざまな属性に慣れるように、まず猫と犬の写真をいくつか使用してモデルをトレーニングします。その結果、猫と犬の極端なケースが、サポート ベクターによって、これら 2 つのデータ セット (猫と犬) の間に判断境界が引かれます。サポート ベクターは、猫として分類するために使用されます。

図 SVM の例 (参照: www.javatpoint.com )

SVMの種類

線形SVM : 「線形分離可能なデータ」という用語は、1 本の直線のみを使用して 2 つのグループに分割できるデータを指します。線形 SVM はそのようなデータを分類するために使用され、使用される分類器は線形 SVM 分類器として知られています。

図 線形 SVM (参照 www.javatpoint.com)

NオンラインSVM : 非線形 SVMは非線形に分離されたデータに使用されます。つまり、データセットが直線を使用して分類できない場合、そのようなデータは非線形データと呼ばれ、使用される分類子は非線形データと呼ばれます。 -線形 SVM 分類器。

Fig. Nonlinear SVM(Ref. www.javatpoint.com)

働く

SVM は、データを高次元の特徴空間にマッピングすることにより、他の方法では直線的に分離できない場合でも、データ ポイントを分類します。カテゴリ間のセパレータが識別されると、データが変換されて、セパレータの超平面表現が有効になります。次に、新しいデータの特性を使用して、新しいレコードが属するグループを予測できます。

コスト関数と勾配の更新

SVM 法の目的は、データ ポイントと超平面の間の距離を大きくすることです。ヒンジ付き損失は、マージンを最大化するのに役立つ損失関数です。

図 ヒンジ損失関数 (左の関数は右の関数として表現できます)

予測値と実際の値が同じ符号の場合、費用は発生しません。そうでない場合は、次に損失額を決定します。コスト関数は、正則化パラメーターも受け取ります。正則化パラメーターの目標は、マージンの最大化と損失のバランスを取ることです。正則化パラメーターが追加された後、コスト関数は次のようになります。

図。SVMの損失関数

損失関数が得られたので、重みに関して偏導関数をとることによって勾配を見つけることができます。グラデーションを使用して重みを変更できます。

図 勾配

誤分類がない場合、つまり、モデルがデータポイントのクラスを正しく予測する場合にのみ、正則化パラメーターから勾配を更新する必要があります。

図. 勾配の更新 — 誤分類なし

誤分類がある場合、またはモデルがデータポイントのクラスを誤って予測する場合に勾配更新を実行するために、正則化パラメーターとともに損失を含めます。

図. 勾配の更新 — 誤分類

サンプル プログラム スニペット

ライブラリのインポート

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.model_selection import train_test_split

class SVM:
    def __init__(self, learning_rate=0.0001, lambda_param=0.001, n_iters=10000):
        self.weights = None
        self.bias =  None
        self.lr = learning_rate
        self.lambda_param = lambda_param
        self.n_iters = n_iters
    def fit(self,X,y):
        n_samples, n_features = X.shape
        
        y1 = np.where(y <= 0, -1, 1)
        
        self.weights = np.zeros(n_features)
        self.bias = 0
        for i in range(self.n_iters):
            for idx, x_i in enumerate(X):
                condition = y1[idx] * (np.dot(x_i, self.weights) - self.bias) >= 1
                if condition:
                    self.weights -= self.lr * (2 * self.lambda_param * self.weights)
                else:
                    self.weights -= self.lr * (2 * self.lambda_param * self.weights - np.dot(x_i, y1[idx]))
                    self.bias -= self.lr * y1[idx]
        
    def predict(self, X):
        approx = np.dot(X, self.weights) - self.bias
        return np.sign(approx)

def accuracy(y_true,y_pred):
    acc = np.sum(y_true == y_pred)/len(y_true)
    return acc
X, y =  datasets.make_blobs(n_samples=10, n_features=2, centers=2, cluster_std=1.05, random_state=40)
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.3,random_state=42)
y = np.where(y == 0, -1, 1)
clf = SVM()
clf.fit(X_train,y_train)
predict = clf.predict(X_test)
svm_acc = accuracy(y_test,predict)
print('Accuracy:',svm_acc)
print(f'''
     Final Weight:{clf.weights}
     Final Bias:{clf.bias}
     ''')

最終ウェイト:[0.34494241 0.1443094 ]
最終バイアス:-0.01289999999999977

視覚化

def visualize_svm():
    def get_hyperplane_value(x, w, b, offset):
        return (-w[0] * x + b + offset) / w[1]
    fig = plt.figure()
    ax = fig.add_subplot(1,1,1)
    plt.scatter(X[:,0], X[:,1], marker='x',c=y)

    x0_1 = np.amin(X[:,0])
    x0_2 = np.amax(X[:,0])

    x1_1 = get_hyperplane_value(x0_1, clf.weights, clf.bias, 0)
    x1_2 = get_hyperplane_value(x0_2, clf.weights, clf.bias, 0)

    x1_1_m = get_hyperplane_value(x0_1, clf.weights, clf.bias, -1)
    x1_2_m = get_hyperplane_value(x0_2, clf.weights, clf.bias, -1)

    x1_1_p = get_hyperplane_value(x0_1, clf.weights, clf.bias, 1)
    x1_2_p = get_hyperplane_value(x0_2, clf.weights, clf.bias, 1)

    ax.plot([x0_1, x0_2],[x1_1, x1_2], 'b--')
    ax.plot([x0_1, x0_2],[x1_1_m, x1_2_m], 'k')
    ax.plot([x0_1, x0_2],[x1_1_p, x1_2_p], 'k')

    x1_min = np.amin(X[:,1])
    x1_max = np.amax(X[:,1])
    ax.set_ylim([x1_min-3,x1_max+3])

    plt.show()

visualize_svm()

      
                
Fig. Output of SVM

顔検出 — SVMc は画像の一部を顔と非顔として分類し、顔の周囲に正方形の境界を作成します。

テキストとハイパーテキストの分類 — SVM は、テキストとハイパーテキストの分類について帰納的モデルと変換モデルの両方をサポートします。記事を個別のグループに分類するには、トレーニング データが必要です。得られたスコアに基づいて分類し、しきい値と対比します。
画像分類 — SVM は、画像分類の検索精度を向上させます。従来のクエリベースの検索戦略と比較して、精度が向上します。
タンパク質分類とがん分類は、バイオインフォマティクスの 2 つの例です。SVM は、遺伝子、遺伝子による患者の分類、およびその他の生物学的問題に使用されます。
タンパク質のリモート相同性検出とタンパク質フォールド検出に SVM アルゴリズムを適用します。

結論

サポート ベクター マシンは、機械学習における分類のための強力なアルゴリズムです。回帰問題にも使用できますが、主に分類目的で使用することをお勧めします。線形または非線形データに使用でき、問題なく機能します。ただし、これは教師あり学習アルゴリズムであるため、ラベル付きデータが必要です。複雑なデータセットではなく、小規模なデータセットで最適に機能します。

参考文献

サポート ベクター マシン

プネのヴィシュワカルマ工科大学で人工知能とデータ サイエンス (AI&DS) の学生による統計的推論 (SI) のホーム割り当て。

醸造元:-

  1. 亜人キャ・マハジャン
  2. アディティア・ボダンカール
  3. リヤ・ダカルカール
  4. ディクシャ・プラサド
  5. シヴァニ・マハジャン