Bagaimana cara menafsirkan bobot fitur SVM?

42

Saya mencoba menafsirkan bobot variabel yang diberikan dengan memasang SVM linear.

(Saya menggunakan scikit-learn ):

from sklearn import svm

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

svm.fit(features, labels)
svm.coef_

Saya tidak dapat menemukan apa pun dalam dokumentasi yang secara khusus menyatakan bagaimana bobot ini dihitung atau ditafsirkan.

Apakah tanda bobot itu ada hubungannya dengan kelas?

Austin Richardson
sumber

Jawaban:

55

Untuk kernel umum sulit untuk menafsirkan bobot SVM, namun untuk SVM linear sebenarnya ada interpretasi yang berguna:

1) Ingatlah bahwa dalam SVM linear, hasilnya adalah hyperplane yang memisahkan kelas-kelas sebaik mungkin. Bobot mewakili hyperplane ini, dengan memberi Anda koordinat vektor yang ortogonal ke hyperplane - ini adalah koefisien yang diberikan oleh svm.coef_. Sebut saja vektor ini w.

2) Apa yang dapat kita lakukan dengan vektor ini? Arahnya memberi kita kelas prediksi, jadi jika Anda mengambil produk titik dari titik mana pun dengan vektor, Anda dapat mengetahui di sisi mana itu: jika produk titik itu positif, itu milik kelas positif, jika negatif termasuk dalam kelas negatif.

3) Akhirnya, Anda bahkan dapat mempelajari sesuatu tentang pentingnya setiap fitur. Ini adalah interpretasi saya sendiri, jadi yakinkan diri Anda terlebih dahulu. Katakanlah svm hanya akan menemukan satu fitur yang berguna untuk memisahkan data, maka hyperplane akan menjadi ortogonal terhadap sumbu itu. Jadi, Anda dapat mengatakan bahwa ukuran absolut dari koefisien relatif terhadap yang lain memberikan indikasi betapa pentingnya fitur tersebut untuk pemisahan. Sebagai contoh jika hanya koordinat pertama yang digunakan untuk pemisahan, w akan berbentuk (x, 0) di mana x adalah beberapa angka bukan nol dan kemudian | x |> 0.

Bitwise
sumber
3
Poin 3 adalah dasar untuk algoritma RFE menggunakan vektor bobot dari SVM linier untuk pemilihan fitur (gen): Lihat Guyon axon.cs.byu.edu/Dan/778/papers/Feature%20Selection/guyon2.pdf
B_Miner
1
@ B_Miner terima kasih! Saya khawatir karena saya memikirkan ini sendiri mungkin salah (saya bukan dari CS "murni") - tapi saya kira itu benar.
Bitwise
1
Apa arti dari arah vektor ortogonal jika itu memisahkan kedua kelas? Apakah ada hubungannya dengan kontribusi hyperplane pemisah dengan probabilitas keseluruhan prediksi kelas?
Austin Richardson
0
@ B_Miner, saya pikir Anda bermaksud menautkan ke makalah ini daripada yang lain oleh Guyon.
ijoseph
11

The Dokumentasi cukup lengkap: untuk kasus multiclass, SVC yang didasarkan pada perpustakaan libsvm menggunakan pengaturan satu-vs-satu. Dalam kasus kernel linear, n_classes * (n_classes - 1) / 2masing-masing model biner linier dipasang untuk setiap pasangan kelas yang memungkinkan. Karenanya bentuk agregat dari semua parameter primal yang disatukan adalah [n_classes * (n_classes - 1) / 2, n_features](+ [n_classes * (n_classes - 1) / 2memotong dalam intercept_atribut).

Untuk masalah linear biner, merencanakan hyperplane pemisah dari coef_atribut dilakukan dalam contoh ini .

Jika Anda ingin detail tentang arti dari parameter yang dipasang, terutama untuk kasus kernel nonlinier, lihat formulasi matematika dan referensi yang disebutkan dalam dokumentasi.

ogrisel
sumber
1
Dalam dokumentasi Sklearn, atribut coef_ adalah shape = [n_class-1, n_features]. Saya percaya itu sebuah kesalahan.
Naomi
6

Saya mencoba menafsirkan bobot variabel yang diberikan dengan memasang SVM linear.

Cara yang baik untuk memahami bagaimana bobot dihitung dan bagaimana menafsirkannya dalam kasus SVM linier adalah dengan melakukan perhitungan dengan tangan pada contoh yang sangat sederhana.

Contoh

Pertimbangkan dataset berikut yang dapat dipisahkan secara linear

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 sederhana

Memecahkan masalah SVM dengan inspeksi

x2=x13wTx+b=0

w=[1,1]  b=3

2||w||22=242

c

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

Memasukkan kembali ke persamaan untuk lebar yang kita dapatkan

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

w=[14,14]  b=34


(Saya menggunakan scikit-belajar)

Jadi saya, inilah beberapa kode untuk memeriksa perhitungan manual kami

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]
  • Indeks vektor dukungan = [2 3]
  • Vektor pendukung = [[2. 3.] [6. -1.]]
  • Jumlah vektor dukungan untuk setiap kelas = [1 1]
  • Koefisien vektor dukungan dalam fungsi keputusan = [[0,0625 0,0625]]

Apakah tanda bobot itu ada hubungannya dengan kelas?

Tidak juga, tanda bobotnya ada hubungannya dengan persamaan bidang batas.

 

Sumber

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

Xavier Bourret Sicotte
sumber
5

Periksa makalah ini pada pemilihan fitur . Penulis menggunakan kuadrat bobot (atribut) yang ditetapkan oleh kernel linear SVM sebagai metrik peringkat untuk memutuskan relevansi atribut tertentu. Ini adalah salah satu cara yang sangat dikutip untuk memilih gen dari data microarray.

abhinna11
sumber
3

Makalah yang bagus oleh Guyon dan Elisseeff (2003). Pengantar pemilihan variabel dan fitur. Jurnal penelitian pembelajaran mesin, 1157-1182 mengatakan: "Membangun dan memilih himpunan bagian dari fitur yang berguna untuk membangun prediktor yang baik kontras dengan masalah menemukan atau memberi peringkat semua variabel yang berpotensi relevan. Memilih variabel yang paling relevan biasanya suboptimal untuk membangun sebuah prediktor, terutama jika variabelnya berlebihan. Sebaliknya, sebagian dari variabel yang berguna dapat mengecualikan banyak variabel yang berlebihan, tetapi relevan. "

Oleh karena itu saya merekomendasikan kehati-hatian ketika menafsirkan bobot model linier secara umum (termasuk regresi logistik, regresi linier dan kernel linear SVM). Bobot SVM mungkin memberikan kompensasi jika data input tidak dinormalisasi. Bobot SVM untuk fitur tertentu juga tergantung pada fitur lainnya, terutama jika fitur tersebut berkorelasi. Untuk menentukan pentingnya fitur individual, metode pemeringkatan fitur adalah pilihan yang lebih baik.

petra
sumber