Büyük ölçekli metin sınıflandırması


18

Metin verilerim üzerinde sınıflandırma yapmak istiyorum. 300 classesSınıf başına 200 eğitim dokümanım var 60000 documents in totalve bu muhtemelen çok yüksek boyutlu verilerle sonuçlanacaktır ( 1 milyondan fazla boyutu inceliyor olabiliriz ).

Boru hattında aşağıdaki adımları gerçekleştirmek istiyorum (sadece gereksinimlerimin ne olduğu hakkında bir fikir vermek için):

  1. Her belgeyi özellik vektörüne ( tf-idfveya vector space model) dönüştürme
  2. Feature selection( Mutual Informationtercihen veya diğer standart olanları temel alır)
  3. Sınıflandırıcı Eğitim ( SVM, Naive Bayes, Logistic Regressionveya Random Forest)
  4. Eğitimsiz sınıflandırıcı modeline göre görünmeyen verileri tahmin etme.

Buradaki soru, bu tür yüksek boyutlu verileri işlemek için hangi araçları / çerçeveyi kullanacağım? Her zamanki şüphelilerin farkındayım (R, WEKA ...) ama bilgim ilerledikçe (yanlış olabilirim) muhtemelen hiçbiri bu kadar büyük veriyi işleyemez. Raf aletinden bakabileceğim başka bir şey var mı?

Paralellemem gerekirse Apache Mahir'e mi bakmalıyım ? Görünüşe göre tam istediğim işlevselliği sağlayamayabilir.

Şimdiden teşekkürler.


Güncelleme: Bu web sitesine , posta listesine ve genel olarak internete baktım . Bana öyle geliyor ki benim durumumda aşağıdaki sorunlar ortaya çıkabilir:

(1) Verilerimin R ( özellikle tm paketi ) kullanılarak ön işleme tabi tutulması pratik olmayabilir , çünkü tmyasaklayıcı derecede yavaş olacaktır.

(2) Paketler arasında birlikte çalışabilirlik bir sorun haline gelebilir ve bir formattan diğerine veri dönüştürmede ek bir yüke neden olabilirim. . Örneğin, ön tmişlemimi (veya WEKA gibi harici bir aracı) kullanarak yaparsam, bu verileri R'deki HPC kitaplıklarının okuyabileceği bir forma dönüştürmenin bir yolunu bulmam gerekir. Ve yine, sınıflandırma paketlerinin HPC kütüphaneleri tarafından sağlanan verileri doğrudan alıp alamayacağı net değil.

Ben doğru yolda mıyım? Ve daha da önemlisi, mantıklı mıyım?


R, bundan daha büyük veri setlerini işleyebilir, sadece mevcut araçları iyi kullanmanız gerekir. Herhangi bir büyük dilde veya ortamda neler yapılabileceği arasında bir fark yoktur, ancak Weka ve Mahout mevcut olanlara göre gecikmektedir. FWIW, bu oldukça küçük bir örneklem büyüklüğü ve 1M boyutları biggie değil, aynı zamanda istatistiksel olarak aşırı dolduruyor. Önerilerim, yeni başlayanlar için hem ücretsiz hem de kolay oldukları için R veya Python. Matlab ücretsiz değil, aynı zamanda iyi. Ayrıca çok fazla bilgisayar kullandığınızda büyük bir vergi alır.
Iterator

1
Çok daha dikkat çekici bir nokta, sınıf başına örneklerden daha fazla sınıfa sahip olmanız ve onu çok yüksek boyutlu bir alana yerleştirmenizdir. Burada çok iyi bir sınıf ayrımı yapacağınızdan emin değilim. Sınıflarınız için bazı yapısal ilişkileriniz var mı? Eğer öyleyse, bu yöntemlerden bazıları bu anlayış olmadan kötü bir şekilde ücretlendirilebilir.
Iterator

1
foreachR'de kütüphane yazma paralel kodunu kullanabilirsiniz. Bu özellikle doğası gereği paralelleştirilmesi kolay olan rasgele ormanlarla birlikte iyi çalışır.
Zach

2
Birkaç soru: 1) Bahsettiğiniz tüm farklı öğrenme yaklaşımlarını karşılaştırmak mı istiyorsunuz, yoksa sadece bir işi yapmak için mi ihtiyacınız var? 2) Her belge 1, 1 veya daha fazla veya 0 veya daha fazla sınıfa ait mi? 3) Özellik seçimini bir nedenden dolayı kullanmak istiyor musunuz yoksa sadece gerekli olduğunu mu düşünüyorsunuz? Diğer yorumlara, bunun bugünün standartlarına göre mütevazı boyutta bir sorun olduğunu kabul ediyorum ve boyutsallığın azaltılması gerekli değil.
DavidDLewis

1
Yaklaşık 10.000 konu içeren metin sınıflandırması üzerinde çalışıyorum (örneğin, sınıflar veya kategoriler veya tercih ettiğiniz herhangi bir terim). Şu anda bu metin sınıflandırma sistemini bu ölçekte ayarlamaya çalışıyorum. Kendi tekniklerimi tescilli oldukları için paylaşamam, ancak bir tavsiyem var: zaten kanıtlanmış olmadıkça, önerilen bazı tekniklerin ölçeklendiğini varsayarak çok dikkatli olun. Benim tecrübelerime göre, çok az şey var.

Yanıtlar:


13

Bu, verilerin scipy.sparse.csr_matrixPython'daki örnek gibi seyrek bir veri yapısı olarak temsil edildiği sürece çalışmasını sağlamak için mümkün olmalıdır . Metin verileri üzerinde çalışmak için bir eğitim yazdım . Ayrıca, karma numaradan yararlanarak bellek kullanımını daha da azaltmak mümkündür: veya HashingVectorizeryerine . Bu, dokümantasyon bölümünde metin özellikleri çıkarma bölümünde açıklanmaktadır .CountingVectorizerTfidfVectorizer

Rasgele Ormanlar genel olarak doğrusal modellerden (doğrusal destek vektör makineleri ve lojistik regresyon gibi) ve multinomial veya Bernoulli naif Bayes'ten ve daha basit modellerden daha iyi tahmin doğruluğu getirmeyen çoğu metin sınıflandırma probleminden çok daha pahalıdır.

Scikit-learn probleminize ölçeklenemezse, Vowpal Wabbit , bahsettiğiniz tüm modelleri uygulamadığı halde yapacaktır (ve muhtemelen sklearn'den daha hızlı).

Nisan 2015'te scikit-learn kütüphanesinin mevcut durumunu yansıtacak ve bozuk bağlantıları düzeltecek şekilde düzenlendi.


Herhangi bir "standart dışı" boyut küçültme tekniği kullanma sorunu, çalışmanızı yayınlamaya çalıştığınızda büyük olasılıkla sorun yaşayacak olmasıdır. En azından metin sınıflandırma alanında, gözden geçirenlerin yaygın olarak kullanılan teknikleri görmeyi sevdiklerini biliyorum (mevcut sınıflandırma teknikleriyle de karşılaştırmayı kolaylaştırır).
user721975

Endişelenmeyin - @ogrisel, henüz öğreticilerini henüz okumamış olsam da, en azından son teknoloji metin sınıflandırmasına ait olduğu için standart olmayan bir şeyden bahsetmedi.
Iterator

+1 Bence Python muhtemelen keyifli bir yol. Metin madenciliği için R'de çok yeni bazı paketler var, ancak eğer istatistiksel uzmanlık ve ilgi alanlarından daha fazla hesaplama varsa, Python benim tavsiyem olacaktır.
Yineleyici

@ogrisel: Sizin ve başkalarının sklearn'e katkısı için Kudos. Python'da çalışan birçok kişiye tavsiye ettim - tüm tasarım örnek.
Iterator

"Standart olmayan" boyut küçültme (rasgele projeksiyonlar kullanarak) ve özellik sağlama konusunda John Langford ve metaoptimize konusundaki bu tartışmayı kontrol edin .
ogrisel


1

Kendi kornamı devirmek değil, ama Rapidminer ile metin analizi konusunda oldukça popüler bir video serisi yaptım. Burada görebilirsiniz:

http://vancouverdata.blogspot.com/2010/11/text-analytics-with-rapidminer-loading.html

Özellik seçimi yapmaktan kaçınabilirsiniz, sadece bellekte milyon * milyon matris oluşturmayan bir sınıflandırıcı kullanın :)

Lojistik regresyon birçok boyutu boğacaktır. Naive Bayes bağımsız boyutlar alır, bu yüzden iyi olacaksınız. SVM boyutların sayısına bağlı değildir (ancak destek vektörlerinin sayısına bağlıdır), bu yüzden de iyi olacaktır.

300 olsa da bir çok ders. Sadece birkaçı ile başlayıp yukarı çıkarım.


Büyük işaretçi ve tavsiye. Teşekkürler. Ne demek istediğini "sadece birkaçıyla başla ve yoluna devam et" diyebilir misin?
user721975

300 sınıf yerine ("keman, viyola, viyolonsel, trompet ..." gibi), bunları "string, brass" gibi daha küçük bir sayıya yeniden sınıflandırabilirsiniz.
Neil McGuigan

Tamam, şimdi anladım.
user721975

1

İlk olarak, yorumlarınıza dayanarak, bunu 300 ikili (evet / hayır) sınıflandırma problemleri olarak ele alırım. Kullanımı kolay birçok açık kaynak ikili sınıflandırıcı öğrenen vardır ve bu, bellek için zaman ticareti yapmanızı sağlar.

SVM'ler ve lojistik regresyon muhtemelen metin sınıflandırması için en popüler yaklaşımlardır. Her ikisi de kolayca 1000000 boyutları işleyebilir, çünkü modern uygulamalar seyrek veri yapıları kullanır ve aşırı sığmayı önleyen düzenlileştirme ayarlarını içerir.

WEKA ve KNIME dahil olmak üzere birçok açık kaynaklı makine öğrenme paketi hem SVM'leri hem de lojistik regresyonu içerir. SVM'lerin bağımsız uygulamaları arasında libSVM ve SVMlight bulunmaktadır . Lojistik regresyon için BXRtrain ve BXRclassify'ı takacağım için Madigan, Genkin ve diğerleri ile geliştirdiğim takacağım. BXRclassify, binlerce lojistik regresyon modelinin bir bellek içi dizinini oluşturabilir ve bunları aynı anda uygulayabilir.

Metni vektör formuna dönüştürmeye gelince, bir şekilde her zaman bunu sıfırdan yapmak için küçük bir Perl yazıyorum. :-) Ancak, bahsettiğim makine öğrenme süitlerinin tokenizasyon ve vektörizasyon kodunu içerdiğini düşünüyorum. Başka bir rota, LingPipe gibi doğal bir dil araç setiyle daha fazla gitmek olabilir, ancak bu sizin için aşırı olabilir.


+1 İyi yorumlar. 300 evet / hayır sınıflaması yapacak olsaydım, bir sınıf için negatif eğitim verilerini nasıl seçerdim? Olumlu veriler açıkça sınıfa ait belgelerdir.
user721975

Başka bir yorum. SVM / Lojistik reg milyonlarca boyutu işleyebilir, ancak bu sınıflandırıcılar için parametreler seçmek için denemeleri nasıl yapabilirim? Örneğin, küçük bir veri setinde parametrelere karar vermek için 10 kat çapraz doğrulamayı çalıştırabilirsiniz, ancak algoritma makul bir sürede çalışmayı bitirmek için böyle büyük veriler için hangi yaklaşım gerekir?
user721975

@ user721975: Belirli bir ayrımcılık için, pozitif belgeler üzerinde X etiketi bulunanlardır ve negatif belgeler de belgelerin geri kalan kısmıdır.
DavidDLewis

@ user721975: Algoritmalar ve uygulamalar arasında ayrıntılar çok değiştiğinden, çalışma süresi hakkında genel tavsiyeler vermek zordur. 10 kat çapraz doğrulama, veri kümeniz için pratik olmayabilir: 60000 örnek önemli değildir.
DavidDLewis

1
Dengesiz eğitim setleri mutlaka bir sorun değildir. Ama aslında kafam karıştığım bir şey olduğunu anlıyorum: belgeler 0, 1 veya birkaç sınıfa ait olabileceğinden, sınıf başına 200 eğitim belgesi almakla ne demek istiyorsun? 0 sınıf veya 2+ sınıf içeren belgeleri kaldırmak için bir şey yaptınız mı? Genel olarak, bu 60000 belge setini nasıl oluşturdunuz?
DavidDLewis

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.