Kategorisasi teks: menggabungkan berbagai fitur

19

Masalah yang saya tangani adalah mengelompokkan teks-teks pendek menjadi beberapa kelas. Pendekatan saya saat ini adalah menggunakan frekuensi istilah bobot tf-idf dan mempelajari classifier linier sederhana (regresi logistik). Ini bekerja cukup baik (sekitar 90% makro F-1 pada set tes, hampir 100% pada set pelatihan). Masalah besar adalah kata-kata yang tidak terlihat / n-gram.

Saya mencoba untuk meningkatkan classifier dengan menambahkan fitur lain, misalnya vektor berukuran tetap dihitung menggunakan persamaan distribusi (seperti yang dihitung oleh word2vec) atau fitur kategori lainnya dari contoh. Ide saya adalah menambahkan fitur ke fitur input yang jarang dari kantong kata-kata. Namun, ini menghasilkan kinerja yang lebih buruk pada set tes dan pelatihan. Fitur tambahan sendiri memberikan sekitar 80% F-1 pada set tes, sehingga mereka bukan sampah. Memperbesar fitur tidak membantu juga. Pemikiran saya saat ini adalah bahwa fitur semacam ini tidak cocok dengan fitur kata (jarang).

Jadi pertanyaannya adalah: dengan asumsi fitur tambahan memberikan informasi tambahan, apa cara terbaik untuk menggabungkannya? Bisakah melatih pengklasifikasi yang terpisah dan menggabungkannya dalam beberapa jenis pekerjaan ansambel (ini mungkin akan memiliki kelemahan bahwa tidak ada interaksi antara fitur dari pengklasifikasi yang berbeda dapat ditangkap)? Apakah ada model lain yang lebih rumit yang harus saya pertimbangkan?

Elmille
sumber
3
Beberapa pembaruan: Saya dapat mencapai hasil yang dapat diterima dengan l2-menormalkan vektor padat tambahan. Saya salah berasumsi sklearn StandardScaler akan melakukan itu. Saya masih mencari metode yang lebih kompleks, yang memungkinkan saya untuk memodelkan dependensi label atau menggabungkan kepercayaan sub-klasifikasi.
elmille
Saya melakukan percobaan dasar yang sama tahun lalu dan menemukan masalah yang sama persis dengan yang Anda miliki. Bisakah vektor word2vec Anda setelah proses normalisasi l2 mengalahkan BOW? Saya belum melakukan normalisasi l2, tetapi bahkan setelah menguji banyak metode pemrosesan pasca, vektor semantik masih 2-4 persen mutlak di belakang BOW fitur tf / idf Saya bertanya-tanya apakah arah itu buntu. Asli saya dicari adalah untuk menggabungkan vektor semantik padat dengan BOW tradisional dan melihat apakah itu dapat meningkatkan klasifikasi topik / pertunjukan pemodelan. BTW: set data apa yang telah Anda kerjakan, tambang adalah 20newsgroup.
Saya bekerja dengan dataset untuk kompetisi CIKM 2014. Bagi saya, representasi vektor tidak pernah bisa mengalahkan BOW dengan bobot tf-idf. Rencana saya adalah menggunakannya selain untuk meningkatkan kualitas. Dalam pengalaman saya (untuk klasifikasi teks) beberapa bentuk tf-idf + model linier dengan n-gram adalah pendekatan yang sangat kuat. Saat ini saya sedang bereksperimen dengan jaringan saraf convolutional dan bahkan dengan model-model kompleks (kurang lebih) yang mendekati sulit dikalahkan.
elmille
Kepada Mod: Maaf saya tidak memiliki 50 reputasi, jadi saya tidak bisa menulis di area komentar. Hai elmille: Ya, itulah yang saya alami di semua ujian. Namun, apakah Anda menemukan bahwa kata vec + BOW membantu? Dalam pengalaman saya, ketika saya menggabungkan kata vec dengan BOW tf-idf (dalam kasus saya vec ini sebenarnya adalah vektor keseluruhan dalam seluruh artikel, itu bukan kata-vec tetapi sangat mirip), kinerjanya semakin rendah. Saya awalnya berpikir itu harus BOW + vec> BOW> vec. Karena mengandung informasi yang saling membantu. Hasil sebenarnya adalah BOW> vec> BOW + vec. Lalu saya melakukan penskalaan dan normalisasi standar untuk membungkuk dan vec in

Jawaban:

13

Jika saya mengerti dengan benar, Anda pada dasarnya memiliki dua bentuk fitur untuk model Anda. (1) Data teks yang telah Anda wakili sebagai sekumpulan kata yang jarang dan (2) fitur padat yang lebih tradisional. Jika demikian, maka ada 3 pendekatan umum:

  1. Lakukan pengurangan dimensionalitas (seperti LSA via TruncatedSVD) pada data Anda yang jarang untuk membuatnya padat dan menggabungkan fitur menjadi matriks padat tunggal untuk melatih model Anda.
  2. Tambahkan beberapa fitur padat Anda ke matriks sparse Anda menggunakan sesuatu seperti scipy's hstackke dalam matriks sparse tunggal untuk melatih model Anda.
  3. Buat model hanya menggunakan data teks Anda yang jarang dan kemudian gabungkan prediksinya (probabilitas jika klasifikasi) sebagai fitur padat dengan fitur padat lainnya untuk membuat model (yaitu: ensembling via susun). Jika Anda menggunakan rute ini, ingatlah untuk hanya menggunakan prediksi CV sebagai fitur untuk melatih model Anda, jika tidak, Anda mungkin akan mengenakan pakaian yang sangat buruk (Anda dapat membuat kelas yang cukup untuk melakukan ini semua dalam satu Pipelinejika diinginkan).

Ketiga pendekatan itu valid dan memiliki pro dan kontra sendiri. Secara pribadi, saya menemukan (1) biasanya menjadi yang terburuk karena, secara relatif, sangat lambat. Saya juga menemukan (3) biasanya menjadi yang terbaik, karena keduanya cukup cepat dan menghasilkan prediksi yang sangat baik. Anda juga dapat melakukan kombinasi keduanya jika Anda bersedia melakukan ansambel yang lebih luas.

Adapun algoritma yang Anda gunakan, pada dasarnya semuanya bisa masuk dalam kerangka itu. Regresi logistik berkinerja sangat baik hampir sepanjang waktu, tetapi yang lain mungkin lebih baik tergantung pada masalah yang dihadapi dan seberapa baik Anda menyetelnya. Saya sendiri mendukung GBM, tetapi intinya adalah Anda dapat mencoba sebanyak mungkin algoritma yang Anda inginkan dan bahkan melakukan ansambel sederhana dari prediksi mereka hampir selalu mengarah pada solusi keseluruhan yang lebih baik.

David
sumber
10

Model linear hanya menambahkan fitur-fiturnya dikalikan dengan bobot yang sesuai. Jika, misalnya, Anda memiliki 1000 fitur jarang, hanya 3 atau 4 yang aktif di setiap instance (dan yang lainnya nol) dan 20 fitur padat yang semuanya non-nol, maka kemungkinan besar fitur padat akan membuat sebagian besar dari dampaknya sementara fitur yang jarang hanya akan menambah sedikit nilai. Anda dapat memeriksanya dengan melihat bobot fitur untuk beberapa contoh dan bagaimana mereka memengaruhi jumlah yang dihasilkan.

Salah satu cara untuk memperbaikinya adalah menjauh dari model aditif. Berikut adalah beberapa model kandidat.

SVM didasarkan pada pemisahan hyperplanes. Meskipun hyperplane adalah model linier itu sendiri, SVM tidak merangkum parameternya, tetapi mencoba untuk membagi ruang fitur secara optimal. Mengingat banyaknya fitur, saya akan mengatakan bahwa SVM linier harus bekerja dengan baik sementara kernel yang lebih rumit cenderung cocok dengan data.

Terlepas dari namanya, Naive Bayes adalah model statistik yang cukup kuat yang menunjukkan hasil yang baik untuk klasifikasi teks. Ini juga cukup fleksibel untuk menangkap ketidakseimbangan dalam frekuensi fitur yang jarang dan padat, jadi Anda harus mencobanya.

Akhirnya, hutan acak dapat berfungsi sebagai metode ansambel yang baik dalam kasus ini. Pengacakan akan memastikan bahwa berbagai jenis fitur (jarang / padat) akan digunakan sebagai simpul keputusan utama di pohon yang berbeda. RF / decision tree juga baik untuk memeriksa fitur-fitur itu sendiri, jadi sebaiknya perhatikan strukturnya.

Perhatikan bahwa semua metode ini memiliki kelemahan yang dapat mengubahnya menjadi sampah di casing Anda. Menggabungkan fitur yang jarang dan padat bukan tugas yang dipelajari dengan baik, jadi beri tahu kami pendekatan mana yang paling cocok untuk kasus Anda.

teman
sumber
Terima kasih atas jawaban Anda! Saya punya dua pertanyaan lanjutan :) 1) Bagaimana SVM (dengan kernel linear) dan Naive Bayes berbeda karena mereka tidak meringkas fitur-fiturnya dan bobot yang sesuai (yaitu apa yang Anda sebut "model aditif")? Keduanya secara efektif membuat hyperplane pemisah jadi bukankah hasilnya selalu semacam penambahan fitur dikalikan dengan bobot yang sesuai? 2) Saya ingin mencoba hutan secara acak, tetapi sayangnya ruang fitur terlalu besar untuk mewakilinya dalam format padat (Saya menggunakan sklearn). Apakah ada implementasi yang bisa mengatasinya?
Elmille
1) Dalam regresi linier Anda tertarik pada poin pada hyperplane, sehingga Anda menambahkan fitur-fitur tertimbang untuk mendapatkan poin prediksi. Di SVM, di sisi lain, Anda mencari titik di sisi hyperplane. Anda melakukan klasifikasi dengan memeriksa sederhana di sisi mana adalah contoh Anda, tidak ada penjumlahan yang terlibat selama prediksi. Naif Bayes dapat memasukkan berbagai jenis model (misalnya binomial atau multinomial), tetapi pada dasarnya Anda melipatgandakan probabilitas, bukan menambahkannya.
berteman
2) Saya telah melihat beberapa penelitian dalam topik ini, tetapi tidak pernah menemui implementasi (mungkin googling akan memberikan beberapa tautan di sini). Namun, Anda selalu dapat menggunakan cara lain - mengurangi dimensionalitas dengan, katakanlah, PCA dan kemudian jalankan forest acak berdasarkan pada dataset yang dikurangi.
berteman