2016-01-02 8 views
5

SVM ile çok-sınıflı sınıflandırma yapmaya çalışıyorum. Yaklaşık 8k özelliğim var ve yaklaşık 400'lük bir uzunluğa sahip y vektörüne sahibim. Zaten ikili Y vektörleri var, bu yüzden MultiLabelBinarizer()'u kullanmadım ama Y veriimin ham formunu kullandığımda hala aynı şeyi veriyor.Scikit-Learn: Etiket değil x tüm eğitim örneklerinde bulunur

Bu kodu çalıştırıyorum: Bu öngörü kısmına geldiğinde bütün uydurma işleminden sonra

X = np.genfromtxt('data_X', delimiter=";") 
Y = np.genfromtxt('data_y', delimiter=";") 
training_X = X[:2600,:] 
training_y = Y[:2600,:] 

test_sample = X[2600:2601,:] 
test_result = Y[2600:2601,:] 

classif = OneVsRestClassifier(SVC(kernel='rbf')) 
classif.fit(training_X, training_y) 
print(classif.predict(test_sample)) 
print(test_result) 

, bu Label not x is present in all training examples (x 400 benim y vektör uzunluğu aralığında birkaç farklı sayılar olduğunu) söylüyor . Bundan sonra, her zaman sıfır vektörü olan ve uzunluğu 400 (y vektör uzunluğu) olan y vektörünü verir. Ben scikit-öğrenmede ve ayrıca makine öğreniminde yeniyim. Buradaki problemi çözemedim. Sorun nedir ve düzeltmek için ne yapmalıyım? Teşekkürler.

cevap

10

Burada 2 sorun vardır: sınıflarınızın bazı eğitim verilerinden eksik olduğunu

1) tahminler

uyarı için tüm 0'lar alıyorsanız)
2 uyarı eksik etiket anlamına gelir. Bu yaygın bir sorundur. Eğer 400 sınıfınız varsa, bunların bir kısmı sadece çok nadir olarak yapılmalı ve verilerin herhangi bir bölümünde, bazı sınıflar bölünmenin bir tarafından eksik olabilir. Ayrıca verilerinizde hiç bulunmayan sınıflar da olabilir. Y.sum(axis=0).all()'u deneyebilir ve bu yanlışsa, Y'de bile bazı sınıflar oluşmaz. Bu, tüm sesler korkunçtur, ancak gerçekçi olarak, 0, 1 veya çok küçük olan sınıfları doğru şekilde tahmin edemezsiniz. Her neyse, bu yüzden onlar için 0 tahmin etmek muhtemelen yapabileceğiniz en iyisidir.

Tüm 0 tahminlerine gelince, 400 dersi ile, muhtemelen tüm derslerinizin zamanın yarısından daha az olduğunu göstereceğim. En yüksek etiket frekansını almak için Y.mean(axis=0).max()'u kontrol edebilirsiniz. 400 dersi ile, sadece birkaç yüzde olabilir. Eğer öyleyse, her sınıf için 0-1 tahmin yapmak zorunda olan bir ikili sınıflandırıcı muhtemelen tüm örneklerde tüm sınıflar için 0 seçecektir. Bu gerçekten bir hata değil, çünkü tüm sınıf frekansları düşük.

Her örneğin pozitif bir etiketin (en az bir tane) olduğunu biliyorsanız, karar değerlerini (clf.decision_function) alabilir ve her örnek için en yüksek olanı seçebilirsiniz. Bunu yapmak için biraz kod yazman gerekecek.

Kaggle yarışmasında bir zamanlar buna benzeyen ilk 10 maçı bitirdim. Bu, hiçbiri% 10'luk bir frekansla hiç meydana gelmeyen ~ 200 sınıflı çok-yanlı bir problemdi ve biz de 0-1 tahminlerine ihtiyacımız vardı. Bu durumda karar değerlerini aldım ve en yüksek olanı aldım, artı eşiğin üstünde olan her şeyi aldım. Bir bekletme setinde en iyi çalıştıran eşiği seçtim. Bu girdinin kodu Github: Kaggle Greek Media code üzerindedir. Bir göz atabilirsin.

Eğer bu kadar ileri gittiyseniz, okuma için teşekkürler. Umarım yardımcı olur.

+1

Merhaba, çok yararlı şeyler içeren bir cevap için teşekkürler. Y.sum (axis = 0) .all() 'ı denedim ve doğru döndü. Ayrıca, Y.mean (axis = 0) .max() 'ı denedim ve' 0.315981070258' döndürdü. Hala bir "clf.decision_function" uygulamalı mıyım? Bu konuda daha spesifik olabilir misiniz, nasıl uygulanmalı? Üzgünüm, bu konularda çok yeniyim, bu yüzden 'karar_fonksiyonu' ile ne yapılacağını anlayamadım. – malisit

+1

Tüm sıfır tahminleri alıyorsanız ve orada 1'lerin olması gerektiğini biliyorsunuz, bunun yerine karar değerleri almayı deneyebilir ve her bir eşiğin üstünde olduğunda 1'i tahmin edebilirsiniz.Öngörülen etiketleriniz şöyle olurdu: '(decision_value> eşik) .astype (float)'. Eşik değeri 0'dan küçük olacaktır, çünkü 0, sınıflandırıcının kullandığı eşiktir ve hiç pozitif olmaz. Alternatif olarak, örnek başına en az bir pozitif etiket olduğunu biliyorsanız, en yüksek DV'ye sahip olan etiketi seçebilirsiniz (yine de negatif olacaktır). – Dthal

+0

Teşekkürler! GitHub'da sağladığınız sezgi ve kod gerçekten yardımcı oldu. – malisit