Bisakah Anda menjelaskan perbedaan antara SVC dan LinearSVC di scikit-learn?

19

Baru-baru ini saya mulai belajar untuk bekerja sklearndan baru saja menemukan hasil yang aneh ini.

Saya menggunakan digitsdataset yang tersedia sklearnuntuk mencoba berbagai model dan metode estimasi.

Ketika saya diuji model Support Vector Machine pada data, saya menemukan ada dua kelas yang berbeda di sklearnklasifikasi SVM: SVCdan LinearSVC, di mana mantan menggunakan satu-terhadap-satu pendekatan dan kegunaan lain satu-terhadap-sisa pendekatan.

Saya tidak tahu apa efeknya pada hasilnya, jadi saya mencoba keduanya. Saya melakukan estimasi gaya Monte Carlo di mana saya menjalankan kedua model 500 kali, setiap kali membagi sampel secara acak menjadi 60% pelatihan dan 40% tes dan menghitung kesalahan prediksi pada set tes.

Pengukur SVC biasa menghasilkan histogram kesalahan berikut: Tingkat Kesalahan SVC Sementara pengukur SVC linier menghasilkan histogram berikut: Tingkat Kesalahan SVC Linear

Apa yang bisa menjelaskan perbedaan yang begitu mencolok? Mengapa model linear memiliki akurasi yang lebih tinggi?

Dan, terkait, apa yang bisa menyebabkan polarisasi pada hasil? Baik akurasi mendekati 1 atau akurasi mendekati 0, tidak ada di antaranya.

Sebagai perbandingan, klasifikasi pohon keputusan menghasilkan tingkat kesalahan terdistribusi jauh lebih normal dengan akurasi sekitar 0,85.

metjush
sumber
Saya menganggap dokumentasi scikit-learn tidak menyoroti perbedaannya? Apakah kamu memeriksa?
Rohit
1. Kernel apa yang Anda gunakan di SVC? pengaturan standar = "rbf"? 2. Satu lawan satu dan satu melawan semua adalah pendekatan yang berbeda
kpb
dokumentasi agak jarang / tidak jelas pada topik. Disebutkan perbedaan antara satu-lawan-satu dan satu-terhadap-istirahat, dan bahwa SVS linier adalahSimilar to SVC with parameter kernel=’linear’, but implemented in terms of liblinear rather than libsvm, so it has more flexibility in the choice of penalties and loss functions and should scale better (to large numbers of samples).
metjush
untuk SVC biasa, saya menggunakan kernel default. Saya tahu 1v1 dan 1vR adalah pendekatan yang berbeda, tetapi saya rasa itulah yang ingin saya ketahui - mengapa mereka menghasilkan hasil yang berbeda? Apakah ini pilihan kernel atau pendekatan yang berbeda untuk klasifikasi beberapa kategori?
metjush

Jawaban:

23

SVM reguler dengan nilai default menggunakan fungsi basis radial sebagai kernel SVM. Ini pada dasarnya adalah kernel Gaussian alias bell-curve. Berarti bahwa tanah tak bertuan antara kelas yang berbeda dibuat dengan fungsi Gaussian. Linear-SVM menggunakan kernel linear untuk fungsi basis, sehingga Anda dapat menganggapnya sebagai fungsi ^. Itu jauh lebih merdu dan pada dasarnya hanya interpolasi linier.

Orang-orang agak memalu pertanyaan ini karena Anda tidak memberikan banyak informasi, tetapi melihat secara mendalam apa yang Anda posting ... ini mengenai beberapa aspek mendasar dari benar-benar memahami detail bias dan varians dan perbedaan antara linear dan nonlinear fungsi dasar dalam SVM.

Lihat gambar ini yang menjelaskan empat wilayah dengan bias tinggi dan rendah dan varian tinggi dan rendah. Jelas tempat terbaik adalah varians rendah dan bias rendah.

gambar bias-varian anak panah

Pertama mari kita menilai varians -

Sekarang lihat plot Anda: masukkan deskripsi gambar di sini

Fungsi basis nonlinear memiliki varian yang lebih tinggi. Lihat bagaimana ini lebih berisik daripada kernel linear! Kernel linear memiliki varian yang lebih rendah. Lihat bagaimana itu kurang berisik!

Sekarang mari kita nilai bias -

Kernel mana yang lebih akurat? Kami dapat menambahkan kesalahan yang Anda berikan. Kernel nonlinear memiliki kesalahan total ~ 550 + 325 = ~ 875. Kernel linear memiliki kesalahan ~ 690 + ~ 50 = ~ 740. Jadi kernel linear tampaknya melakukan keseluruhan yang lebih baik, tetapi mereka secara keseluruhan cukup dekat. Ini adalah hal-hal yang rumit!

Menyatukan semuanya

Lihat bagaimana kernel linear melakukan pekerjaan yang buruk pada 1 dan pekerjaan yang sangat hebat pada 0. Ini sangat tidak seimbang. Sedangkan kernel nonlinear lebih seimbang. Sepertinya sweet spot mungkin untuk menciptakan model yang seimbang yang tidak memiliki varian tinggi. Bagaimana cara kita mengendalikan varian yang tinggi? Bingo - regularisasi. Kami dapat menambahkan regularisasi ke model nonlinear dan kami mungkin akan melihat hasil yang lebih baik. Ini adalah parameter C di scikit mempelajari SVM, yang ingin Anda tingkatkan dari default. Kami juga bisa bermain dengan parameter gamma. Gamma mengontrol lebar Gaussian. Mungkin coba tingkatkan satu itu sedikit untuk mendapatkan hasil yang kurang berisik misalnya tanah kosong yang tidak bertuan di antara kelas-kelas.

Semoga ini membantu!

AN6U5
sumber
Parameter C perlu diturunkan dari default tidak meningkat.
Hamdi
4

Jika Anda menggunakan kernel default di SVC (), kernel Radial Basis Function (rbf), maka Anda mungkin mempelajari batas keputusan yang lebih nonlinear. Dalam kasus dataset digit , ini akan jauh mengungguli batas keputusan linier pada tugas ini (lihat 3.1 'Baseline Linear Classifier')

jamesmf
sumber