1.4. Support Vector Machines
Mesin dukungan vektor (SVMs) adalah seperangkat metode pembelajaran terawasi digunakan untuk deteksi klasifikasi, regresi dan outlier.
Keuntungan dari mesin dukungan vektor adalah:
Efektif di ruang dimensi tinggi.
Masih efektif dalam kasus-kasus di mana jumlah dimensi lebih besar dari jumlah sampel.
Menggunakan subset poin pelatihan dalam fungsi keputusan (disebut vektor dukungan), sehingga juga memori efisien.
Serbaguna: fungsi Kernel yang berbeda dapat ditentukan untuk fungsi keputusan. Kernel umum disediakan, tetapi juga memungkinkan untuk menentukan kernel kustom.
Kelemahan mesin dukungan vektor meliputi:
Jika jumlah fitur jauh lebih besar dari jumlah sampel, metode ini kemungkinan akan memberikan pertunjukan miskin.
SVMs tidak langsung memberikan perkiraan probabilitas, ini dihitung dengan menggunakan mahal lima kali lipat cross-validasi (lihat Skor dan probabilitas, di bawah).
Mesin-mesin dukungan vektor di scikit-belajar mendukung padat (numpy.ndarray dan convertible itu oleh numpy.asarray) dan jarang (scipy.sparse ada) vektor sampel sebagai masukan. Namun, untuk menggunakan SVM untuk membuat prediksi untuk data jarang, itu harus telah masuk pada data tersebut. Untuk kinerja optimal, gunakan C-memerintahkan numpy.ndarray (padat) atau scipy.sparse.csr_matrix (jarang) dengan dtype = float64.1.4.1. Klasifikasi
SVC, NuSVC dan LinearSVC adalah kelas mampu melakukan klasifikasi multi-kelas pada dataset.../_images/plot_iris_0012.png
SVC dan NuSVC adalah metode yang serupa, tetapi menerima set sedikit berbeda dari parameter dan memiliki formulasi matematika yang berbeda (lihat bagian formulasi Matematika). Di sisi lain, LinearSVC adalah implementasi lain Support Vector Klasifikasi untuk kasus kernel linear. Perhatikan bahwa LinearSVC tidak menerima kernel kata kunci, karena ini dianggap linear. Hal ini juga tidak memiliki beberapa anggota SVC dan NuSVC, seperti support_.
Sebagai pengklasifikasi lainnya, SVC, NuSVC dan LinearSVC mengambil sebagai masukan dua array: array X ukuran [N_SAMPLES, n_features] memegang sampel pelatihan, dan y array label kelas (string atau bilangan bulat), ukuran [N_SAMPLES]:
>>> Dari sklearn impor SVM>>> X = [[0, 0], [1, 1]]>>> Y = [0, 1]>>> CLF = svm.SVC ()>>> Clf.fit (X, y)SVC (C = 1,0, cache_size = 200, class_weight = None, coef0 = 0,0,
decision_function_shape = None, gelar = 3, gamma = 'auto', kernel = 'rbf',
max_iter = -1, probabilitas = False, random_state = None, menyusut = True,
tol = 0,001, verbose = False)
Setelah dipasang, model kemudian dapat digunakan untuk memprediksi nilai-nilai baru:
>>> Clf.predict ([[2., 2.]])array ([1])
SVMs fungsi keputusan tergantung pada beberapa subset dari data pelatihan, yang disebut vektor dukungan. Beberapa sifat vektor dukungan ini dapat ditemukan pada anggota support_vectors_, support_ dan n_support:
>>> # Vektor get dukungan>>> Clf.support_vectors_array ([[0, 0],
[1., 1.]])>>> # Get indeks vektor dukungan>>> Clf.support_array ([0, 1] ...)>>> # Mendapatkan jumlah vektor dukungan untuk masing-masing kelas>>> Clf.n_support_array ([1, 1] ...)
1.4.1.1. Klasifikasi multi-kelas
SVC dan NuSVC menerapkan "satu-lawan satu" pendekatan (Knerr et al., 1990) untuk klasifikasi kelas multi. Jika n_class adalah jumlah kelas, maka n_class * (n_class - 1) / 2 pengklasifikasi dibangun dan masing-masing kereta data dari dua kelas. Untuk menyediakan antarmuka yang konsisten dengan pengklasifikasi lain, opsi decision_function_shape memungkinkan untuk agregat hasil dari "satu-lawan satu" pengklasifikasi untuk fungsi keputusan bentuk (N_SAMPLES, n_classes):
>>> X = [[0], [1], [2], [3]]>>> Y = [0, 1, 2, 3]>>> CLF = svm.SVC (decision_function_shape = 'ovo')>>> Clf.fit (X, Y)SVC (C = 1,0, cache_size = 200, class_weight = None, coef0 = 0,0,
decision_function_shape = 'ovo', gelar = 3, gamma = 'auto', kernel = 'rbf',
max_iter = -1, probabilitas = False, random_state = None, menyusut = True,
tol = 0,001, verbose = False)>>> Desember = clf.decision_function ([[1]])>>> Dec.shape [1] # 4 kelas: 4 * 02/03 = 66>>> Clf.decision_function_shape = "ovr">>> Desember = clf.decision_function ([[1]])>>> Dec.shape [1] # 4 kelas4
Di sisi lain, LinearSVC menerapkan "satu-vs-the-sisa" strategi multi-kelas, sehingga pelatihan model n_class. Jika hanya ada dua kelas, hanya satu model dilatih:
>>> Lin_clf = svm.LinearSVC ()>>> Lin_clf.fit (X, Y)LinearSVC (C = 1,0, class_weight = None, dual = True, fit_intercept = True,
intercept_scaling = 1, hilangnya = 'squared_hinge', max_iter = 1000,
multi_class = 'ovr', penalti = 'l2', random_state = None, tol = 0,0001,
verbose = 0)>>> Desember = lin_clf.decision_function ([[1]])>>> Dec.shape [1]4
Lihat formulasi matematika untuk penjelasan lengkap dari fungsi keputusan.
Perhatikan bahwa LinearSVC juga menerapkan alternatif strategi multi-kelas, yang disebut multi-kelas SVM dirumuskan oleh penipu dan Singer, dengan menggunakan multi_class option = 'crammer_singer'. Metode ini konsisten, yang tidak benar untuk klasifikasi satu-vs-rest. Dalam prakteknya, klasifikasi satu-vs-sisa biasanya disukai, karena hasilnya sebagian besar sama, tetapi runtime secara signifikan kurang.
Untuk "satu-vs-sisa" LinearSVC atribut coef_ dan intercept_ memiliki bentuk [n_class, n_features] dan [n_class] masing-masing. Setiap baris dari koefisien sesuai dengan salah satu n_class banyak "satu-vs-sisa" pengklasifikasi dan sama untuk penyadapan, dalam urutan "satu" kelas.
Dalam kasus "satu-vs satu" SVC, tata letak atribut adalah sedikit lebih terlibat. Dalam kasus memiliki kernel linear, Tata letak coef_ dan intercept_ mirip dengan yang dijelaskan untuk LinearSVC dijelaskan di atas, kecuali bahwa bentuk coef_ adalah [n_class * (n_class - 1) / 2, n_features], sesuai dengan yang banyak pengklasifikasi biner. Urutan untuk kelas 0 sampai n adalah "0 vs 1", "0 vs 2", ... "0 vs n", "1 vs 2", "1 vs 3", "1 vs n",. . . "N-1 vs n".
Bentuk dual_coef_ adalah [n_class-1, n_SV] dengan agak sulit untuk memahami tata letak. Kolom sesuai dengan vektor dukungan terlibat dalam salah satu n_class * (n_class - 1) / 2 "satu-satu-vs" pengklasifikasi. Setiap vektor dukungan digunakan dalam n_class - 1 pengklasifikasi. The n_class - 1 entri dalam setiap baris sesuai dengan koefisien ganda untuk pengklasifikasi tersebut.
Ini mungkin dibuat lebih jelas dengan contoh:
Pertimbangkan masalah tiga kelas dengan dengan kelas 0 memiliki tiga vektor dukungan v ^ {0} _0, v ^ {1} _0, v ^ {2} _0 dan kelas 1 dan 2 memiliki dua vektor dukungan v ^ {0} _1, v ^ {1} _1 dan v ^ {0} _2, v ^ {1} _2 masing-masing. Untuk setiap dukungan vektor v ^ {j} _i, ada dua koefisien ganda. Mari kita sebut koefisien dukungan vektor v ^ {j} _i di classifier antara kelas i dan k \ alpha ^ {j} _ {i, k}. Kemudian dual_coef_ terlihat seperti ini:\ alpha ^ {0} _ {0,1} \ alpha ^ {0} _ {0,2} Koefisien untuk SVs kelas 0\ alpha ^ {1} _ {0,1} \ alpha ^ {1} _ {} 0,2\ alpha ^ {2} _ {0,1} \ alpha ^ {2} _ {} 0,2\ alpha ^ {0} _ {1,0} \ alpha ^ {0} _ {1,2} Koefisien untuk SVs kelas 1\ alpha ^ {1} _ {1,0} \ alpha ^ {1} _ {1,2}\ alpha ^ {0} _ {2,0} \ alpha ^ {0} _ {2,1} Koefisien untuk SVs kelas 2\ alpha ^ {1} _ {2,0} \ alpha ^ {1} _ {} 2,11.4.1.2. Skor dan probabilitas
Metode SVC decision_function memberikan skor per kelas untuk setiap sampel (atau nilai tunggal per sampel dalam kasus biner). Ketika probabilitas pilihan konstruktor diatur ke True, perkiraan probabilitas keanggotaan kelas (dari metode predict_proba dan predict_log_proba) diaktifkan. Dalam kasus biner, probabilitas dikalibrasi menggunakan Platt skala: regresi logistik pada nilai SVM ini, cocok dengan tambahan cross-validasi data pelatihan. Dalam kasus multiclass, ini diperpanjang sesuai Wu et al. (2004).
Tak perlu dikatakan, salib-validasi terlibat dalam Platt skala adalah operasi yang mahal untuk dataset besar. Selain itu, perkiraan probabilitas mungkin tidak konsisten dengan nilai, dalam arti bahwa "argmax" dari skor tidak mungkin argmax dari probabilitas. (Misalnya, dalam klasifikasi biner, sampel dapat diberi label oleh memprediksi sebagai milik kelas yang memiliki probabilitas <½ menurut predict_proba.) Metode Platt juga dikenal memiliki masalah teoritis. Jika skor kepercayaan yang diperlukan, tetapi ini tidak harus probabilitas, maka dianjurkan untuk mengatur probabilitas = False dan penggunaan decision_function bukan predict_proba.
Referensi:
Wu, Lin dan Weng, "perkiraan Probabilitas untuk multi-kelas klasifikasi dengan kopling berpasangan". JMLR 5: 975-1005 2004.
1.4.1.3. Masalah tidak seimbang
Dalam masalah di mana diinginkan untuk memberikan lebih penting untuk kelas-kelas tertentu atau kata kunci sampel individu tertentu class_weight dan sample_weight dapat digunakan.
SVC (tapi tidak NuSVC) menerapkan class_weight kata kunci dalam metode fit. Ini adalah kamus dari bentuk {class_label: value}, di mana nilai adalah angka floating point> 0 yang menentukan parameter C kelas class_label nilai C *.../_images/plot_separating_hyperplane_unbalanced_0011.png
SVC, NuSVC, SVR, NuSVR dan OneClassSVM menerapkan juga bobot untuk sampel individu dalam metode fit melalui kata kunci sample_weight. Mirip dengan class_weight, ini mengatur parameter C untuk contoh ke-i ke C * sample_weight [i].../_images/plot_weighted_samples_0011.png
Contoh:
Plot pengklasifikasi SVM yang berbeda dalam dataset iris,
SVM: Margin Maksimum memisahkan hyperplane,
SVM: Memisahkan hyperplane untuk kelas tidak seimbang
SVM-Anova: SVM dengan pilihan fitur univariat,
Non-linear SVM
Sampel tertimbang,: SVM
1.4.2. Regresi
Metode Support Vector Klasifikasi dapat diperpanjang untuk memecahkan masalah regresi. Metode ini disebut Support Vector Regression.
Model yang diproduksi oleh klasifikasi dukungan vektor (seperti dijelaskan di atas) hanya bergantung pada subset dari data pelatihan, karena fungsi biaya untuk membangun model tidak peduli poin pelatihan yang berada di luar margin. Analog, model yang diproduksi oleh Support Vector Regression hanya bergantung pada subset dari data pelatihan, karena fungsi biaya untuk membangun model mengabaikan data dekat pelatihan dengan model prediksi.
Ada tiga implementasi yang berbeda dari Support Vector Regression: SVR, NuSVR dan LinearSVR. LinearSVR menyediakan implementasi lebih cepat dari SVR tetapi hanya menganggap kernel linear, sementara NuSVR menerapkan formulasi yang sedikit berbeda dari SVR dan LinearSVR. Lihat detail Implementasi untuk keterangan lebih lanjut.
Seperti kelas klasifikasi, metode fit akan mengambil sebagai vektor argumen X, y, hanya itu dalam hal ini y diharapkan memiliki nilai floating point bukan nilai integer:
>>> Dari sklearn impor SVM>>> X = [[0, 0], [2, 2]]>>> Y = [0,5, 2,5]>>> CLF = svm.SVR ()>>> Clf.fit (X, y)SVR (C = 1,0, cache_size = 200, coef0 = 0,0, tingkat = 3, epsilon = 0,1, gamma = 'auto',
kernel = 'rbf', max_iter = -1, menyusut = True, tol = 0,001, verbose = False)>>> Clf.predict ([[1, 1]])array ([1,5])
Contoh:
Support Vector Regression (SVR) menggunakan linear dan non-linear kernel
1.4.3. Estimasi kepadatan, deteksi baru
Satu kelas SVM digunakan untuk deteksi baru, yaitu, diberikan satu set sampel, akan mendeteksi batas lembut set yang sehingga dapat mengklasifikasikan poin baru sebagai milik yang ditetapkan atau tidak. Kelas yang mengimplementasikan ini disebut OneClassSVM.
Dalam hal ini, karena ini adalah jenis pembelajaran tanpa pengawasan, metode fit akan hanya mengambil sebagai masukan array X, karena tidak ada label kelas.
Lihat, bagian Novelty dan outlier Detection untuk rincian lebih lanjut tentang penggunaan ini.../_images/plot_oneclass_0011.png
Contoh:
Satu kelas SVM dengan kernel non-linear (RBF)
Pemodelan distribusi spesies
1.4.4. Kompleksitas
Support Vector Machines adalah alat yang kuat, tetapi menghitung dan penyimpanan kebutuhan mereka meningkat pesat dengan jumlah vektor pelatihan. Inti dari sebuah SVM adalah masalah pemrograman kuadratik (QP), memisahkan vektor dukungan dari seluruh data pelatihan. QP solver digunakan oleh ini skala implementasi berbasis libsvm antara O (n_ {fitur} \ kali n_ {sampel} ^ 2) dan O (n_ {fitur} \ kali n_ {sampel} ^ 3) tergantung pada seberapa efisien cache libsvm digunakan dalam praktek (tergantung dataset). Jika data yang sangat jarang n_ {} fitur harus diganti dengan jumlah rata-rata fitur non-nol dalam vektor sampel.
Juga mencatat bahwa untuk kasus linear, algoritma yang digunakan dalam LinearSVC oleh pelaksanaan liblinear jauh lebih efisien daripada berbasis libsvm nya SVC rekan dan dapat skala hampir linear untuk jutaan sampel dan / atau fitur.1.4.5. Tips Praktis Gunakan
Menghindari Data copy: Untuk SVC, SVR, NuSVC dan NuSVR, jika data yang diberikan kepada metode-metode tertentu tidak C-memerintahkan berdekatan, dan presisi ganda, itu akan disalin sebelum memanggil pelaksanaan C mendasarinya. Anda dapat memeriksa apakah array memberi numpy adalah C-contiguous dengan memeriksa bendera yang atribut.
Untuk LinearSVC (dan LogisticRegression) setiap masukan lulus sebagai array numpy akan disalin dan dikonversi ke representasi liblinear internal yang jarang data (mengapung presisi ganda dan indeks int32 komponen non-nol). Jika Anda ingin menyesuaikan linear classifier skala besar tanpa menyalin numpy C-contiguous berbagai presisi ganda padat sebagai masukan kami sarankan untuk menggunakan kelas SGDClassifier gantinya. Fungsi tujuan dapat dikonfigurasi untuk menjadi hampir sama dengan model LinearSVC.
Kernel ukuran cache: Untuk SVC, SVR, nuSVC dan NuSVR, ukuran cache kernel memiliki dampak yang kuat pada lari kali untuk masalah yang lebih besar. Jika Anda memiliki RAM yang cukup tersedia, dianjurkan untuk mengatur cache_size ke nilai lebih tinggi dari default 200 (MB), seperti 500 (MB) atau 1000 (MB).
Pengaturan C: C adalah 1 secara default dan itu adalah pilihan standar yang wajar. Jika Anda memiliki banyak pengamatan bising Anda harus mengurangi itu. Hal ini sesuai untuk mengatur lebih estimasi.
Support Vector Machine algoritma tidak skala invarian, sehingga sangat dianjurkan untuk skala data Anda. Sebagai contoh, skala setiap atribut pada vektor input X untuk [0,1] atau [-1, + 1], atau standarisasi untuk memiliki mean 0 dan varians 1. Perhatikan bahwa skala yang sama harus diterapkan pada vektor tes untuk memperoleh hasil yang berarti. Lihat bagian Preprocessing data untuk rincian lebih lanjut tentang scaling dan normalisasi.
Parameter nu di NuSVC / OneClassSVM / NuSVR mendekati fraksi kesalahan pelatihan dan vektor dukungan.
Dalam SVC, jika data untuk klasifikasi yang tidak seimbang (misalnya banyak positif dan negatif beberapa), ditetapkan class_weight = 'seimbang' dan / atau mencoba parameter penalti yang berbeda C.
Yang mendasari pelaksanaan LinearSVC menggunakan nomor acak generator untuk memilih fitur ketika pas model. Dengan demikian tidak jarang, memiliki hasil yang sedikit berbeda untuk input data yang sama. Jika itu terjadi, cobalah dengan parameter tol lebih kecil.
Menggunakan L1 hukuman yang disediakan oleh LinearSVC (rugi = 'l2', penalti = 'l1', dual = False) menghasilkan solusi jarang, yaitu hanya sebagian dari fitur bobot berbeda dari nol dan berkontribusi pada fungsi keputusan. Meningkatkan C menghasilkan model yang lebih kompleks (lebih fitur yang dipilih). Nilai C yang menghasilkan "nol" model (semua bobot sama dengan nol) dapat dihitung dengan menggunakan l1_min_c.
1.4.6. Fungsi kernel
Fungsi kernel dapat salah satu dari berikut:
linear: \ Langle x, x '\ rangle.
polinomial: (\ gamma \ Langle x, x '\ rangle + r) ^ d. d ditentukan oleh tingkat kata kunci, r oleh coef0.
RBF: \ exp (- \ gamma | x-x '| ^ 2). \ gamma ditentukan oleh gamma kata kunci, harus lebih besar dari 0.
sigmoid (\ tanh (\ gamma \ Langle x, x '\ rangle + r)), di mana r ditentukan oleh coef0.
Kernel yang berbeda yang ditentukan oleh kernel kata kunci di inisialisasi:
>>> Linear_svc = svm.SVC (kernel = 'linear')>>> Linear_svc.kernel'linear'>>> Rbf_svc = svm.SVC (kernel = 'rbf')>>> Rbf_svc.kernel'RBF'
1.4.6.1. Kustom Kernel
Anda dapat menentukan kernel Anda sendiri dengan baik memberikan kernel sebagai fungsi python atau dengan precomputing matriks Gram.
Pengklasifikasi dengan kernel kustom berperilaku dengan cara yang sama seperti pengklasifikasi lainnya, kecuali bahwa:
Bidang support_vectors_ sekarang kosong, hanya indeks vektor dukungan disimpan di support_
Sebuah referensi (dan bukan salinan) dari argumen pertama dalam metode fit () disimpan untuk referensi di masa mendatang. Jika array yang berubah antara penggunaan fit () dan memprediksi () Anda akan memiliki hasil yang tidak diharapkan.
1.4.6.1.1. Menggunakan fungsi Python sebagai kernel
Anda juga dapat menggunakan kernel sendiri didefinisikan dengan melewati fungsi untuk kernel kata kunci dalam konstruktor.
Kernel Anda harus mengambil sebagai argumen dua matriks bentuk (n_samples_1, n_features), (n_samples_2, n_features) dan kembali matriks kernel bentuk (n_samples_1, n_samples_2).
Kode berikut mendefinisikan kernel linear dan menciptakan contoh classifier yang akan menggunakan kernel yang:
>>> Impor numpy sebagai np>>> Dari sklearn impor SVM>>> Def my_kernel (X, Y):... Kembali np.dot (X, Y.T)...>>> CLF = svm.SVC (kernel = my_kernel)
Contoh:
SVM dengan kernel kustom.
1.4.6.1.2. Menggunakan matriks Gram
Set kernel = 'Precomputed' dan lulus matriks Gram bukan X dalam metode fit. Pada saat ini, nilai-nilai kernel antara semua vektor pelatihan dan vektor uji harus disediakan.
>>> Impor numpy sebagai np>>> Dari sklearn impor SVM>>> X = np.array ([[0, 0], [1, 1]])>>> Y = [0, 1]>>> CLF = svm.SVC (kernel = 'Precomputed')>>> # Linear perhitungan kernel>>> Gram = np.dot (X, X.T)>>> Clf.fit (gram, y)SVC (C = 1,0, cache_size = 200, class_weight = None, coef0 = 0,0,
decision_function_shape = None, gelar = 3, gamma = 'auto',
kernel = 'Precomputed', max_iter = -1, probabilitas = False,
random_state = None, menyusut = True, tol = 0,001, verbose = False)>>> # Memprediksi pada contoh pelatihan>>> Clf.predict (gram)array ([0, 1])
1.4.6.1.3. Parameter dari RBF Kernel
Ketika melatih sebuah SVM dengan Radial Basis Function (RBF) kernel, dua parameter harus dipertimbangkan: C dan gamma. Parameter C, umum untuk semua kernel SVM, perdagangan off kesalahan klasifikasi contoh pelatihan terhadap kesederhanaan permukaan keputusan. Sebuah rendah C membuat permukaan keputusan halus, sementara C tinggi bertujuan mengelompokkan semua contoh pelatihan dengan benar. gamma mendefinisikan seberapa besar pengaruh contoh pelatihan tunggal memiliki. Semakin besar gamma, yang lebih dekat contoh lain harus akan terpengaruh.
Pilihan yang tepat dari C dan gamma sangat penting untuk kinerja SVM ini. Satu disarankan untuk menggunakan sklearn.grid_search.GridSearchCV dengan C dan gamma spasi eksponensial jauh untuk memilih nilai-nilai yang baik.
Contoh:
Parameter RBF SVM
1.4.7. Formulasi matematika
Sebuah mesin dukungan vektor membangun sebuah hiper-pesawat atau set hiper-pesawat dalam ruang dimensi tinggi atau tak terbatas, yang dapat digunakan untuk klasifikasi, regresi atau tugas lainnya. Secara intuitif, pemisahan yang baik dicapai oleh hiper-pesawat yang memiliki jarak terbesar ke titik data pelatihan terdekat dari setiap kelas (disebut marjin fungsional), karena pada umumnya semakin besar margin yang lebih rendah kesalahan generalisasi classifier.../_images/plot_separating_hyperplane_0011.png1.4.7.1. SVC
Vektor pelatihan diberikan x_i \ di \ mathbb {R} ^ p, i = 1, ..., n, dalam dua kelas, dan vektor y \ di \ {1, -1 \} ^ n, SVC memecahkan primal berikut masalah:
\ min_ {w, b, \ zeta} \ frac {1} {2} w ^ T w + C \ sum_ {i = 1} ^ {n} \ zeta_i \ textrm {tunduk} & y_i (w ^ T \ phi (x_i) + b) \ GEQ 1 - \ zeta_i, \\ & \ zeta_i \ GEQ 0, i = 1, ..., n
Dual yaitu
\ min _ {\ alpha} \ frac {1} {2} \ alpha ^ TQ \ alpha - e ^ T \ alpha \ textrm {tunduk} & y ^ T \ alpha = 0 \\ & 0 \ leq \ alpha_i \ leq C, i = 1, ..., n
dimana e adalah vektor dari semua orang, C> 0 adalah batas atas, Q adalah n oleh matriks semidefinite n positif, Q_ {ij} \ equiv y_i y_j K (x_i, x_j) Dimana K (x_i, x_j) = \ phi (x_i) ^ T \ phi (x_j) adalah kernel. Berikut vektor pelatihan secara implisit dipetakan menjadi lebih tinggi (mungkin tak terbatas) ruang dimensi dengan fungsi \ phi.
Fungsi keputusan adalah:
\ operatorname {} sgn (\ sum_ {i = 1} ^ n y_i \ alpha_i K (x_i, x) + \ rho)
Catatan
Sementara model SVM berasal dari libsvm dan liblinear penggunaan C sebagai parameter regularisasi, paling estimator lainnya menggunakan alpha. Hubungan antara kedua adalah C = \ frac {n \ _samples} {alpha}.
Parameter ini dapat diakses melalui anggota dual_coef_ yang memegang produk y_i \ alpha_i, support_vectors_ yang memegang vektor dukungan, dan intercept_ yang memegang independen jangka \ rho:
Referensi:
"Kapasitas Tuning otomatis Very Large Classifiers VC-dimensi" Saya Guyon, B Boser, V Vapnik - Kemajuan informasi saraf pengolahan tahun 1993,
"Dukungan jaringan-vektor" C. Cortes, V. Vapnik, Mesin Leaming, 20, 273-297 (1995)
1.4.7.2. NuSVC
Kami memperkenalkan baru parameter \ nu yang mengontrol jumlah vektor dukungan dan kesalahan pelatihan. Parameter \ nu \ di (0, 1] adalah batas atas fraksi kesalahan pelatihan dan batas bawah dari fraksi vektor dukungan.
Hal ini dapat menunjukkan bahwa formulasi \ nu-SVC adalah reparametrization dari C-SVC dan karena itu matematis setara.1.4.7.3. SVR
Vektor pelatihan diberikan x_i \ di \ mathbb {R} ^ p, i = 1, ..., n, dan vektor y \ di \ mathbb {R} ^ n \ varepsilon-SVR memecahkan berikut masalah primal:
\ min_ {w, b, \ zeta, \ zeta ^ *} \ frac {1} {2} w ^ T w + C \ sum_ {i = 1} ^ {n} (\ zeta_i + \ zeta_i ^ *) \ textrm {tunduk} & y_i - w ^ T \ phi (x_i) - b \ leq \ varepsilon + \ zeta_i, \\ & w ^ T \ phi (x_i) + b - y_i \ leq \ varepsilon + \ zeta_i ^ * , \\ & \ zeta_i, \ zeta_i ^ * \ GEQ 0, i = 1, ..., n
Dual yaitu
\ min _ {\ alpha, \ alpha ^ *} \ frac {1} {2} (\ alpha - \ alpha ^ *) ^ TQ (\ alpha - \ alpha ^ *) + \ varepsilon e ^ T (\ alpha + \ alpha ^ *) - y ^ T (\ alpha - \ alpha ^ *) \ textrm {tunduk} & e ^ T (\ alpha - \ alpha ^ *) = 0 \\ & 0 \ leq \ alpha_i, \ alpha_i ^ * \ leq C, i = 1, ..., n
dimana e adalah vektor dari semua orang, C> 0 adalah batas atas, Q adalah n oleh matriks semidefinite n positif, Q_ {ij} \ equiv K (x_i, x_j) = \ phi (x_i) ^ T \ phi ( x_j) adalah kernel. Berikut vektor pelatihan secara implisit dipetakan menjadi lebih tinggi (mungkin tak terbatas) ruang dimensi dengan fungsi \ phi.
Fungsi keputusan adalah:
\ sum_ {i = 1} ^ n (\ alpha_i - \ alpha_i ^ *) K (x_i, x) + \ rho
Parameter ini dapat diakses melalui anggota dual_coef_ yang memegang perbedaan \ alpha_i - \ alpha_i ^ *, support_vectors_ yang memegang vektor dukungan, dan intercept_ yang memegang independen jangka \ rho
Referensi:
"Sebuah Tutorial Support Vector Regression" Alex J. Smola, Bernhard Schölkopf -Statistics dan Komputasi Volume arsip 14 Issue 3, Agustus 2004, hal. 199-222
1.4.8. Rincian pelaksanaan
Secara internal, kami menggunakan libsvm dan liblinear untuk menangani semua perhitungan. Perpustakaan ini dibungkus menggunakan C dan Cython.
Referensi:
Untuk penjelasan dari pelaksanaan dan rincian dari algoritma yang digunakan, silakan lihat
LIBSVM: perpustakaan untuk Support Vector Machines
LIBLINEAR - Sebuah Perpustakaan untuk Besar Klasifikasi Linear
Mesin dukungan vektor (SVMs) adalah seperangkat metode pembelajaran terawasi digunakan untuk deteksi klasifikasi, regresi dan outlier.
Keuntungan dari mesin dukungan vektor adalah:
Efektif di ruang dimensi tinggi.
Masih efektif dalam kasus-kasus di mana jumlah dimensi lebih besar dari jumlah sampel.
Menggunakan subset poin pelatihan dalam fungsi keputusan (disebut vektor dukungan), sehingga juga memori efisien.
Serbaguna: fungsi Kernel yang berbeda dapat ditentukan untuk fungsi keputusan. Kernel umum disediakan, tetapi juga memungkinkan untuk menentukan kernel kustom.
Kelemahan mesin dukungan vektor meliputi:
Jika jumlah fitur jauh lebih besar dari jumlah sampel, metode ini kemungkinan akan memberikan pertunjukan miskin.
SVMs tidak langsung memberikan perkiraan probabilitas, ini dihitung dengan menggunakan mahal lima kali lipat cross-validasi (lihat Skor dan probabilitas, di bawah).
Mesin-mesin dukungan vektor di scikit-belajar mendukung padat (numpy.ndarray dan convertible itu oleh numpy.asarray) dan jarang (scipy.sparse ada) vektor sampel sebagai masukan. Namun, untuk menggunakan SVM untuk membuat prediksi untuk data jarang, itu harus telah masuk pada data tersebut. Untuk kinerja optimal, gunakan C-memerintahkan numpy.ndarray (padat) atau scipy.sparse.csr_matrix (jarang) dengan dtype = float64.1.4.1. Klasifikasi
SVC, NuSVC dan LinearSVC adalah kelas mampu melakukan klasifikasi multi-kelas pada dataset.../_images/plot_iris_0012.png
SVC dan NuSVC adalah metode yang serupa, tetapi menerima set sedikit berbeda dari parameter dan memiliki formulasi matematika yang berbeda (lihat bagian formulasi Matematika). Di sisi lain, LinearSVC adalah implementasi lain Support Vector Klasifikasi untuk kasus kernel linear. Perhatikan bahwa LinearSVC tidak menerima kernel kata kunci, karena ini dianggap linear. Hal ini juga tidak memiliki beberapa anggota SVC dan NuSVC, seperti support_.
Sebagai pengklasifikasi lainnya, SVC, NuSVC dan LinearSVC mengambil sebagai masukan dua array: array X ukuran [N_SAMPLES, n_features] memegang sampel pelatihan, dan y array label kelas (string atau bilangan bulat), ukuran [N_SAMPLES]:
>>> Dari sklearn impor SVM>>> X = [[0, 0], [1, 1]]>>> Y = [0, 1]>>> CLF = svm.SVC ()>>> Clf.fit (X, y)SVC (C = 1,0, cache_size = 200, class_weight = None, coef0 = 0,0,
decision_function_shape = None, gelar = 3, gamma = 'auto', kernel = 'rbf',
max_iter = -1, probabilitas = False, random_state = None, menyusut = True,
tol = 0,001, verbose = False)
Setelah dipasang, model kemudian dapat digunakan untuk memprediksi nilai-nilai baru:
>>> Clf.predict ([[2., 2.]])array ([1])
SVMs fungsi keputusan tergantung pada beberapa subset dari data pelatihan, yang disebut vektor dukungan. Beberapa sifat vektor dukungan ini dapat ditemukan pada anggota support_vectors_, support_ dan n_support:
>>> # Vektor get dukungan>>> Clf.support_vectors_array ([[0, 0],
[1., 1.]])>>> # Get indeks vektor dukungan>>> Clf.support_array ([0, 1] ...)>>> # Mendapatkan jumlah vektor dukungan untuk masing-masing kelas>>> Clf.n_support_array ([1, 1] ...)
1.4.1.1. Klasifikasi multi-kelas
SVC dan NuSVC menerapkan "satu-lawan satu" pendekatan (Knerr et al., 1990) untuk klasifikasi kelas multi. Jika n_class adalah jumlah kelas, maka n_class * (n_class - 1) / 2 pengklasifikasi dibangun dan masing-masing kereta data dari dua kelas. Untuk menyediakan antarmuka yang konsisten dengan pengklasifikasi lain, opsi decision_function_shape memungkinkan untuk agregat hasil dari "satu-lawan satu" pengklasifikasi untuk fungsi keputusan bentuk (N_SAMPLES, n_classes):
>>> X = [[0], [1], [2], [3]]>>> Y = [0, 1, 2, 3]>>> CLF = svm.SVC (decision_function_shape = 'ovo')>>> Clf.fit (X, Y)SVC (C = 1,0, cache_size = 200, class_weight = None, coef0 = 0,0,
decision_function_shape = 'ovo', gelar = 3, gamma = 'auto', kernel = 'rbf',
max_iter = -1, probabilitas = False, random_state = None, menyusut = True,
tol = 0,001, verbose = False)>>> Desember = clf.decision_function ([[1]])>>> Dec.shape [1] # 4 kelas: 4 * 02/03 = 66>>> Clf.decision_function_shape = "ovr">>> Desember = clf.decision_function ([[1]])>>> Dec.shape [1] # 4 kelas4
Di sisi lain, LinearSVC menerapkan "satu-vs-the-sisa" strategi multi-kelas, sehingga pelatihan model n_class. Jika hanya ada dua kelas, hanya satu model dilatih:
>>> Lin_clf = svm.LinearSVC ()>>> Lin_clf.fit (X, Y)LinearSVC (C = 1,0, class_weight = None, dual = True, fit_intercept = True,
intercept_scaling = 1, hilangnya = 'squared_hinge', max_iter = 1000,
multi_class = 'ovr', penalti = 'l2', random_state = None, tol = 0,0001,
verbose = 0)>>> Desember = lin_clf.decision_function ([[1]])>>> Dec.shape [1]4
Lihat formulasi matematika untuk penjelasan lengkap dari fungsi keputusan.
Perhatikan bahwa LinearSVC juga menerapkan alternatif strategi multi-kelas, yang disebut multi-kelas SVM dirumuskan oleh penipu dan Singer, dengan menggunakan multi_class option = 'crammer_singer'. Metode ini konsisten, yang tidak benar untuk klasifikasi satu-vs-rest. Dalam prakteknya, klasifikasi satu-vs-sisa biasanya disukai, karena hasilnya sebagian besar sama, tetapi runtime secara signifikan kurang.
Untuk "satu-vs-sisa" LinearSVC atribut coef_ dan intercept_ memiliki bentuk [n_class, n_features] dan [n_class] masing-masing. Setiap baris dari koefisien sesuai dengan salah satu n_class banyak "satu-vs-sisa" pengklasifikasi dan sama untuk penyadapan, dalam urutan "satu" kelas.
Dalam kasus "satu-vs satu" SVC, tata letak atribut adalah sedikit lebih terlibat. Dalam kasus memiliki kernel linear, Tata letak coef_ dan intercept_ mirip dengan yang dijelaskan untuk LinearSVC dijelaskan di atas, kecuali bahwa bentuk coef_ adalah [n_class * (n_class - 1) / 2, n_features], sesuai dengan yang banyak pengklasifikasi biner. Urutan untuk kelas 0 sampai n adalah "0 vs 1", "0 vs 2", ... "0 vs n", "1 vs 2", "1 vs 3", "1 vs n",. . . "N-1 vs n".
Bentuk dual_coef_ adalah [n_class-1, n_SV] dengan agak sulit untuk memahami tata letak. Kolom sesuai dengan vektor dukungan terlibat dalam salah satu n_class * (n_class - 1) / 2 "satu-satu-vs" pengklasifikasi. Setiap vektor dukungan digunakan dalam n_class - 1 pengklasifikasi. The n_class - 1 entri dalam setiap baris sesuai dengan koefisien ganda untuk pengklasifikasi tersebut.
Ini mungkin dibuat lebih jelas dengan contoh:
Pertimbangkan masalah tiga kelas dengan dengan kelas 0 memiliki tiga vektor dukungan v ^ {0} _0, v ^ {1} _0, v ^ {2} _0 dan kelas 1 dan 2 memiliki dua vektor dukungan v ^ {0} _1, v ^ {1} _1 dan v ^ {0} _2, v ^ {1} _2 masing-masing. Untuk setiap dukungan vektor v ^ {j} _i, ada dua koefisien ganda. Mari kita sebut koefisien dukungan vektor v ^ {j} _i di classifier antara kelas i dan k \ alpha ^ {j} _ {i, k}. Kemudian dual_coef_ terlihat seperti ini:\ alpha ^ {0} _ {0,1} \ alpha ^ {0} _ {0,2} Koefisien untuk SVs kelas 0\ alpha ^ {1} _ {0,1} \ alpha ^ {1} _ {} 0,2\ alpha ^ {2} _ {0,1} \ alpha ^ {2} _ {} 0,2\ alpha ^ {0} _ {1,0} \ alpha ^ {0} _ {1,2} Koefisien untuk SVs kelas 1\ alpha ^ {1} _ {1,0} \ alpha ^ {1} _ {1,2}\ alpha ^ {0} _ {2,0} \ alpha ^ {0} _ {2,1} Koefisien untuk SVs kelas 2\ alpha ^ {1} _ {2,0} \ alpha ^ {1} _ {} 2,11.4.1.2. Skor dan probabilitas
Metode SVC decision_function memberikan skor per kelas untuk setiap sampel (atau nilai tunggal per sampel dalam kasus biner). Ketika probabilitas pilihan konstruktor diatur ke True, perkiraan probabilitas keanggotaan kelas (dari metode predict_proba dan predict_log_proba) diaktifkan. Dalam kasus biner, probabilitas dikalibrasi menggunakan Platt skala: regresi logistik pada nilai SVM ini, cocok dengan tambahan cross-validasi data pelatihan. Dalam kasus multiclass, ini diperpanjang sesuai Wu et al. (2004).
Tak perlu dikatakan, salib-validasi terlibat dalam Platt skala adalah operasi yang mahal untuk dataset besar. Selain itu, perkiraan probabilitas mungkin tidak konsisten dengan nilai, dalam arti bahwa "argmax" dari skor tidak mungkin argmax dari probabilitas. (Misalnya, dalam klasifikasi biner, sampel dapat diberi label oleh memprediksi sebagai milik kelas yang memiliki probabilitas <½ menurut predict_proba.) Metode Platt juga dikenal memiliki masalah teoritis. Jika skor kepercayaan yang diperlukan, tetapi ini tidak harus probabilitas, maka dianjurkan untuk mengatur probabilitas = False dan penggunaan decision_function bukan predict_proba.
Referensi:
Wu, Lin dan Weng, "perkiraan Probabilitas untuk multi-kelas klasifikasi dengan kopling berpasangan". JMLR 5: 975-1005 2004.
1.4.1.3. Masalah tidak seimbang
Dalam masalah di mana diinginkan untuk memberikan lebih penting untuk kelas-kelas tertentu atau kata kunci sampel individu tertentu class_weight dan sample_weight dapat digunakan.
SVC (tapi tidak NuSVC) menerapkan class_weight kata kunci dalam metode fit. Ini adalah kamus dari bentuk {class_label: value}, di mana nilai adalah angka floating point> 0 yang menentukan parameter C kelas class_label nilai C *.../_images/plot_separating_hyperplane_unbalanced_0011.png
SVC, NuSVC, SVR, NuSVR dan OneClassSVM menerapkan juga bobot untuk sampel individu dalam metode fit melalui kata kunci sample_weight. Mirip dengan class_weight, ini mengatur parameter C untuk contoh ke-i ke C * sample_weight [i].../_images/plot_weighted_samples_0011.png
Contoh:
Plot pengklasifikasi SVM yang berbeda dalam dataset iris,
SVM: Margin Maksimum memisahkan hyperplane,
SVM: Memisahkan hyperplane untuk kelas tidak seimbang
SVM-Anova: SVM dengan pilihan fitur univariat,
Non-linear SVM
Sampel tertimbang,: SVM
1.4.2. Regresi
Metode Support Vector Klasifikasi dapat diperpanjang untuk memecahkan masalah regresi. Metode ini disebut Support Vector Regression.
Model yang diproduksi oleh klasifikasi dukungan vektor (seperti dijelaskan di atas) hanya bergantung pada subset dari data pelatihan, karena fungsi biaya untuk membangun model tidak peduli poin pelatihan yang berada di luar margin. Analog, model yang diproduksi oleh Support Vector Regression hanya bergantung pada subset dari data pelatihan, karena fungsi biaya untuk membangun model mengabaikan data dekat pelatihan dengan model prediksi.
Ada tiga implementasi yang berbeda dari Support Vector Regression: SVR, NuSVR dan LinearSVR. LinearSVR menyediakan implementasi lebih cepat dari SVR tetapi hanya menganggap kernel linear, sementara NuSVR menerapkan formulasi yang sedikit berbeda dari SVR dan LinearSVR. Lihat detail Implementasi untuk keterangan lebih lanjut.
Seperti kelas klasifikasi, metode fit akan mengambil sebagai vektor argumen X, y, hanya itu dalam hal ini y diharapkan memiliki nilai floating point bukan nilai integer:
>>> Dari sklearn impor SVM>>> X = [[0, 0], [2, 2]]>>> Y = [0,5, 2,5]>>> CLF = svm.SVR ()>>> Clf.fit (X, y)SVR (C = 1,0, cache_size = 200, coef0 = 0,0, tingkat = 3, epsilon = 0,1, gamma = 'auto',
kernel = 'rbf', max_iter = -1, menyusut = True, tol = 0,001, verbose = False)>>> Clf.predict ([[1, 1]])array ([1,5])
Contoh:
Support Vector Regression (SVR) menggunakan linear dan non-linear kernel
1.4.3. Estimasi kepadatan, deteksi baru
Satu kelas SVM digunakan untuk deteksi baru, yaitu, diberikan satu set sampel, akan mendeteksi batas lembut set yang sehingga dapat mengklasifikasikan poin baru sebagai milik yang ditetapkan atau tidak. Kelas yang mengimplementasikan ini disebut OneClassSVM.
Dalam hal ini, karena ini adalah jenis pembelajaran tanpa pengawasan, metode fit akan hanya mengambil sebagai masukan array X, karena tidak ada label kelas.
Lihat, bagian Novelty dan outlier Detection untuk rincian lebih lanjut tentang penggunaan ini.../_images/plot_oneclass_0011.png
Contoh:
Satu kelas SVM dengan kernel non-linear (RBF)
Pemodelan distribusi spesies
1.4.4. Kompleksitas
Support Vector Machines adalah alat yang kuat, tetapi menghitung dan penyimpanan kebutuhan mereka meningkat pesat dengan jumlah vektor pelatihan. Inti dari sebuah SVM adalah masalah pemrograman kuadratik (QP), memisahkan vektor dukungan dari seluruh data pelatihan. QP solver digunakan oleh ini skala implementasi berbasis libsvm antara O (n_ {fitur} \ kali n_ {sampel} ^ 2) dan O (n_ {fitur} \ kali n_ {sampel} ^ 3) tergantung pada seberapa efisien cache libsvm digunakan dalam praktek (tergantung dataset). Jika data yang sangat jarang n_ {} fitur harus diganti dengan jumlah rata-rata fitur non-nol dalam vektor sampel.
Juga mencatat bahwa untuk kasus linear, algoritma yang digunakan dalam LinearSVC oleh pelaksanaan liblinear jauh lebih efisien daripada berbasis libsvm nya SVC rekan dan dapat skala hampir linear untuk jutaan sampel dan / atau fitur.1.4.5. Tips Praktis Gunakan
Menghindari Data copy: Untuk SVC, SVR, NuSVC dan NuSVR, jika data yang diberikan kepada metode-metode tertentu tidak C-memerintahkan berdekatan, dan presisi ganda, itu akan disalin sebelum memanggil pelaksanaan C mendasarinya. Anda dapat memeriksa apakah array memberi numpy adalah C-contiguous dengan memeriksa bendera yang atribut.
Untuk LinearSVC (dan LogisticRegression) setiap masukan lulus sebagai array numpy akan disalin dan dikonversi ke representasi liblinear internal yang jarang data (mengapung presisi ganda dan indeks int32 komponen non-nol). Jika Anda ingin menyesuaikan linear classifier skala besar tanpa menyalin numpy C-contiguous berbagai presisi ganda padat sebagai masukan kami sarankan untuk menggunakan kelas SGDClassifier gantinya. Fungsi tujuan dapat dikonfigurasi untuk menjadi hampir sama dengan model LinearSVC.
Kernel ukuran cache: Untuk SVC, SVR, nuSVC dan NuSVR, ukuran cache kernel memiliki dampak yang kuat pada lari kali untuk masalah yang lebih besar. Jika Anda memiliki RAM yang cukup tersedia, dianjurkan untuk mengatur cache_size ke nilai lebih tinggi dari default 200 (MB), seperti 500 (MB) atau 1000 (MB).
Pengaturan C: C adalah 1 secara default dan itu adalah pilihan standar yang wajar. Jika Anda memiliki banyak pengamatan bising Anda harus mengurangi itu. Hal ini sesuai untuk mengatur lebih estimasi.
Support Vector Machine algoritma tidak skala invarian, sehingga sangat dianjurkan untuk skala data Anda. Sebagai contoh, skala setiap atribut pada vektor input X untuk [0,1] atau [-1, + 1], atau standarisasi untuk memiliki mean 0 dan varians 1. Perhatikan bahwa skala yang sama harus diterapkan pada vektor tes untuk memperoleh hasil yang berarti. Lihat bagian Preprocessing data untuk rincian lebih lanjut tentang scaling dan normalisasi.
Parameter nu di NuSVC / OneClassSVM / NuSVR mendekati fraksi kesalahan pelatihan dan vektor dukungan.
Dalam SVC, jika data untuk klasifikasi yang tidak seimbang (misalnya banyak positif dan negatif beberapa), ditetapkan class_weight = 'seimbang' dan / atau mencoba parameter penalti yang berbeda C.
Yang mendasari pelaksanaan LinearSVC menggunakan nomor acak generator untuk memilih fitur ketika pas model. Dengan demikian tidak jarang, memiliki hasil yang sedikit berbeda untuk input data yang sama. Jika itu terjadi, cobalah dengan parameter tol lebih kecil.
Menggunakan L1 hukuman yang disediakan oleh LinearSVC (rugi = 'l2', penalti = 'l1', dual = False) menghasilkan solusi jarang, yaitu hanya sebagian dari fitur bobot berbeda dari nol dan berkontribusi pada fungsi keputusan. Meningkatkan C menghasilkan model yang lebih kompleks (lebih fitur yang dipilih). Nilai C yang menghasilkan "nol" model (semua bobot sama dengan nol) dapat dihitung dengan menggunakan l1_min_c.
1.4.6. Fungsi kernel
Fungsi kernel dapat salah satu dari berikut:
linear: \ Langle x, x '\ rangle.
polinomial: (\ gamma \ Langle x, x '\ rangle + r) ^ d. d ditentukan oleh tingkat kata kunci, r oleh coef0.
RBF: \ exp (- \ gamma | x-x '| ^ 2). \ gamma ditentukan oleh gamma kata kunci, harus lebih besar dari 0.
sigmoid (\ tanh (\ gamma \ Langle x, x '\ rangle + r)), di mana r ditentukan oleh coef0.
Kernel yang berbeda yang ditentukan oleh kernel kata kunci di inisialisasi:
>>> Linear_svc = svm.SVC (kernel = 'linear')>>> Linear_svc.kernel'linear'>>> Rbf_svc = svm.SVC (kernel = 'rbf')>>> Rbf_svc.kernel'RBF'
1.4.6.1. Kustom Kernel
Anda dapat menentukan kernel Anda sendiri dengan baik memberikan kernel sebagai fungsi python atau dengan precomputing matriks Gram.
Pengklasifikasi dengan kernel kustom berperilaku dengan cara yang sama seperti pengklasifikasi lainnya, kecuali bahwa:
Bidang support_vectors_ sekarang kosong, hanya indeks vektor dukungan disimpan di support_
Sebuah referensi (dan bukan salinan) dari argumen pertama dalam metode fit () disimpan untuk referensi di masa mendatang. Jika array yang berubah antara penggunaan fit () dan memprediksi () Anda akan memiliki hasil yang tidak diharapkan.
1.4.6.1.1. Menggunakan fungsi Python sebagai kernel
Anda juga dapat menggunakan kernel sendiri didefinisikan dengan melewati fungsi untuk kernel kata kunci dalam konstruktor.
Kernel Anda harus mengambil sebagai argumen dua matriks bentuk (n_samples_1, n_features), (n_samples_2, n_features) dan kembali matriks kernel bentuk (n_samples_1, n_samples_2).
Kode berikut mendefinisikan kernel linear dan menciptakan contoh classifier yang akan menggunakan kernel yang:
>>> Impor numpy sebagai np>>> Dari sklearn impor SVM>>> Def my_kernel (X, Y):... Kembali np.dot (X, Y.T)...>>> CLF = svm.SVC (kernel = my_kernel)
Contoh:
SVM dengan kernel kustom.
1.4.6.1.2. Menggunakan matriks Gram
Set kernel = 'Precomputed' dan lulus matriks Gram bukan X dalam metode fit. Pada saat ini, nilai-nilai kernel antara semua vektor pelatihan dan vektor uji harus disediakan.
>>> Impor numpy sebagai np>>> Dari sklearn impor SVM>>> X = np.array ([[0, 0], [1, 1]])>>> Y = [0, 1]>>> CLF = svm.SVC (kernel = 'Precomputed')>>> # Linear perhitungan kernel>>> Gram = np.dot (X, X.T)>>> Clf.fit (gram, y)SVC (C = 1,0, cache_size = 200, class_weight = None, coef0 = 0,0,
decision_function_shape = None, gelar = 3, gamma = 'auto',
kernel = 'Precomputed', max_iter = -1, probabilitas = False,
random_state = None, menyusut = True, tol = 0,001, verbose = False)>>> # Memprediksi pada contoh pelatihan>>> Clf.predict (gram)array ([0, 1])
1.4.6.1.3. Parameter dari RBF Kernel
Ketika melatih sebuah SVM dengan Radial Basis Function (RBF) kernel, dua parameter harus dipertimbangkan: C dan gamma. Parameter C, umum untuk semua kernel SVM, perdagangan off kesalahan klasifikasi contoh pelatihan terhadap kesederhanaan permukaan keputusan. Sebuah rendah C membuat permukaan keputusan halus, sementara C tinggi bertujuan mengelompokkan semua contoh pelatihan dengan benar. gamma mendefinisikan seberapa besar pengaruh contoh pelatihan tunggal memiliki. Semakin besar gamma, yang lebih dekat contoh lain harus akan terpengaruh.
Pilihan yang tepat dari C dan gamma sangat penting untuk kinerja SVM ini. Satu disarankan untuk menggunakan sklearn.grid_search.GridSearchCV dengan C dan gamma spasi eksponensial jauh untuk memilih nilai-nilai yang baik.
Contoh:
Parameter RBF SVM
1.4.7. Formulasi matematika
Sebuah mesin dukungan vektor membangun sebuah hiper-pesawat atau set hiper-pesawat dalam ruang dimensi tinggi atau tak terbatas, yang dapat digunakan untuk klasifikasi, regresi atau tugas lainnya. Secara intuitif, pemisahan yang baik dicapai oleh hiper-pesawat yang memiliki jarak terbesar ke titik data pelatihan terdekat dari setiap kelas (disebut marjin fungsional), karena pada umumnya semakin besar margin yang lebih rendah kesalahan generalisasi classifier.../_images/plot_separating_hyperplane_0011.png1.4.7.1. SVC
Vektor pelatihan diberikan x_i \ di \ mathbb {R} ^ p, i = 1, ..., n, dalam dua kelas, dan vektor y \ di \ {1, -1 \} ^ n, SVC memecahkan primal berikut masalah:
\ min_ {w, b, \ zeta} \ frac {1} {2} w ^ T w + C \ sum_ {i = 1} ^ {n} \ zeta_i \ textrm {tunduk} & y_i (w ^ T \ phi (x_i) + b) \ GEQ 1 - \ zeta_i, \\ & \ zeta_i \ GEQ 0, i = 1, ..., n
Dual yaitu
\ min _ {\ alpha} \ frac {1} {2} \ alpha ^ TQ \ alpha - e ^ T \ alpha \ textrm {tunduk} & y ^ T \ alpha = 0 \\ & 0 \ leq \ alpha_i \ leq C, i = 1, ..., n
dimana e adalah vektor dari semua orang, C> 0 adalah batas atas, Q adalah n oleh matriks semidefinite n positif, Q_ {ij} \ equiv y_i y_j K (x_i, x_j) Dimana K (x_i, x_j) = \ phi (x_i) ^ T \ phi (x_j) adalah kernel. Berikut vektor pelatihan secara implisit dipetakan menjadi lebih tinggi (mungkin tak terbatas) ruang dimensi dengan fungsi \ phi.
Fungsi keputusan adalah:
\ operatorname {} sgn (\ sum_ {i = 1} ^ n y_i \ alpha_i K (x_i, x) + \ rho)
Catatan
Sementara model SVM berasal dari libsvm dan liblinear penggunaan C sebagai parameter regularisasi, paling estimator lainnya menggunakan alpha. Hubungan antara kedua adalah C = \ frac {n \ _samples} {alpha}.
Parameter ini dapat diakses melalui anggota dual_coef_ yang memegang produk y_i \ alpha_i, support_vectors_ yang memegang vektor dukungan, dan intercept_ yang memegang independen jangka \ rho:
Referensi:
"Kapasitas Tuning otomatis Very Large Classifiers VC-dimensi" Saya Guyon, B Boser, V Vapnik - Kemajuan informasi saraf pengolahan tahun 1993,
"Dukungan jaringan-vektor" C. Cortes, V. Vapnik, Mesin Leaming, 20, 273-297 (1995)
1.4.7.2. NuSVC
Kami memperkenalkan baru parameter \ nu yang mengontrol jumlah vektor dukungan dan kesalahan pelatihan. Parameter \ nu \ di (0, 1] adalah batas atas fraksi kesalahan pelatihan dan batas bawah dari fraksi vektor dukungan.
Hal ini dapat menunjukkan bahwa formulasi \ nu-SVC adalah reparametrization dari C-SVC dan karena itu matematis setara.1.4.7.3. SVR
Vektor pelatihan diberikan x_i \ di \ mathbb {R} ^ p, i = 1, ..., n, dan vektor y \ di \ mathbb {R} ^ n \ varepsilon-SVR memecahkan berikut masalah primal:
\ min_ {w, b, \ zeta, \ zeta ^ *} \ frac {1} {2} w ^ T w + C \ sum_ {i = 1} ^ {n} (\ zeta_i + \ zeta_i ^ *) \ textrm {tunduk} & y_i - w ^ T \ phi (x_i) - b \ leq \ varepsilon + \ zeta_i, \\ & w ^ T \ phi (x_i) + b - y_i \ leq \ varepsilon + \ zeta_i ^ * , \\ & \ zeta_i, \ zeta_i ^ * \ GEQ 0, i = 1, ..., n
Dual yaitu
\ min _ {\ alpha, \ alpha ^ *} \ frac {1} {2} (\ alpha - \ alpha ^ *) ^ TQ (\ alpha - \ alpha ^ *) + \ varepsilon e ^ T (\ alpha + \ alpha ^ *) - y ^ T (\ alpha - \ alpha ^ *) \ textrm {tunduk} & e ^ T (\ alpha - \ alpha ^ *) = 0 \\ & 0 \ leq \ alpha_i, \ alpha_i ^ * \ leq C, i = 1, ..., n
dimana e adalah vektor dari semua orang, C> 0 adalah batas atas, Q adalah n oleh matriks semidefinite n positif, Q_ {ij} \ equiv K (x_i, x_j) = \ phi (x_i) ^ T \ phi ( x_j) adalah kernel. Berikut vektor pelatihan secara implisit dipetakan menjadi lebih tinggi (mungkin tak terbatas) ruang dimensi dengan fungsi \ phi.
Fungsi keputusan adalah:
\ sum_ {i = 1} ^ n (\ alpha_i - \ alpha_i ^ *) K (x_i, x) + \ rho
Parameter ini dapat diakses melalui anggota dual_coef_ yang memegang perbedaan \ alpha_i - \ alpha_i ^ *, support_vectors_ yang memegang vektor dukungan, dan intercept_ yang memegang independen jangka \ rho
Referensi:
"Sebuah Tutorial Support Vector Regression" Alex J. Smola, Bernhard Schölkopf -Statistics dan Komputasi Volume arsip 14 Issue 3, Agustus 2004, hal. 199-222
1.4.8. Rincian pelaksanaan
Secara internal, kami menggunakan libsvm dan liblinear untuk menangani semua perhitungan. Perpustakaan ini dibungkus menggunakan C dan Cython.
Referensi:
Untuk penjelasan dari pelaksanaan dan rincian dari algoritma yang digunakan, silakan lihat
LIBSVM: perpustakaan untuk Support Vector Machines
LIBLINEAR - Sebuah Perpustakaan untuk Besar Klasifikasi Linear
EmoticonEmoticon