SVM機能の重みをどのように解釈しますか?


42

線形SVMを近似することで与えられる可変の重みを解釈しようとしています。

(私はscikit-learnを使用しています):

from sklearn import svm

svm = svm.SVC(kernel='linear')

svm.fit(features, labels)
svm.coef_

これらの重みがどのように計算または解釈されるかを具体的に説明するドキュメントには何も見つかりません。

体重のサインはクラスと関係がありますか?

回答:


55

一般的なカーネルの場合、SVMの重みを解釈することは困難ですが、線形SVMの場合、実際には有用な解釈があります。

1)線形SVMでは、結果はクラスを可能な限り最良に分離する超平面であることを思い出してください。重みは、超平面に直交するベクトルの座標を与えることにより、この超平面を表します-これらはsvm.coef_で与えられる係数です。このベクトルをwと呼びましょう。

2)このベクターで何ができますか?方向は予測されたクラスを提供するので、ベクトルを持つ任意の点のドット積を取ると、どちら側にあるかを知ることができます:ドット積が正の場合、正のクラスに属し、負の場合、それはそれです負のクラスに属します。

3)最後に、各機能の重要性についても学ぶことができます。これは私自身の解釈なので、最初に自分自身を納得させてください。svmがデータを分離するのに有用な機能を1つだけ見つけ、超平面がその軸に直交するとします。したがって、他の係数と比較した係数の絶対サイズは、特徴が分離にとってどれほど重要かを示していると言えます。たとえば、最初の座標のみが分離に使用される場合、wは(x、0)の形式になります。ここで、xはゼロ以外の数で、| x |> 0です。


3
ポイント3は、フィーチャ(遺伝子)の選択に線形SVMの重みベクトルを使用するRFEアルゴリズムの基礎です。Guyonaxon.cs.byu.edu
Dan/778/

1
@B_Minerありがとう!私は自分でこれを考えていたので間違っているのではないかと心配しました(「純粋な」CSからではありません)-しかし、それは正しいと思います。
ビット単位

1
両方のクラスを分離している場合、直交ベクトルの方向の意味は何ですか?それは、クラス予測の全体的な確率に対する分離超平面の寄与と関係がありますか?
オースティンリチャードソン

0

@B_Miner、Guyonによる別の論文ではなく、この論文にリンクするつもりだったと思います。
ijoseph

11

ドキュメントがかなり完了です:LIBSVMのライブラリに基づいてマルチクラスの場合、SVCのために1-VS-1の設定を使用しています。線形カーネルの場合、n_classes * (n_classes - 1) / 2可能なクラスペアごとに個別の線形バイナリモデルが適合します。したがって、一緒に連結されたすべての主なパラメーターの集約形状は[n_classes * (n_classes - 1) / 2, n_features](+ 属性の[n_classes * (n_classes - 1) / 2インターセプトintercept_)です。

バイナリ線形問題の場合coef_、この例では属性から分離する超平面をプロットします。

特に非線形カーネルの場合に当てはまるパラメーターの意味の詳細が必要な場合は、数学的定式化とドキュメントで言及されているリファレンスを参照してください。


1
Sklearnのドキュメントでは、coef_属性はshape = [n_class-1、n_features]です。それは間違いだと思います。
ナオミ

6

線形SVMを近似することで与えられる可変の重みを解釈しようとしています。

線形SVMの場合、重みがどのように計算され、どのように解釈されるかを理解する良い方法は、非常に簡単な例で計算を手動で実行することです。

線形に分離可能な次のデータセットを考えます

import numpy as np
X = np.array([[3,4],[1,4],[2,3],[6,-1],[7,-1],[5,-3]] )
y = np.array([-1,-1, -1, 1, 1 , 1 ])

SVMシンプル

検査によるSVM問題の解決

x2=x13wTx+b=0

w=[1,1]  b=3

2||w||22=242

c

cx1cx23c=0
w=[c,c]  b=3c

取得した幅の式に戻る

2||w||=4222c=42c=14

w=[14,14]  b=34


(私はscikit-learnを使用しています)

だから私は、ここに私たちの手動計算をチェックするためのいくつかのコードです

from sklearn.svm import SVC
clf = SVC(C = 1e5, kernel = 'linear')
clf.fit(X, y) 
print('w = ',clf.coef_)
print('b = ',clf.intercept_)
print('Indices of support vectors = ', clf.support_)
print('Support vectors = ', clf.support_vectors_)
print('Number of support vectors for each class = ', clf.n_support_)
print('Coefficients of the support vector in the decision function = ', np.abs(clf.dual_coef_))
  • w = [[0.25 -0.25]] b = [-0.75]
  • サポートベクトルのインデックス= [2 3]
  • サポートベクトル= [[2. 3.] [6. -1。]]
  • 各クラスのサポートベクトルの数= [1 1]
  • 決定関数のサポートベクトルの係数= [[0.0625 0.0625]]

体重のサインはクラスと関係がありますか?

実際には、重みの符号は境界面の方程式に関係しています。

 

ソース

https://ai6034.mit.edu/wiki/images/SVM_and_Boosting.pdf


5

機能の選択に関するこのペーパーを確認してください。著者は、特定の属性の関連性を判断するためのランク付けメトリックとして、線形カーネルSVMによって割り当てられた(属性の)重みの2乗を使用します。これは、マイクロアレイデータから遺伝子を選択する非常に引用された方法の1つです。


3

Guyon and Elisseeffによる素晴らしい論文(2003)。変数と機能の選択の概要。Journal of Machine Learning Research、1157-1182は、次のように述べています。特に変数が冗長である場合、予測変数。逆に、有用な変数のサブセットは、多くの冗長だが関連する変数を除外する場合があります。」

したがって、一般的に線形モデルの重みを解釈するときは注意が必要です(ロジスティック回帰、線形回帰、線形カーネルSVMを含む)。入力データが正規化されていない場合、SVMの重みが補正される場合があります。特定の機能のSVMの重みは、特に機能が相関している場合、他の機能にも依存します。個々の機能の重要性を判断するには、機能のランク付け方法の方が適しています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.