2012-11-09 13 views
10

Ben scikit-learn bir tahmincisi eğitmek için model olarak LogisticRegression kullanıyorum. Kullandığım özellikler (çoğunlukla) kategorik; ve bu yüzden etiketler. Bu nedenle, değerleri doğru şekilde kodlamak için bir DictVectorizer ve LabelEncoder kullanıyorum.predict_proba veya determ_function tahmincisi olarak "güven"

Eğitim kısmı oldukça basittir, ancak test bölümünde sorun yaşıyorum. Yapılması gereken en basit şey eğitimli modelin "tahmin" yöntemini kullanmak ve öngörülen etiketi almaktır. Ancak, daha sonra yapmak zorunda olduğum işleme için, her özel örnek için olası her etiketin (sınıf) olasılığına ihtiyacım var. "Predict_proba" yöntemini kullanmaya karar verdim. Bununla birlikte, aynı test örneği için, kendi başına veya başkaları tarafından eşlik edildiğinde bu yöntemi kullanıp kullanmamam için farklı sonuçlar elde ediyorum.

Sonraki, sorunu yeniden üreten bir koddur.

from sklearn.linear_model import LogisticRegression 
from sklearn.feature_extraction import DictVectorizer 
from sklearn.preprocessing import LabelEncoder 


X_real = [{'head': u'n\xe3o', 'dep_rel': u'ADVL'}, 
      {'head': u'v\xe3o', 'dep_rel': u'ACC'}, 
      {'head': u'empresa', 'dep_rel': u'SUBJ'}, 
      {'head': u'era', 'dep_rel': u'ACC'}, 
      {'head': u't\xeam', 'dep_rel': u'ACC'}, 
      {'head': u'import\xe2ncia', 'dep_rel': u'PIV'}, 
      {'head': u'balan\xe7o', 'dep_rel': u'SUBJ'}, 
      {'head': u'ocupam', 'dep_rel': u'ACC'}, 
      {'head': u'acesso', 'dep_rel': u'PRED'}, 
      {'head': u'elas', 'dep_rel': u'SUBJ'}, 
      {'head': u'assinaram', 'dep_rel': u'ACC'}, 
      {'head': u'agredido', 'dep_rel': u'SUBJ'}, 
      {'head': u'pol\xedcia', 'dep_rel': u'ADVL'}, 
      {'head': u'se', 'dep_rel': u'ACC'}] 
y_real = [u'AM-NEG', u'A1', u'A0', u'A1', u'A1', u'A1', u'A0', u'A1', u'AM-ADV', u'A0', u'A1', u'A0', u'A2', u'A1'] 

feat_encoder = DictVectorizer() 
feat_encoder.fit(X_real) 

label_encoder = LabelEncoder() 
label_encoder.fit(y_real) 

model = LogisticRegression() 
model.fit(feat_encoder.transform(X_real), label_encoder.transform(y_real)) 

print "Test 1..." 
X_test1 = [{'head': u'governo', 'dep_rel': u'SUBJ'}] 
X_test1_encoded = feat_encoder.transform(X_test1) 
print "Features Encoded" 
print X_test1_encoded 
print "Shape" 
print X_test1_encoded.shape 
print "decision_function:" 
print model.decision_function(X_test1_encoded) 
print "predict_proba:" 
print model.predict_proba(X_test1_encoded) 

print "Test 2..." 
X_test2 = [{'head': u'governo', 'dep_rel': u'SUBJ'}, 
      {'head': u'atrav\xe9s', 'dep_rel': u'ADVL'}, 
      {'head': u'configuram', 'dep_rel': u'ACC'}] 

X_test2_encoded = feat_encoder.transform(X_test2) 
print "Features Encoded" 
print X_test2_encoded 
print "Shape" 
print X_test2_encoded.shape 
print "decision_function:" 
print model.decision_function(X_test2_encoded) 
print "predict_proba:" 
print model.predict_proba(X_test2_encoded) 


print "Test 3..." 
X_test3 = [{'head': u'governo', 'dep_rel': u'SUBJ'}, 
      {'head': u'atrav\xe9s', 'dep_rel': u'ADVL'}, 
      {'head': u'configuram', 'dep_rel': u'ACC'}, 
      {'head': u'configuram', 'dep_rel': u'ACC'},] 

X_test3_encoded = feat_encoder.transform(X_test3) 
print "Features Encoded" 
print X_test3_encoded 
print "Shape" 
print X_test3_encoded.shape 
print "decision_function:" 
print model.decision_function(X_test3_encoded) 
print "predict_proba:" 
print model.predict_proba(X_test3_encoded) 

aşağıdakı

elde çıktısı:

zamanda görülebilir

Test 1... 
Features Encoded 
    (0, 4) 1.0 
Shape 
(1, 19) 
decision_function: 
[[ 0.55372615 -1.02949707 -1.75474347 -1.73324726 -1.75474347]] 
predict_proba: 
[[ 1. 1. 1. 1. 1.]] 
Test 2... 
Features Encoded 
    (0, 4) 1.0 
    (1, 1) 1.0 
    (2, 0) 1.0 
Shape 
(3, 19) 
decision_function: 
[[ 0.55372615 -1.02949707 -1.75474347 -1.73324726 -1.75474347] 
[-1.07370197 -0.69103629 -0.89306092 -1.51402163 -0.89306092] 
[-1.55921001 1.11775556 -1.92080112 -1.90133404 -1.92080112]] 
predict_proba: 
[[ 0.59710757 0.19486904 0.26065002 0.32612646 0.26065002] 
[ 0.23950111 0.24715931 0.51348452 0.3916478 0.51348452] 
[ 0.16339132 0.55797165 0.22586546 0.28222574 0.22586546]] 
Test 3... 
Features Encoded 
    (0, 4) 1.0 
    (1, 1) 1.0 
    (2, 0) 1.0 
    (3, 0) 1.0 
Shape 
(4, 19) 
decision_function: 
[[ 0.55372615 -1.02949707 -1.75474347 -1.73324726 -1.75474347] 
[-1.07370197 -0.69103629 -0.89306092 -1.51402163 -0.89306092] 
[-1.55921001 1.11775556 -1.92080112 -1.90133404 -1.92080112] 
[-1.55921001 1.11775556 -1.92080112 -1.90133404 -1.92080112]] 
predict_proba: 
[[ 0.5132474 0.12507868 0.21262531 0.25434403 0.21262531] 
[ 0.20586462 0.15864173 0.4188751 0.30544372 0.4188751 ] 
[ 0.14044399 0.3581398 0.1842498 0.22010613 0.1842498 ] 
[ 0.14044399 0.3581398 0.1842498 0.22010613 0.1842498 ]] 
, aynı örnek X_test2 başkalarıyla olduğunda "X_test1" değişim, örneğin "predict_proba" ile elde edilen değerler. Ayrıca, "X_test3" sadece "X_test2" yi yeniden üretir ve bir tane daha örnek ekler ("X_test2" deki sonuncuya eşittir), ancak bunların tümü için olasılık değerleri değişir. Bu neden oluyor? Ayrıca, "X_test1" için TÜM olasılıkların 1, hepsi toplamı 1 olmamalıdır, gerçekten garip buluyorum?

Şimdi, "predict_proba" yı kullanmak yerine "decision_function" kullanırsam, ihtiyacım olan değerlerin tutarlılığını elde ederim. Sorun şu ki negatif katsayılarım ve hatta pozitif olanlardan bazıları bile 1'den büyüktür.

Peki, ne kullanmalıyım? Neden "predict_proba" değerleri bu şekilde değişir? Bu değerlerin ne anlama geldiğini doğru anlayamıyorum?

Bana verebileceğiniz herhangi bir yardım için şimdiden teşekkür ederiz. Ayrıca kodlanmış "X_test1", "X_test2" ve "X_test3", hem de onların şekillerini yazdırmak üzere

GÜNCELLEME önerildiği gibi

, kodu değişti. Bu, kodlama test setleri arasındaki aynı örnekler için tutarlı olduğundan, sorun görünmüyor.

+0

ile güncelleştirildi. Hızlı bir bakışla, tüm gözlemleriniz doğru görünüyor. Ne olduğunu anlamıyorum da. Her arama için şifrelenmiş verileri de verir misiniz? Ve şekli mi? –

+0

@AndreasMueller Bitti! – feralvam

+1

Bu, "master" in [bir hata] (https://github.com/scikit-learn/scikit-learn/commit/fa93e209ff667da4b31bf5c7137ba45072b1a5e3) olduğunu hiç bir sürüme geçmediğini düşünüyorum. @feralvam, hangi scikit-learn sürümünü kullanıyorsunuz? –

cevap

6

Sorunun yorumları üzerinde belirtildiği gibi, uygulamada kullandığım scikit-learn sürümünde hata oluştu. Sorun, en son kararlı sürüm olan 0.12.1

İlgili konular