Я использую LogisticRegression в качестве модели для обучения оценщика в scikit-learn. Функции, которые я использую (в основном) категориальны; а также ярлыки. Поэтому я использую 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 ]]
Как видно, значения, полученные с помощью параметра "preview_proba" для экземпляра в "X_test1" , изменяются, когда тот же самый экземпляр с другими в X_test2. Кроме того, "X_test3" просто воспроизводит "X_test2" и добавляет еще один экземпляр (который равен последнему в "X_test2" ), но значения вероятности для всех из них изменяются. Почему это происходит? Кроме того, мне кажется странным, что ВСЕ вероятности для "X_test1" равны 1, не должны быть суммой всех 1?
Теперь, если вместо использования "pred_proba" я использую "decision_function", я получаю согласованность в полученных значениях, которые мне нужны. Проблема в том, что я получаю отрицательные коэффициенты, и даже некоторые из положительных значений больше 1.
Итак, что я должен использовать? Почему значения "predict_proba" меняются таким образом? Я не правильно понимаю, что означают эти значения?
Заранее спасибо за любую помощь, которую вы могли бы мне дать.
UPDATE
Как и было предложено, я изменил код, чтобы также печатать закодированные "X_test1" , "X_test2" и "X_test3", а также их формы. Это, как представляется, не проблема, поскольку кодировка является согласованной для тех же экземпляров между наборами тестов.