2012-04-30 20 views
7

chi-square (scikit-learn 0.10) kullanarak en iyi özellikleri seçmeye çalışıyorum. İlk olarak 227 özniteliği çıkardığım toplam 80 eğitim belgesinden ve bu 227 özellikten ilk 10'u seçmek istiyorum.1 scikit öğrenmek: En İyi Özellikler (k) istenilen miktarı seçilmemiş

my_vectorizer = CountVectorizer(analyzer=MyAnalyzer())  
X_train = my_vectorizer.fit_transform(train_data) 
X_test = my_vectorizer.transform(test_data) 
Y_train = np.array(train_labels) 
Y_test = np.array(test_labels) 
X_train = np.clip(X_train.toarray(), 0, 1) 
X_test = np.clip(X_test.toarray(), 0, 1)  
ch2 = SelectKBest(chi2, k=10) 
print X_train.shape 
X_train = ch2.fit_transform(X_train, Y_train) 
print X_train.shape 

Sonuçlar aşağıdaki gibidir. Ben 100 eşit k ayarlarsanız

(80, 227) 
(80, 14) 

Birbirlerine benzerler.

(80, 227) 
(80, 227) 

Bu neden oluyor?

* DÜZENLEME: Tam çıkış örneği, şimdi 30 talep ve bunun yerine 32 nereden kırpmadan: Ben 10 talep ve bunun yerine 11 nereden,

Train instances: 9 Test instances: 1 
Feature extraction... 
X_train: 
[[0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] 
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] 
[0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0] 
[0 0 1 0 1 1 0 1 1 0 0 0 1 0 1 0 0 0 0 1 1 1 0 0 1 0 0 1 0 0 0 0] 
[0 0 2 1 0 0 0 0 0 1 0 0 0 1 1 0 0 0 1 0 0 0 0 1 0 1 1 0 0 1 0 1] 
[1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0] 
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] 
[1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 1 0] 
[0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0]] 
Y_train: 
[0 0 0 0 0 0 0 0 1] 
32 features extracted from 9 training documents. 
Feature selection... 
(9, 32) 
(9, 32) 
Using 32(requested:30) best features from 9 training documents 
get support: 
[ True True True True True True True True True True True True 
    True True True True True True True True True True True True 
    True True True True True True True True] 
get support with vocabulary : 
[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 
25 26 27 28 29 30 31] 
Training... 
/usr/local/lib/python2.6/dist-packages/scikit_learn-0.10-py2.6-linux-x86_64.egg/sklearn/svm/sparse/base.py:23: FutureWarning: SVM: scale_C will be True by default in scikit-learn 0.11 
    scale_C) 
Classifying... 

Başka bir örnek kırpmadan:

Train instances: 9 Test instances: 1 
Feature extraction... 
X_train: 
[[0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] 
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] 
[0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0] 
[0 0 1 0 1 1 0 1 1 0 0 0 1 0 1 0 0 0 0 1 1 1 0 0 1 0 0 1 0 0 0 0] 
[0 0 2 1 0 0 0 0 0 1 0 0 0 1 1 0 0 0 1 0 0 0 0 1 0 1 1 0 0 1 0 1] 
[1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0] 
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] 
[1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 1 0] 
[0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0]] 
Y_train: 
[0 0 0 0 0 0 0 0 1] 
32 features extracted from 9 training documents. 
Feature selection... 
(9, 32) 
(9, 11) 
Using 11(requested:10) best features from 9 training documents 
get support: 
[ True True True False False True False False False False True False 
False False True False False False True False True False True True 
False False False False True False False False] 
get support with vocabulary : 
[ 0 1 2 5 10 14 18 20 22 23 28] 
Training... 
/usr/local/lib/python2.6/dist-packages/scikit_learn-0.10-py2.6-linux-x86_64.egg/sklearn/svm/sparse/base.py:23: FutureWarning: SVM: scale_C will be True by default in scikit-learn 0.11 
    scale_C) 
Classifying... 

cevap

5

get_support() işlevinden ne döndüğünü kontrol ettiniz mi (ch2 bu üye işlevine sahip olmalıdır)? Bu, en iyi k arasında seçilen endeksleri döndürür.

Benim varsayımım, yaptığınız veri kırpma nedeniyle (veya yinelenen özellik vektörleri nedeniyle, özellik vektörlerinizin kategorik olması ve yinelenmesi muhtemeldir) nedeniyle bağların bulunması ve scikits işlevinin tümünün üst k noktaları için bağlanan girişler. k = 100'u ayarladığınız ek örnek, bu varsayım üzerinde bir miktar şüphe düşürür, ancak bir göz atmaya değer.

özellik örtüşme bir çok kırpma sonuçları, ki^2 p-değeri bağlarını oluşturmak eğer bakın neler get_support() döner ve X_train olan göstergeler üzerinde nasıl göründüğünü kontrol edin bakın SelectKBest kullandığını sırada yer alıyor.

Eğer durum böyle gözüküyorsa, scikits.learn ile bir hata/sorun dosyalamalısınız, çünkü şu anda dokümanları, SelectKBest'un bağlantı durumunda ne yapacağını söylemiyor. Açıkçası, sadece bağlı dizinlerden bazılarını alamaz ve başkalarını yapamaz, ancak kullanıcılar en azından, bağlantıların beklenmedik özellik boyutunun azaltılmasıyla sonuçlanabileceği konusunda uyarılmalıdır.

+0

Cevabınız için teşekkür ederiz. Kırpmayı kaldırmayı denedim ancak beklendiği gibi çalışmıyor ... Sorgumu tam bir çıktıyla (get_support dahil) düzenledim, lütfen bir bakabilir misiniz? –

+0

Kravat kopması gerçekten sorun. Diğer geliştiricilerle bunun kodda mı yoksa dokümanlarda mı değiştirileceğini tartışacağım. –

+2

https://github.com/scikit-learn/scikit-learn/issues/805 –