Python 预测“作为估计器的概率函数或决策函数”;“信心”;
我使用LogisticReturnal作为模型来训练scikit learn中的估计员。我使用的特性(大部分)是分类的;标签也是如此。因此,我分别使用DictVectorizer和LabelEncoder对值进行正确编码 培训部分相当简单,但我在测试部分遇到了问题。简单的方法是使用训练模型的“预测”方法,并获得预测标签。但是,对于以后需要进行的处理,我需要每个特定实例的每个可能标签(类)的概率。我决定使用“预测概率”方法。然而,对于同一个测试实例,我得到了不同的结果,无论是在实例单独运行时还是在其他实例同时运行时,我都使用了这种方法 接下来,是重现问题的代码Python 预测“作为估计器的概率函数或决策函数”;“信心”;,python,machine-learning,scikit-learn,Python,Machine Learning,Scikit Learn,我使用LogisticReturnal作为模型来训练scikit learn中的估计员。我使用的特性(大部分)是分类的;标签也是如此。因此,我分别使用DictVectorizer和LabelEncoder对值进行正确编码 培训部分相当简单,但我在测试部分遇到了问题。简单的方法是使用训练模型的“预测”方法,并获得预测标签。但是,对于以后需要进行的处理,我需要每个特定实例的每个可能标签(类)的概率。我决定使用“预测概率”方法。然而,对于同一个测试实例,我得到了不同的结果,无论是在实例单独运行时还是在
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”并添加了一个实例(与“X_test2”中的最后一个实例相同),但所有实例的概率值都会发生变化。为什么会发生这种情况?
另外,我发现“X_test1”的所有概率都是1真的很奇怪,所有概率的总和不应该是1吗
现在,如果不是使用“预测概率”,而是使用“决策函数”,我将获得所需的值的一致性。问题是我得到的是负系数,甚至有些正系数大于1
那么,我应该用什么呢?为什么“预测概率”的值会发生这样的变化?我是否没有正确理解这些价值观的含义
提前谢谢你能给我的任何帮助
更新
正如建议的那样,我更改了代码,以便还打印编码的“X_test1”、“X_test2”和“X_test3”以及它们的形状。这似乎不是问题,因为测试集之间相同实例的编码是一致的 如问题评论所示,该错误是由我正在使用的scikit learn版本的实现中的错误引起的。问题已解决,更新到最新的稳定版本0.12.1,快速浏览,您的观察结果似乎都是正确的。我也不明白发生了什么。您能同时给出每个电话的编码数据吗?那它的形状呢?这是在
master
中,我想它从来没有进入过任何版本@费勒瓦姆,你用的是哪个版本的scikit learn?@larsmans我用的是0.13。我刚才下载的。我应该把它更新到哪个版本吗?@feralvam:目前还没有0.13版本,所以您使用的是GitHub存储库的旧快照。我建议您要么使用0.12.1,要么使用新的快照,如果您真的需要最新的功能/想要贡献代码的话。@larsmans太棒了!谢谢