Saya ingin melakukan klasifikasi pada data teks saya. Saya punya 300 classes
, 200 dokumen pelatihan per kelas (jadi 60000 documents in total
) dan ini cenderung menghasilkan data dimensi yang sangat tinggi (kita mungkin melihat lebih dari 1 juta dimensi ).
Saya ingin melakukan langkah-langkah berikut dalam pipa (hanya untuk memberi tahu Anda apa persyaratan saya):
- Mengubah setiap dokumen menjadi vektor fitur (
tf-idf
atauvector space model
) Feature selection
(Mutual Information
lebih disukai, atau yang standar lainnya)- Pelatihan classifier (
SVM
,Naive Bayes
,Logistic Regression
atauRandom Forest
) - Memprediksi data yang tidak terlihat berdasarkan model classifier yang dilatih.
Jadi pertanyaannya adalah alat / kerangka kerja apa yang saya gunakan untuk menangani data dimensi tinggi seperti itu? Saya mengetahui para tersangka biasa (R, WEKA ...) tetapi sejauh pengetahuan saya (saya mungkin salah) mungkin tidak ada dari mereka yang dapat menangani data sebesar ini. Apakah ada alat rak lain yang bisa saya lihat?
Jika saya harus memparalelkannya, haruskah saya melihat Apache Mahout ? Sepertinya itu mungkin belum cukup memberikan fungsionalitas yang saya butuhkan.
Terima kasih untuk semuanya.
Pembaruan: Saya melihat-lihat situs web ini , mailing list R dan internet secara umum. Tampak bagi saya bahwa masalah berikut dapat muncul dalam situasi saya:
(1) Memproses ulang data saya menggunakan R ( khususnya paket tm ) bisa jadi tidak praktis , karena tm
akan sangat lambat.
(2) Karena saya akan perlu menggunakan ansambel paket R (pra-pemrosesan, matriks jarang, pengklasifikasi, dll.) Interoperabilitas antara paket dapat menjadi masalah, dan saya dapat mengeluarkan biaya tambahan dalam mengonversi data dari satu format ke format lainnya. . Misalnya, jika saya melakukan pra-pemrosesan menggunakan tm
(atau alat eksternal seperti WEKA) saya perlu mencari cara untuk mengubah data ini menjadi bentuk yang bisa dibaca oleh perpustakaan HPC di R. Dan lagi tidak jelas bagi saya apakah paket classifier akan langsung mengambil data seperti yang disediakan oleh perpustakaan HPC.
Apakah saya di jalur yang benar? Dan yang lebih penting, apakah saya masuk akal?
sumber
foreach
perpustakaan menulis kode paralel dalam R. Ini bekerja sangat baik bersama dengan hutan acak, yang secara inheren mudah diparalelkan.Jawaban:
Ini harus dimungkinkan untuk membuatnya berfungsi selama data direpresentasikan sebagai struktur data yang jarang seperti
scipy.sparse.csr_matrix
misalnya dalam Python. Saya menulis tutorial untuk mengerjakan data teks . Lebih lanjut dimungkinkan untuk mengurangi penggunaan memori lebih lanjut dengan memanfaatkan trik hashing: sesuaikan untuk menggunakanHashingVectorizer
alih - alihCountingVectorizer
atauTfidfVectorizer
. Ini dijelaskan dalam ekstraksi fitur teks bagian dokumentasi .Hutan Acak pada umumnya jauh lebih mahal daripada model linier (seperti mesin vektor dukungan linier dan regresi logistik) dan multinomial atau Bernoulli naive Bayes dan untuk sebagian besar masalah klasifikasi teks yang tidak membawa akurasi prediksi yang jauh lebih baik daripada model yang lebih sederhana.
Jika scikit-learning akhirnya tidak dapat mengukur masalah Anda, Vowpal Wabbit akan melakukan (dan mungkin lebih cepat dari sklearn) meskipun tidak menerapkan semua model yang Anda bicarakan.
Diedit pada bulan April 2015 untuk mencerminkan keadaan perpustakaan scikit-learn saat ini dan untuk memperbaiki tautan yang rusak.
sumber
Gensim untuk Python adalah sihir. Dan karena menggunakan Python, Anda dapat menggunakannya bersamaan dengan saran @ ogrisel.
sumber
Bukan untuk membunyikan klakson saya sendiri, tetapi saya membuat seri video yang cukup populer tentang analisis teks dengan Rapidminer. Anda bisa melihatnya di sini:
http://vancouverdata.blogspot.com/2010/11/text-analytics-with-rapidminer-loading.html
Anda mungkin dapat menghindari melakukan pemilihan fitur, cukup gunakan classifier yang tidak membuat jutaan * juta matriks dalam memori :)
Regresi logistik akan mencekik banyak dimensi itu. Naif Bayes mengasumsikan dimensi independen, sehingga Anda akan baik-baik saja. SVM tidak tergantung pada jumlah dimensi (tetapi pada jumlah vektor dukungan) sehingga akan baik-baik saja.
300 adalah banyak kelas. Saya akan mulai dengan hanya sedikit dan terus maju.
sumber
Pertama, berdasarkan komentar Anda, saya akan memperlakukan ini sebagai 300 masalah klasifikasi biner (ya / tidak). Ada banyak pelajar classifier biner open source yang mudah digunakan, dan ini memungkinkan Anda berdagang waktu untuk memori.
SVM dan regresi logistik mungkin merupakan pendekatan yang paling populer untuk klasifikasi teks. Keduanya dapat dengan mudah menangani dimensi 1000000, karena implementasi modern menggunakan struktur data yang jarang, dan termasuk pengaturan regularisasi yang menghindari overfitting.
Beberapa suite pembelajaran mesin sumber terbuka, termasuk WEKA dan KNIME , termasuk SVM dan regresi logistik. Implementasi mandiri dari SVM termasuk libSVM dan SVMlight . Untuk regresi logistik, saya akan pasang BXRtrain dan BXRclassify , yang saya kembangkan bersama Madigan, Genkin, dan lainnya. BXRclassify dapat membangun indeks dalam memori dari ribuan model regresi logistik dan menerapkannya secara bersamaan.
Sedangkan untuk mengkonversi teks ke bentuk vektor atribut, saya entah bagaimana selalu akhirnya menulis Perl sedikit untuk melakukan itu dari awal. :-) Tapi saya pikir suite pembelajaran mesin yang saya sebutkan termasuk kode tokenization dan vektorisasi. Rute lain adalah menggunakan lebih banyak toolkit bahasa alami seperti LingPipe , meskipun itu mungkin terlalu berat untuk Anda.
sumber
Sejak Sklearn 0.13 memang ada implementasi dari HashingVectorizer .
EDIT: Ini adalah contoh lengkap aplikasi semacam itu dari sklearn docs
Pada dasarnya, contoh ini menunjukkan bahwa Anda dapat mengklasifikasikan teks pada data yang tidak dapat ditampung dalam memori utama komputer (melainkan pada disk / jaringan / ...).
sumber