VotingClassifier di sсikit-learn: membangun dan mengoptimalkan ansambel model klasifikasi

Sebagai bagian dari pelaksanaan tugas besar Analisis Sentimen (analisis ulasan), saya memutuskan untuk meluangkan waktu untuk studi tambahan elemen terpisah - menggunakan VotingClassifier dari modul sklearn.ensemble sebagai alat untuk membangun ansambel model klasifikasi dan meningkatkan kualitas akhir prediksi. Mengapa ini penting dan apa nuansa?



Sering terjadi bahwa dalam penyelesaian masalah terapan analisis data, tidak segera jelas (atau tidak jelas sama sekali) model pelatihan mana yang paling cocok. Salah satu solusinya adalah memilih model yang paling populer dan / atau secara intuitif sesuai berdasarkan sifat dari data yang tersedia. Dalam hal ini, parameter dari model yang dipilih dioptimalkan (misalnya, melalui GridSearchCV) dan digunakan dalam pekerjaan. Pendekatan lain mungkin menggunakan ansambel model ketika hasil dari beberapa dari mereka secara bersamaan terlibat dalam pembentukan hasil akhir. Saya akan segera mengatakan bahwa tujuan artikel ini bukan untuk menggambarkan keuntungan menggunakan ansambel model atau prinsip-prinsip konstruksinya (ini dapat ditemukan di sini ), melainkan dalam satu pendekatan yang diterapkan secara terpisah untuk menyelesaikan masalah menggunakan contoh khusus dan menganalisis nuansa yang muncul selama solusi semacam itu.

Pernyataan masalah global adalah sebagai berikut : hanya 100 ulasan diberikan pada ponsel sebagai sampel uji, dan kami membutuhkan model pra-terlatih yang akan menunjukkan hasil terbaik pada 100 ulasan ini - yaitu, ia akan menentukan apakah ulasan tersebut positif atau negatif. Kesulitan tambahan, sebagai berikut dari kondisi masalah, adalah kurangnya sampel pelatihan. Untuk mengatasi kesulitan ini dengan bantuan perpustakaan Beautiful Soup, 10.000 ulasan tentang ponsel dan peringkat untuk mereka dari salah satu situs Rusia berhasil diurai.

Melewati langkah parsing, preprocessing data dan mempelajari struktur awal mereka , kami beralih ke saat ketika ada:

  • sampel pelatihan, yang terdiri dari 10.000 ulasan telepon, setiap ulasan ditandai biner (positif atau negatif). Markup untuk definisi ulasan dengan peringkat 1-3 sebagai negatif dan peringkat 4-5 sebagai positif.
  • menggunakan Count Vectorizer, data disajikan dalam bentuk yang sesuai untuk model classifier pelatihan

Bagaimana menentukan model mana yang terbaik untuk Anda? Kami tidak memiliki kemampuan untuk mengulang secara manual atas model, karena sampel uji yang hanya 100 ulasan menimbulkan risiko besar bahwa beberapa model hanya lebih cocok untuk sampel uji ini, tetapi jika Anda menggunakannya pada sampel tambahan yang disembunyikan dari kami atau dalam "pertempuran", hasilnya akan di bawah rata-rata.

Untuk mengatasi masalah ini , pustaka Scikit-learn memiliki modul VotingClassifier , yang merupakan alat yang sangat baik untuk menggunakan beberapa, berbeda satu sama lain, model pembelajaran mesin dan menggabungkannya menjadi satu classifier. Ini mengurangi risiko pelatihan ulang, serta interpretasi yang salah dari hasil salah satu model tertentu. Modul VotingClassifier diimpor dengan perintah berikut :
from sklearn.ensemble import VotingClassifier

Detail praktis saat bekerja dengan modul ini:

1) Hal pertama dan terpenting adalah bagaimana mendapatkan prediksi tunggal yang diambil dari penggolong gabungan setelah menerima prediksi dari masing-masing model yang termasuk di dalamnya. Di antara parameter VotingClassifier ada parameter pemilihan dengan dua nilai yang mungkin: 'keras' dan 'lunak'.

1.1) Dalam kasus pertama, jawaban akhir dari classifier bersama akan sesuai dengan "pendapat" mayoritas anggotanya. Misalnya, penggolong gabungan Anda menggunakan data dari tiga model yang berbeda. Dua di antaranya pada pengamatan khusus memprediksi respons "umpan balik positif", yang ketiga - "umpan balik negatif." Jadi, untuk pengamatan ini, prediksi akhir akan menjadi "umpan balik positif", karena kita memiliki 2 - "untuk" dan 1 "melawan".

1.2) Dalam kasus kedua, mis. ketika menggunakan nilai 'lunak' dari parameter pemungutan suara , ada "pemungutan suara" penuh dan bobot prediksi model untuk setiap kelas, sehingga jawaban akhir dari penggolong gabungan adalah argmax dari jumlah probabilitas yang diprediksi. PENTING! Agar dapat menggunakan metode "voting" seperti itu, setiap classifier dari mereka yang termasuk dalam ansambel Anda harus mendukung metode predict_proba () untuk mendapatkan estimasi kuantitatif dari probabilitas kemunculan di setiap kelas. Harap dicatat bahwa tidak semua model classifier mendukung metode ini dan, karenanya, dapat digunakan dalam kerangka kerja VotingClassifier saat menggunakan metode probabilitas tertimbang (Voting Lunak).

Mari kita lihat sebuah contoh : ada tiga pengklasifikasi dan dua kelas ulasan: positif dan negatif. Setiap classifier, melalui metode predict_proba, akan memberikan nilai probabilitas tertentu (p), dengan mana pengamatan tertentu ditugaskan olehnya ke kelas 1 dan, dengan demikian, dengan probabilitas (1-p) untuk kelas dua. Penggolong gabungan, setelah menerima jawaban dari masing-masing model, melakukan pembobotan dari estimasi yang diperoleh dan memberikan hasil akhir yang diperoleh sebagai

$$ menampilkan $$ maks (w1 * p1 + w2 * p1 + w3 * p1, w1 * p2 + w2 * p2 + w3 * p3) $$ menampilkan $$

, di mana w1, w2, w3 adalah bobot pengklasifikasi Anda termasuk dalam ansambel, secara default memiliki bobot yang sama, dan p1, p2 adalah penilaian milik kelas 1 atau kelas 2 masing-masing. Harap perhatikan juga bahwa bobot pengklasifikasi saat menggunakan Soft Vote dapat diubah menggunakan parameter bobot, sehingga panggilan modul akan terlihat seperti ini:
... = VotingClassifier(estimators=[('..', clf1), ('..', clf2), ('...', clf3)], voting='soft', weights=[*,*,*]) , di mana tanda bintang dapat menunjukkan bobot yang diperlukan untuk masing-masing model.

2) Kemampuan untuk secara bersamaan menggunakan modul VotingClassifier dan GridSearch untuk mengoptimalkan hyperparameter dari masing-masing pengklasifikasi yang termasuk dalam ansambel.

Ketika Anda berencana untuk menggunakan ansambel dan ingin agar model yang dimasukkan di dalamnya dioptimalkan, Anda dapat menggunakan GridSearch pada pengklasifikasi terpadu. Dan kode di bawah ini menunjukkan bagaimana Anda dapat bekerja dengan model yang disertakan di dalamnya (Regresi logistik, naif Bayes, keturunan gradien stokastik) sambil tetap berada dalam kerangka classifier terpadu (VotingClassifier):

 clf1 = LogisticRegression() clf2 = MultinomialNB() clf3 = SGDClassifier(max_iter=1000, loss='log') eclf = VotingClassifier(estimators=[ ('lr', clf1), ('nb', clf2),('sgd', clf3)], voting='hard') #      (hard voting), . . 1.1 <b>params = {'lr__C' : [0.5,1,1.5], 'lr__class_weight': [None,'balanced'], 'nb__alpha' : [0.1,1,2], 'sgd__penalty' : ['l2', 'l1'], 'sgd__alpha': [0.0001,0.001,0.01]} </b> #       ,  ,     grid = GridSearchCV(estimator=eclf, param_grid=params, cv=5, scoring='accuracy', n_jobs=-1) grid = grid.fit(data_messages_vectorized, df_texts['Binary_Rate']) #    ,      5      

Dengan demikian, kamus params harus disetel sehingga saat mengaksesnya melalui GridSearch, Anda dapat menentukan parameter mana dalam rangkaian model yang merujuk ke parameter yang nilainya ingin Anda optimalkan.

Hanya itu yang perlu Anda ketahui untuk sepenuhnya menggunakan alat VotingClassifier sebagai cara untuk membangun ansambel model dan mengoptimalkannya. Mari kita lihat hasilnya:

  print grid.best_params_ {'lr__class_weight': 'balanced', 'sgd__penalty': 'l1', 'nb__alpha': 1, 'lr__C': 1, 'sgd__alpha': 0.001} 

Nilai-nilai optimal dari parameter yang ditemukan, masih untuk membandingkan hasil pekerjaan untuk ansambel classifier (VotingClassifier) ​​dengan parameter optimal, kami akan melakukan validasi silang pada sampel pelatihan dan membandingkan model dengan parameter optimal dan ansambel yang terdiri dari:

 for clf, label in zip([clf1, clf2, clf3, eclf], ['Logistic Regression', 'Naive Bayes', 'SGD', 'Ensemble_HardVoting']): scores = cross_val_score(clf, data_messages_vectorized, df_texts['Binary_Rate'], cv=3, scoring='accuracy') print("Accuracy: %0.2f (+/- %0.2f) [%s]" % (scores.mean(), scores.std(), label)) 

Hasil akhir:

Akurasi: 0,75 (± 0,02) [Regresi Logistik]
Akurasi: 0,79 (± 0,02) [Naif Bayes]
Akurasi: 0,79 (± 0,02) [SGD]
Akurasi: 0,79 (± 0,02) [Ensemble_HardVoting]

Seperti yang Anda lihat, model menunjukkan diri mereka agak berbeda dalam sampel pelatihan (dengan parameter standar, perbedaan ini lebih terlihat). Selain itu, nilai total (sesuai dengan metrik akurasi) ensemble tidak harus melebihi nilai terbaik dari model yang dimasukkan di dalamnya, karena ansambel ini merupakan model yang lebih stabil, yang mampu menunjukkan ± hasil yang sama di set tes dan di "pertempuran", yang berarti mengurangi risiko pelatihan ulang, pemasangan ke set pelatihan, dan masalah lain pengklasifikasian yang terkait dengan pelatihan. Semoga berhasil dalam menyelesaikan masalah yang teraplikasi dan terima kasih atas perhatian Anda!

PS Dengan memberikan spesifikasi dan aturan publikasi di kotak pasir, saya tidak dapat memberikan tautan ke github dan kode sumber untuk analisis yang diberikan dalam artikel ini, serta tautan ke Kaggle, dalam kerangka kompetisi InClass yang menyediakan set uji dan alat untuk memeriksa model di atasnya. Saya hanya bisa mengatakan bahwa ansambel ini secara signifikan mengalahkan garis dasar dan mengambil tempat yang semestinya di papan peringkat setelah memeriksa set tes. Saya berharap dalam publikasi berikut ini saya dapat berbagi.

Source: https://habr.com/ru/post/id430280/


All Articles