R, metin sınıflandırma görevlerine ne kadar iyi ölçeklenir? [kapalı]


30

R ile hız kazanmaya çalışıyorum. Sonunda metin sınıflandırma yapmak için R kütüphanelerini kullanmak istiyorum. Metin sınıflandırma söz konusu olduğunda, insanların R'nin ölçeklenebilirliği ile ilgili deneyimlerinin neler olduğunu merak ediyordum.

Büyük boyutlu verilerle karşılaşmam muhtemel (~ 300k boyutları). Özellikle sınıflandırma algoritmaları olarak SVM ve Random Forest kullanmaya bakıyorum.

R kütüphaneleri sorun büyüklüğüme ölçeklenir mi?

Teşekkürler.

EDIT 1: Açıklığa kavuşturmak için, veri setimin 1000-3000 satır (belki biraz daha fazla) ve 10 sınıfa sahip olması muhtemel.

2 EDIT: R için çok yeni olduğum için, posterlerin mümkün olduğunda daha spesifik olmasını isteyeceğim. Örneğin, bir iş akışı / boru hattı öneriyorsanız, lütfen mümkünse her adımda yer alan R kitaplıklarından bahsettiğinizden emin olun. Bazı ek işaretçiler (örnekler, örnek kodlar vb.) Kek üzerine krema yapar.

EDIT 3: Öncelikle, yorumlarınız için herkese teşekkürler. İkincisi, özür dilerim, belki de sorun için daha fazla bağlam vermeliydim. R'ye yeniyim, ancak metin sınıflandırması için fazla değil. Verilerimin bir kısmını tm paketini kullanarak , sadece bir şeyler hissetmek için ön işleme (stemming, stopword kaldırma, tf-idf dönüştürme vb.) Yaptım . Tm yaklaşık 200doc'da bile yavaştı, ölçeklenebilirlik konusunda endişelendim. Sonra FSelector ile oynamaya başladım ve hatta bu gerçekten yavaştı. İşte bu benim OP'mi yaptığım nokta.

DÜZENLEME 4: Yeni ortaya çıktı, sınıf başına 10 sınıf ve yaklaşık ~ 300 eğitim belgesine sahibim ve aslında Xdoc matrisi terimini tüm eğitim setinin dışına çıkarıp çok yüksek bir boyutluluğa neden oluyor. Ancak, her biri bir arada sınıflandırma problemini bir dizi ikili sınıflandırma problemine indirgemeye ne dersiniz? Bu, K-1 adımlarının her birindeki eğitim belgelerinin sayısını (ve dolayısıyla boyutsallığı) büyük ölçüde azaltacaktır, değil mi? Öyleyse bu yaklaşım iyi mi? Normal çok sınıflı uygulama ile doğruluk açısından nasıl karşılaştırılır?


1
Kaç satır ile 300k boyutları? Ne yazık ki, R nesneleri bellekte olmalıdır (en azından büyük ayarlamalar yapmayı düşünmüyorsanız, temel olarak bu algoritmaları kendiniz yeniden yazmanızı gerektirir). Bu, demek ki, 8 gb ram ile, 300k sütunla birkaç yüzden fazla sıra saklayabileceğinizi sanmıyorum.
crayola

@crayola: Satır sayısı 1000-3000 arasında değişebilir.
Andy,

2
R nesneleri yok bellekte olması gerekir. Hafıza haritalaması çok kolaydır. 300k boyutları sorun değil. Ayrıca, neredeyse tüm metin problemlerinde olduğu gibi verilerinizin seyrek olduğunu varsayıyorum.
İteratör

Sadece yukarıdaki yorumu fark ettim: sadece 1000-3000 sıra? Bu çok küçük. Cesedinin ne olduğunu açıklayabilir misin? Toplu e-posta mı? CRAN'daki paketlerin açıklamaları? P >> N ile herhangi bir depolama sorunundan daha fazla istatistiksel sorun yaşayabilirsiniz.
İteratör

1
@Iterator: Sınıflandırmak istediğimiz bazı eğitim kaynaklarımız (dönem ödevleri, makaleler vb.) Var.
Andy,

Yanıtlar:


17

Bir yorumda istendiği gibi, işlem adımları için bazı öneriler aşağıdadır. Doğal Dil İşleme için CRAN Task View'ta çeşitli araçlar bulunabilir . Ayrıca, bu makaleye tmR'nin (metin madenciliği) paketinde bakmak isteyebilirsiniz .

  1. İşlemden önce, belirteçlerin normalleştirilmesini düşünün. openNLP(bunun için bir R paketi var) bir yol.
  2. Metin işleme için, ortak bir ön işleme adımı, verileri tf.idf- terim sıklığı * ters belge sıklığı yoluyla normalleştirmek - daha fazla ayrıntı için Wikipedia girişine bakın. Daha yeni normalleşmeler var, ancak bu bir ekmek ve tereyağı yöntemi, bu yüzden bunu bilmek önemlidir. Kolayca R: 'e koyabilirsiniz (sadece docID, wordID, freq1, freq2); burada freq1, wordID ile indekslenen kelimenin verilen belgede göründüğü sayıdır ve freq2, içinde bulunduğu belgelerin sayısıdır. Belirli bir belgede görünmeyen kelimeler için bu vektörü saklamanıza gerek yok. Ardından, sadece freq1 / freq2 değerini alın ve tf.idf değerine sahip olursunuz.
  3. Tf.idf değerlerini hesapladıktan sonra, verilerinizin tam boyutuyla çalışabilir veya esasen bilgilerle ilgili olmayan sözleri filtreleyebilirsiniz. Örneğin, sadece 1 belgede görünen herhangi bir kelime çok fazla fikir vermeyecektir. Bu, boyutluluğunuzu önemli ölçüde azaltabilir. İncelenen küçük belge sayısı göz önüne alındığında, yalnızca 1 K boyutuna indirmenin uygun olduğunu görebilirsiniz.
  4. Verileri yeniden girmeyeceğim (örneğin PCA için), ancak verileri Matrixpaketin desteklediği gibi seyrek matrisleri kullanarak kolaylıkla bir terim matrisinde (girişlerin şimdi tf.idf değerleri olduğu) saklayabilirsiniz .

Bu noktada, önceden işlenmiş bir veri kümeniz var. CRAN görev görünümünde veya metin madenciliği paketinde belirtilen araçlarla ilerlemenizi tavsiye ederim. Verilerin kümelenmesi, örneğin ilk 4 veya 6 temel bileşene yansıtılması, veriler çizildiğinde grubunuz için çok ilginç olabilir.

Başka bir şey: PCA (*) çizgileri boyunca boyutsallığın azaltılmasının, ilgili kelimeleri birleştirdiğiniz için, çeşitli sınıflandırma yöntemlerini kullanırken yardımcı olabileceğini görebilirsiniz. İlk 10-50 ana bileşen, örneklem büyüklüğünüz göz önüne alındığında, belge sınıflandırması için ihtiyacınız olan her şey olabilir.

(*) Not: PCA sadece ilk adımdır. Metin madenciliği ve PCA ile yeni başlayan biri için çok ilginç olabilir, ancak sonunda bunun seyrek veri kümeleri için biraz sıkıntı olduğunu görebilirsiniz. İlk adım olarak, özellikle prcompve princompişlevleri aracılığıyla buna bir göz atın .

Güncelleme: Bu cevapta bir tercih belirtmedim - prcompyerine tavsiye ederim princomp.


+1 Güzel cevap; Sadece merak ediyorum neden az sayıda iskele sayısının daha az önemli değişkene işaret ettiğini söylüyorsunuz - bu biraz fazla uygun görünmüyor mu?

Ne demek istediğini anladığımdan emin değilim. Onları korumak için, kesinlikle, bu nedenle, bu değişkenler, herhangi bir makul düzenlemede ortadan kalkacaktır. Dahası, kelime hazinesi (P), # belge veya örnek (N) ile büyür, bu nedenle bir terim ilk kez göründüğünde pek bir şey ifade etmez. Dokümanlar eklemeye devam edin ve dokümanlar arasında bir terimin tekrarı bilgilendirici olacaktır.
Yineleyici

@Iterator: Cevabınız için teşekkürler. Öyleyse prcompve / veya princomptahmin ettiğiniz bu tür verilere ölçeklendirilecek misiniz? Ayrıca sorumu yeni düzenledim ve ek bilgiler ekledim.
Andy,

Hayır, bu 300K sütunlara bastığınızda muhtemelen ölçeklenmez. :) (Sadece belirtmek gerekirse: X'X bu durumda 90B girişe sahip olacak - bir depolama sorunu.) Bunun yerine, önce tf.idf'ye göre filtre uygulayın. Eğer sadece 10 farklı sınıf varsa, o zaman sınıfları ayırmak için daha büyük bir boyutsallık için 10'dan küçük bir kat yeterli olmalıdır. Bu nedenle, 1000 boyut fazlasıyla yeterli olmalıdır. Her iki PCA yöntemi (btw, tavsiye ederim prcomp) iyi olacak.
Yineleyici

Bir kez 1000 boyutu veya belki birkaç tane daha (örneğin 2K) sınırladığınızda ve PCA'yı yaptığınızda, projeksiyonları 100 boyutta söyleyebilirsiniz (abartılı olabilir, ancak buna çok az zarar verir) ve ardından sınıflandırma yapın. Bu noktada, çok fazla heyecan verici bir şey olmuyor.
Yineleyici

5

İlk olarak, hoşgeldin! Metin işleme oldukça eğlencelidir ve R'de yapmak her zaman daha kolay hale gelir.

Kısa cevap: evet - R'deki araçlar artık bu tür verilerle ilgilenmek için oldukça iyi durumda. Aslında, R, C ++, Groovy, Scala veya RAM'de veri depolaması söz konusu olduğunda başka bir dilde özel bir şey yok: her dilde 8 bayt çift float var ... bekle ... bekle. .. 8 bayt!

Algoritmalar ve bunların uygulanması, özellikle veri yapıları ve hesaplama karmaşıklığı açısından çok zayıf bir şekilde uygulandığında önemlidir. Kendi algoritmalarınızı uyguluyorsanız, sadece dikkat edin. Başka bir kod kullanılıyorsa, uyarıcı emptor, herhangi bir ortamda olduğu gibi uygulanır.

R için aşağıdakileri göz önünde bulundurmanız gerekir:

  1. Veri gösteriminiz (özellikle Matrixpakette bulunan seyrek matrislere bakınız )
  2. Veri depolama ( Hadoop kullanarak belki haritalanmış, kullanarak bigmemoryveya ff; veya dağıtılmış)
  3. Veri bölümlemeniz (RAM’e ne kadar sığacağınıza bağlı olarak ne kadar RAM’iniz olduğuna bağlı)

Son nokta gerçekten senin kontrolün altında.

Bu boyutluluğa gelince, artık özellikle büyük değil. Gözlem sayısı daha fazla bir etki yaratacaktır, ancak RAM kullanımına uyum sağlamak için verilerinizi bölümlendirebilirsiniz, bu yüzden endişelenmeniz gereken bir şey yoktur.


3

Crayola ile satır sayısının burada çok önemli olduğu konusunda hemfikirim. RF için veri kümenizin ağırlığından en az 3 kat daha fazla RAM'e ve muhtemelen çok fazla zamana ihtiyacınız olacaktır (bu tür nitelikler genellikle ormanda çok fazla ağaç gerektirir - ve R'de paralel RF uygulaması yoktur).

SVM hakkında, 300k boyutlarıyla mücadele etmenin iyi bir fikir olduğunu düşünürken, muhtemelen metin tanımlayıcılarınıza eşdeğer bir çekirdek işlevi geliştirebilirsiniz.

EDIT: 3k x 30k (gerçek) matris 7Gb gibi bir şey işgal eder, bu nedenle bu veride RF (randomForest kullanarak) yapmanız gereken tek şey 16GB RAM, biraz şans ve biraz zaman veya sadece 24GB olan bir bilgisayardır. RAM ve biraz zaman.


Ben de kesinlikle özellik seçimi yapacaktım (ki kare, entropi tabanlı) fakat yine bu görev için ölçeklendirilecek herhangi bir R kütüphanesi bulamadım. Tüm bunları dikkate alarak, belki de R olmayan çözümlere bakmaya başlamalıyım diye söylemek doğru mu?
Andy

1
msgstr "R'de RF'nin paralel bir uygulaması olmadığını not edin". Bu, foreachpaket ile iyi bir şekilde oynadığı için, sadece kısmen doğrudur randomForest. Skeçte bunun gibi bir örnek olduğunu düşünüyorum foreach. (Ya da belki doMC.)
crayola

@Andy: Algoritmaları düşük seviyeli bir programlama dilinde yeniden yazmak yerine, hangi algoritmaları bu algoritmaları verilerinize uygulayabileceğinden emin değilim. Sizin durumunuzda olsaydım, sanırım R 'ye sadık kalacağım ve bazı kısımları randomForest, her yinelemede (300k boyutunun tümünün sahip olamayacağı şekilde) bir SQL veritabanından rastgele seçilen sütunları sorgulayacak şekilde yeniden yazardım. koç olmak için). Ancak bu muhtemelen temel olarak R hakkında diğer olası seçeneklerden daha fazla şey bildiğim için.
crayola

Tam olarak, bunun için ölçeklendirilecek bir kütüphane bulamadığınızı iddia ederek ne demek istiyorsunuz? Bunun gibi filtreler problemsiz çalışmaları gereken temel cebirdir (yeterli RAM'iniz varsa).

@crayola Doğru, ancak birleştirme kısmı berbat. Üstelik paylaşılan-hafıza paralellik değildir, bu nedenle bu ortamda muhtemelen acı verici olacaktır (eğer mümkün değilse).
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.