Seberapa baik skala untuk tugas klasifikasi teks? [Tutup]

30

Saya mencoba untuk meningkatkan kecepatan dengan R. Saya akhirnya ingin menggunakan pustaka R untuk melakukan klasifikasi teks. Saya hanya ingin tahu apa pengalaman orang-orang sehubungan dengan skalabilitas R ketika datang untuk melakukan klasifikasi teks.

Saya cenderung mengalami data dimensi tinggi (~ 300k dimensi). Saya melihat menggunakan SVM dan Random Forest khususnya sebagai algoritma klasifikasi.

Apakah perpustakaan R skala ke ukuran masalah saya?

Terima kasih.

EDIT 1: Hanya untuk memperjelas, kumpulan data saya cenderung memiliki 1000-3000 baris (mungkin sedikit lebih) dan 10 kelas.

EDIT 2: Karena saya sangat baru di R, saya akan meminta poster untuk lebih spesifik jika memungkinkan. Misalnya, jika Anda menyarankan alur kerja / pipa, pastikan untuk menyebutkan pustaka R yang terlibat dalam setiap langkah jika memungkinkan. Beberapa petunjuk tambahan (untuk contoh, kode contoh, dll.) Akan ditambahkan pada kue.

EDIT 3: Pertama, terima kasih semuanya atas komentar Anda. Dan kedua, saya minta maaf, mungkin saya seharusnya memberikan lebih banyak konteks untuk masalah ini. Saya baru mengenal R tetapi tidak terlalu banyak menggunakan klasifikasi teks. Saya sudah melakukan pra-pemrosesan (stemming, stopword removal, konversi tf-idf dll.) Pada beberapa bagian data saya menggunakan paket tm , hanya untuk merasakan sesuatu. Tm sangat lambat bahkan pada sekitar 200dok sehingga saya khawatir tentang skalabilitas. Kemudian saya mulai bermain dengan FSelector dan bahkan itu sangat lambat. Dan itulah titik di mana saya membuat OP saya.

EDIT 4: Baru saja saya sadar bahwa saya memiliki 10 kelas dan sekitar ~ 300 dokumen pelatihan per kelas, dan saya sebenarnya membangun matriks termXdoc dari seluruh rangkaian pelatihan yang menghasilkan dimensi yang sangat tinggi. Tetapi bagaimana dengan mengurangi setiap masalah klasifikasi 1-out-of-k menjadi serangkaian masalah klasifikasi biner? Itu akan secara drastis mengurangi jumlah dokumen pelatihan (dan karenanya dimensi) pada masing-masing langkah k-1, bukan? Jadi, apakah pendekatan ini bagus? Bagaimana cara membandingkannya dalam hal akurasi dengan implementasi multi-kelas yang biasa?

Andy
sumber
1
Dimensi 300k dengan berapa baris? Sayangnya, objek R harus ada di memori (setidaknya kecuali Anda mempertimbangkan tweaker besar, pada dasarnya mengharuskan Anda untuk menulis ulang sendiri algoritma ini). Itu berarti bahwa dengan, katakanlah, 8 pertunjukan ram, saya tidak berpikir Anda dapat menyimpan lebih dari beberapa ratus baris dengan kolom 300k.
crayola
@crayola: Jumlah baris dapat bervariasi dari 1000-3000.
Andy
2
Objek R tidak perlu berada di memori. Pemetaan memori sangat mudah. Dimensi 300k bukan masalah. Saya juga menganggap data Anda jarang, karena ini adalah masalah hampir semua masalah teks.
Iterator
Saya hanya memperhatikan komentar di atas: hanya 1000-3000 baris? Itu sangat kecil. Bisakah Anda menjelaskan apa tubuh Anda? Sekelompok email? Deskripsi paket di CRAN? Anda mungkin memiliki lebih banyak masalah statistik dengan P >> N daripada dengan masalah penyimpanan apa pun.
Iterator
1
@Iterator: Kami memiliki beberapa sumber daya pendidikan (makalah, esai, dll.) Yang ingin kami klasifikasikan.
Andy

Jawaban:

17

Seperti yang diminta dalam komentar, berikut adalah beberapa petunjuk untuk langkah-langkah pemrosesan. Sejumlah alat dapat ditemukan di Tampilan Tugas CRAN untuk Pemrosesan Bahasa Alami . Anda juga mungkin ingin melihat tulisan ini di tm(text mining) paket untuk R .

  1. Sebelum memproses, pertimbangkan normalisasi token kata. openNLP(untuk yang ada paket R) adalah satu rute.
  2. Untuk pemrosesan teks, langkah pra-pemrosesan yang umum adalah menormalkan data melalui tf.idf- frekuensi istilah * frekuensi dokumen terbalik - lihat entri Wikipedia untuk detail lebih lanjut. Ada normalisasi lain yang lebih baru, tetapi ini adalah metode roti dan mentega, jadi penting untuk mengetahuinya. Anda dapat dengan mudah mengimplementasikannya di R: just store (docID, wordID, freq1, freq2) di mana freq1 adalah hitungan berapa kali kata yang diindeks oleh wordID telah muncul dalam dokumen yang diberikan dan freq2 adalah # dokumen yang muncul. Tidak perlu menyimpan vektor ini untuk kata-kata yang tidak muncul dalam dokumen yang diberikan. Kemudian, ambil saja freq1 / freq2 dan Anda memiliki nilai tf.idf Anda.
  3. Setelah menghitung nilai tf.idf, Anda dapat bekerja dengan dimensi penuh data Anda atau memfilter kata-kata yang pada dasarnya tidak informatif. Misalnya, setiap kata yang muncul hanya dalam 1 dokumen tidak akan memberikan banyak wawasan. Ini dapat mengurangi dimensi Anda secara substansial. Mengingat kecilnya jumlah dokumen yang diperiksa, Anda mungkin menemukan bahwa mengurangi menjadi hanya 1K adalah ukuran yang tepat.
  4. Saya tidak akan melakukan perekaman ulang data (misalnya untuk PCA), tetapi Anda dapat menyimpan data sekarang dalam matriks istilah (di mana entri sekarang bernilai tf.idf) dengan mudah, menggunakan matriks jarang, seperti yang didukung oleh Matrixpaket.

Pada titik ini, Anda memiliki dataset yang sudah diproses sebelumnya. Saya akan merekomendasikan untuk melanjutkan dengan alat yang dikutip dalam tampilan tugas CRAN atau paket penambangan teks. Pengelompokan data, misalnya dengan memproyeksikan ke 4 atau 6 komponen utama pertama, bisa sangat menarik bagi grup Anda ketika data diplot.

Satu hal lagi: Anda mungkin menemukan bahwa pengurangan dimensionalitas di sepanjang garis PCA (*) dapat membantu ketika menggunakan berbagai metode klasifikasi, karena Anda pada dasarnya menggabungkan kata-kata yang terkait. Komponen utama 10-50 pertama mungkin semua yang Anda butuhkan untuk klasifikasi dokumen, mengingat ukuran sampel Anda.

(*) Catatan: PCA hanyalah langkah pertama. Ini bisa sangat menarik bagi seseorang yang baru memulai dengan penambangan teks dan PCA, tetapi Anda mungkin akhirnya menemukan bahwa itu sedikit gangguan untuk set data yang jarang. Sebagai langkah pertama, lihatlah, terutama melalui prcompdan princompfungsinya.

Pembaruan: Saya tidak menyatakan preferensi dalam jawaban ini - saya sarankan prcompdaripada princomp.

Iterator
sumber
+1 Jawaban yang bagus; Saya hanya ingin tahu mengapa Anda mengatakan bahwa sejumlah kecil dermaga menyiratkan jumlah variabel penting yang lebih rendah - bukankah itu terlihat sedikit berlebihan?
Saya tidak yakin saya mengerti apa yang Anda maksud. Menjaga mereka overfitting, tentu saja, sehingga variabel-variabel ini akan dihilangkan dalam pengaturan yang masuk akal. Selain itu, kosakata (P) tumbuh dengan # dokumen atau sampel (N), sehingga istilah yang pertama kali muncul tidak menunjukkan banyak. Terus tambahkan dokumen dan kemudian terulangnya suatu istilah lintas dokumen akan menjadi informatif.
Iterator
@ Isator: Terima kasih atas jawaban Anda. Jadi prcompdan / atau princompakankah skala data seperti ini menurut Anda? Saya juga mengedit pertanyaan saya dan menambahkan beberapa informasi tambahan.
Andy
Tidak, ini kemungkinan tidak akan menskala ketika Anda menekan 300 ribu kolom. :) (Hanya untuk menunjukkan: X'X dalam hal ini akan memiliki entri 90B - masalah penyimpanan.) Sebagai gantinya, filter oleh tf.idf terlebih dahulu. Jika hanya ada, katakanlah, 10 kelas yang berbeda, maka kelipatan kecil dari 10 harus memadai untuk dimensi yang lebih besar untuk memisahkan kelas. Jadi, 1000 dimensi seharusnya lebih dari cukup. Kedua metode PCA (btw, saya sarankan prcomp) akan baik-baik saja.
Iterator
Setelah Anda membatasi hingga 1000 dimensi atau mungkin beberapa dimensi (misalnya 2K), dan melakukan PCA, Anda dapat menggunakan proyeksi tersebut untuk mengatakan 100 dimensi (yang mungkin berlebihan, tetapi ada sedikit kerugian dalam hal ini) dan kemudian melakukan klasifikasi. Pada titik ini, tidak ada yang terlalu menarik terjadi.
Iterator
5

Pertama, selamat datang! Pemrosesan teks sangat menyenangkan, dan melakukannya di R semakin mudah setiap saat.

Jawaban singkatnya: ya - alat di R sekarang cukup bagus untuk menangani data seperti ini. Faktanya, tidak ada yang istimewa tentang R, C ++, Groovy, Scala, atau bahasa lain dalam hal penyimpanan data dalam RAM: setiap bahasa menyimpan float ganda 8 byte dalam ... tunggu, tunggu ... tunggu. .. 8 byte!

Algoritma dan implementasinya sangat penting, terutama jika diimplementasikan sangat buruk terkait dengan struktur data dan kompleksitas komputasi. Jika Anda menerapkan algoritma Anda sendiri, berhati-hatilah. Jika menggunakan kode lain, emptor peringatan berlaku, seperti halnya di lingkungan mana pun.

Untuk R, Anda perlu mempertimbangkan:

  1. Representasi data Anda (lihat matriks jarang, terutama dalam Matrixpaket)
  2. Penyimpanan data (mungkin memori dipetakan, menggunakan bigmemoryatau ff; atau didistribusikan, menggunakan Hadoop)
  3. Partisi data Anda (berapa banyak yang bisa Anda muat dalam RAM tergantung pada berapa banyak RAM yang Anda miliki)

Poin terakhir benar-benar di bawah kendali Anda.

Ketika datang ke dimensi ini, itu tidak terlalu besar lagi. # Pengamatan akan lebih berdampak, tetapi Anda dapat mempartisi data Anda untuk menyesuaikan penggunaan RAM, jadi tidak terlalu banyak yang perlu dikhawatirkan.

Iterator
sumber
3

Saya setuju dengan crayola bahwa jumlah baris sangat penting di sini. Untuk RF Anda akan membutuhkan setidaknya 3x lebih banyak RAM daripada bobot dataset Anda dan mungkin banyak waktu (jumlah atribut seperti itu biasanya membutuhkan banyak pohon di hutan - dan perhatikan bahwa tidak ada implementasi paralel RF dalam R).

Tentang SVM, saya ragu itu adalah ide yang baik untuk bertarung dengan dimensi 300k sementara Anda mungkin dapat mengembangkan fungsi kernel yang akan setara dengan deskriptor teks Anda.

EDIT: 3k x 30k (nyata) matriks akan menempati sesuatu seperti 7Gb, jadi yang perlu Anda lakukan RF (menggunakan randomForest) pada data ini adalah komputer dengan RAM 16GB, keberuntungan dan sedikit waktu atau hanya komputer dengan 24GB RAM dan waktu yang cukup lama.


sumber
Yah saya pasti akan melakukan pemilihan fitur (chi kuadrat, berbasis entropi) tapi sekali lagi saya tidak bisa menemukan perpustakaan R yang akan skala untuk tugas ini juga. Mempertimbangkan semua ini, apakah benar mengatakan bahwa mungkin saya harus mulai mencari solusi non-R?
Andy
1
msgstr "catat bahwa tidak ada implementasi paralel dari RF dalam R". Itu hanya sebagian benar, karena foreachpaket itu cocok dengan randomForestpaket. Saya pikir ada satu contoh seperti itu dalam sketsa untuk foreach. (Atau mungkin doMC.)
crayola
@Andy Masalahnya adalah, singkatnya menulis ulang algoritma dalam bahasa pemrograman tingkat rendah, saya tidak yakin perangkat lunak apa yang dapat menerapkan algoritma ini ke data Anda. Jika saya berada dalam situasi Anda, saya kira saya akan tetap berpegang pada R dan menulis ulang bagian-bagian randomForestsedemikian rupa sehingga akan meminta kolom yang dipilih secara acak dari, misalnya, database SQL pada setiap iterasi (sehingga seluruh dimensi 300k tidak akan pernah memiliki berada di ram). Tapi itu mungkin terutama karena saya tahu lebih banyak tentang R daripada tentang opsi lain yang mungkin.
crayola
Apa yang Anda maksudkan dengan mengklaim bahwa Anda tidak dapat menemukan perpustakaan yang dapat menskalakan untuk itu? Filter seperti ini adalah aljabar dasar yang seharusnya berfungsi tanpa masalah (asalkan Anda memiliki cukup RAM).
@crayola Benar, tetapi bagian penggabungannya mengerikan. Lagipula itu bukan paralelisme yang dibagi, jadi mungkin akan menyakitkan (jika bukan tidak mungkin) dalam situasi ini.