12

scikit-learnで推定量をトレーニングするためのモデルとしてLogisticRegressionを使用しています。私が使用する機能は(ほとんど)カテゴリです。ラベルもそうです。したがって、値を適切にエンコードするために、それぞれDictVectorizerとLabelEncoderを使用します。

トレーニング部分はかなり簡単ですが、テスト部分に問題があります。簡単なことは、トレーニングされたモデルの「予測」メソッドを使用して、予測されたラベルを取得することです。ただし、後で実行する必要のある処理では、特定のインスタンスごとに可能なラベル(クラス)ごとの確率が必要です。「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_test1」のインスタンスに対して「predict_proba」で取得された値は、同じインスタンスがX_test2の他のインスタンスと一緒にある場合に変化します。また、「X_test3」は「X_test2」を再現し、もう1つのインスタンス(「X_test2」の最後と同じ)を追加しますが、すべての確率値が変更されます。なぜこれが起こるのですか?また、「X_test1」のすべての確率が1であるのは本当に奇妙だと思いますが、すべての合計を1にするべきではありませんか?

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

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

あなたが私に与えることができるどんな助けにも前もって感謝します。

アップデート

提案されたように、エンコードされた「X_test1」、「X_test2」、「X_test3」、およびそれらの形状も出力するようにコードを変更しました。エンコーディングはテストセット間の同じインスタンスに対して一貫しているため、これは問題ではないようです。

4

1 に答える 1

8

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

于 2012-11-09T16:49:57.950 に答える