2012-11-09 2 views
10

J'utilise LogisticRegression comme modèle pour former un estimateur dans scikit-learn. Les fonctionnalités que j'utilise sont (pour la plupart) catégoriques; et ainsi sont les étiquettes. Par conséquent, j'utilise un DictVectorizer et un LabelEncoder, respectivement, pour encoder les valeurs correctement.predict_proba ou decision_function comme estimateur "confidence"

La partie formation est assez simple, mais j'ai des problèmes avec la partie test. La chose simple à faire est d'utiliser la méthode "prédire" du modèle entraîné et obtenir l'étiquette prédite. Cependant, pour le traitement que je dois faire par la suite, j'ai besoin de la probabilité pour chaque étiquette possible (classe) pour chaque instance particulière. J'ai décidé d'utiliser la méthode "predict_proba". Cependant, j'obtiens des résultats différents pour la même instance de test, que j'utilise cette méthode lorsque l'instance est seule ou accompagnée par d'autres.

Ensuite, est un code qui reproduit le problème.

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) 

Voici le résultat obtenu:

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

Comme on le voit, les valeurs obtenues avec « predict_proba » pour l'instance dans le changement « X_test1 » quand cette même instance est avec d'autres dans X_test2. En outre, "X_test3" reproduit simplement le "X_test2" et ajoute une instance de plus (qui est égale à la dernière dans "X_test2"), mais les valeurs de probabilité pour tous les changements. Pourquoi cela arrive-t-il? En outre, je trouve vraiment étrange que toutes les probabilités pour "X_test1" sont 1, la somme de tous ne devrait-elle pas être 1?

Maintenant, si au lieu d'utiliser "predict_proba" j'utilise "decision_function", j'obtiens la cohérence dans les valeurs obtenues dont j'ai besoin. Le problème est que j'obtiens des coefficients négatifs, et même certains des positifs sont supérieurs à 1.

Alors, que dois-je utiliser? Pourquoi les valeurs de "predict_proba" changent-elles de cette façon? Est-ce que je ne comprends pas bien ce que ces valeurs signifient?

Merci d'avance pour toute aide que vous pourriez me donner. Comme suggéré

MISE À JOUR

, j'ai changé le code afin d'imprimer aussi codé « X_test1 », « X_test2 » et « X_test3 », ainsi que leurs formes. Cela ne semble pas être le problème, car le codage est cohérent pour les mêmes instances entre les ensembles de test.

+0

D'un coup d'œil, il semble que toutes vos observations soient correctes. Je ne comprends pas ce qui se passe non plus. Pourriez-vous s'il vous plaît également donner les données codées pour chaque appel? Et c'est la forme? –

+0

@AndreasMueller Fait! – feralvam

+1

C'était [un bug] (https://github.com/scikit-learn/scikit-learn/commit/fa93e209ff667da4b31bf5c7137ba45072b1a5e3) dans 'master' que je pense ne jamais avoir eu dans une version. @feralvam, quelle version de scikit-learn utilisez-vous? –

Répondre

6

Comme indiqué sur les commentaires de la question, l'erreur a été causée par un bug dans l'implémentation de la version de scikit-learn que j'utilisais. Le problème a été résolu de mettre à jour vers la version stable la plus récente. 0.12.1

Questions connexes