2012-11-09 8 views
10

私は、scikit-learnで推定値を訓練するモデルとしてLogisticRegressionを使用しています。私が使用している機能は(主に)カテゴリです。ラベルも同様です。したがって、DictVectorizerとLabelEncoderをそれぞれ使用して、値を適切にエンコードします。predict_probaまたはdecision_functionを推定値 "confidence"として使用

トレーニングパートはかなり簡単ですが、テストパートに問題があります。簡単なことは、訓練されたモデルの「予測」メソッドを使用して予測ラベルを取得することです。しかし、私が後でやる必要がある処理のためには、それぞれの特定のインスタンスごとに可能なラベル(クラス)ごとに確率が必要です。私は "predict_proba"メソッドを使うことに決めました。しかし、インスタンスが単独であるか他のインスタンスを伴う場合に、このメソッドを使用するかどうかにかかわらず、同じテストインスタンスに対して異なる結果が得られます。

次に、問題を再現するコードです。続い

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) 

が得られた出力である:

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

同じインスタンスがX_test2で他の人となるときの値が「X_test1」変化、例えば「predict_proba」で得られた、見ることができるように。また、「X_test3」は「X_test2」を再現し、もう1つのインスタンス(「X_test2」の最後のインスタンスに等しい)を追加しますが、すべての確率値が変更されます。なぜこれが起こるのですか? また、「X_test1」のすべての確率が1であり、すべての合計が1であるべきではないということは本当に奇妙です。

"predict_proba"を使用する代わりに "decision_function"を使用すると、必要な取得値に一貫性が得られます。問題は、負の係数を得ることであり、陽性のものもいくつか1より大きい。

だから私は何を使うべきですか?なぜ "predict_proba"の値がそのように変わるのですか?これらの値が意味することを正しく理解していないのですか?

私に与えることのできる助けを前もってありがとう。示唆したように

UPDATE

、私はまた、符号化された「X_test1」、「X_test2」および「X_test3」を印刷するようにコードを変更し、並びにその形状。エンコーディングはテストセット間の同じインスタンスに対して一貫しているため、これは問題には見えません。

+0

あなたの観測値がすべて正しいように見えます。どちらが起こっているのか分かりません。あなたはまた、各呼び出しのエンコードされたデータを教えてください。それは形ですか? –

+0

@AndreasMueller完了! – feralvam

+1

これは 'master 'の[バグ](https://github.com/scikit-learn/scikit-learn/commit/fa93e209ff667da4b31bf5c7137ba45072b1a5e3)でした。 @feralvam、あなたはscikit-learnのバージョンを使用していますか? –

答えて

6

質問のコメントに示されているように、私が使用していたscikit-learnのバージョンの実装のバグによってエラーが発生しました。この問題は、最新の安定版に更新されました。0.12.1

関連する問題