2012-11-09 4 views
10

Ich verwende LogisticRegression als Modell, um einen Schätzer in scikit-learn zu trainieren. Die Funktionen, die ich verwende, sind (meistens) kategorisch; und so sind die Etiketten. Daher verwende ich einen DictVectorizer und einen LabelEncoder, um die Werte ordnungsgemäß zu codieren.predict_proba oder decision_function als Schätzer "confidence"

Der Trainingsteil ist ziemlich einfach, aber ich habe Probleme mit dem Testteil. Die einfache Sache ist, die "Vorhersage" -Methode des trainierten Modells zu verwenden und die vorhergesagte Markierung zu erhalten. Für die Verarbeitung, die ich danach machen muss, brauche ich jedoch die Wahrscheinlichkeit für jede mögliche Bezeichnung (Klasse) für jede bestimmte Instanz. Ich entschied mich für die Methode "predict_proba". Ich erhalte jedoch unterschiedliche Ergebnisse für die gleiche Testinstanz, unabhängig davon, ob ich diese Methode verwende, wenn die Instanz für sich allein steht oder von anderen begleitet wird.

Als nächstes ist ein Code, der das Problem reproduziert.

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) 

Folgende ist die Ausgabe, die erhalten:

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 ]] 

Wie zu sehen ist, werden die mit „predict_proba“ erhaltenen Werte für die Instanz in „X_test1“ ändern sich, wenn die gleiche Instanz mit anderen in X_test2 ist. Außerdem gibt "X_test3" nur den "X_test2" wieder und fügt eine weitere Instanz hinzu (die gleich der letzten in "X_test2" ist), aber die Wahrscheinlichkeitswerte für alle von ihnen ändern sich. Warum passiert das? Auch finde ich es wirklich seltsam, dass alle Wahrscheinlichkeiten für "X_test1" 1 sind, sollte nicht die Summe aller 1 sein?

Nun, wenn ich anstelle von "Predicate_proba" verwende ich "Decision_function", bekomme ich die Konsistenz in den Werten, die ich brauche. Das Problem ist, dass ich negative Koeffizienten bekomme, und sogar einige der positiven sind größer als 1.

Also, was soll ich verwenden? Warum ändern sich die Werte von "predict_proba" so? Versteh ich nicht richtig, was diese Werte bedeuten?

Vielen Dank im Voraus für jede Hilfe, die Sie mir geben konnten.

UPDATE

Wie vorgeschlagen, änderte ich den Code so wie auch die codierten "X_test1" drucken zu "X_test2" und "X_test3", sowie die Formen. Dies scheint nicht das Problem zu sein, da die Codierung für die gleichen Instanzen zwischen den Testgruppen konsistent ist.

+0

Aus einem kurzen Blick sieht es so aus, als wären alle Ihre Beobachtungen korrekt. Ich verstehe auch nicht, was passiert. Könnten Sie bitte auch die verschlüsselten Daten für jeden Anruf angeben? Und es ist Form? –

+0

@AndreasMueller Fertig! – feralvam

+1

Dies war [ein Fehler] (https://github.com/scikit-learn/scikit-learn/commit/fa93e209ff667da4b31bf5c7137ba45072b1a5e3) in 'master', von dem ich denke, dass er in keiner Version enthalten war. @feralvam, welche Version von scikit-learn benutzt du? –

Antwort

6

Wie in den Kommentaren der Frage angegeben, wurde der Fehler durch einen Fehler in der Implementierung der von mir verwendeten scikit-learn-Version verursacht. Das Problem wurde gelöst, indem auf die neueste stabile Version aktualisiert wurde.

Verwandte Themen