使用sample_weight参数时,sklearn LogisticRegressiondict_proba()给出错误的预测
作者:互联网
我正在尝试SciKit学习.我以为我会尝试加权Logistic回归,但是在使用sample_weight参数初始化它时,我从sklearn的LogisticRegression对象中得到了毫无意义的预测.
这是一个演示问题的玩具示例.我建立了一个非常简单的数据集,具有一个功能和一个二进制目标输出.
feat target weight
A 0 1
A 0 1
A 1 1
A 1 1
B 0 1
B 0 1
B 0 1
B 1 W
因此,任何明智的逻辑回归都应预测,当feat = A时,成功的概率为0.5.当feat = B时的概率取决于权重W:
>如果W = 1,那么看起来成功的机会为0.25
>如果W = 3,则这将平衡三个0,看起来成功的机会为0.5
>如果W = 9,那么现在实际上有9个1和3个0,因此成功的机会为0.75.
R中的加权逻辑回归给出正确的预测:
test <- function(final_weight) {
feat <- c('A','A','A','A','B','B','B','B')
target <- c(0, 0, 1, 1, 0, 0, 0, 1)
weight <- c(1, 1, 1, 1, 1, 1, 1, final_weight)
df = data.frame(feat, target, weight)
m = glm(target ~ feat, data=df, family='binomial', weights=weight)
predict(m, type='response')
}
test(1)
# 1 2 3 4 5 6 7 8
#0.50 0.50 0.50 0.50 0.25 0.25 0.25 0.25
test(3)
# 1 2 3 4 5 6 7 8
#0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5
test(9)
# 1 2 3 4 5 6 7 8
#0.50 0.50 0.50 0.50 0.75 0.75 0.75 0.75
大.但是,在SciKit Learn中,使用LogisticRegression对象,当使用W = 9时,我会不断收到毫无意义的预测.这是我的Python代码:
import pandas as pd
from sklearn.linear_model import LogisticRegression
from patsy import dmatrices
def test(final_weight):
d = {
'feat' : ['A', 'A', 'A', 'A', 'B', 'B', 'B', 'B'],
'target' : [0, 0, 1, 1, 0, 0, 0, 1],
'weight' : [1, 1, 1, 1, 1, 1, 1, final_weight],
}
df = pd.DataFrame(d)
print df, '\n'
y, X = dmatrices('target ~ feat', df, return_type="dataframe")
features = X.columns
C = 1e10 # high value to prevent regularization
solver = 'sag' # so we can use sample_weight
lr = LogisticRegression(C=C, solver=solver)
lr.fit(X, df.target, sample_weight=df.weight)
print 'Predictions:', '\n', lr.predict_proba(X), '\n', '===='
test(1)
test(3)
test(9)
这给出了以下输出(我已经删除了一些内容,以使其不再那么冗长):
feat target weight
...
4 B 0 1
5 B 0 1
6 B 0 1
7 B 1 1
Predictions:
[[ 0.50000091 0.49999909]
...
[ 0.74997935 0.25002065]]
====
feat target weight
...
4 B 0 1
5 B 0 1
6 B 0 1
7 B 1 3
/usr/local/lib/python2.7/dist-packages/sklearn/linear_model/sag.py:267: ConvergenceWarning: The max_iter was reached which means the coef_ did not converge
Predictions:
[[ 0.49939191 0.50060809]
...
[ 0.49967407 0.50032593]]
====
feat target weight
...
4 B 0 1
5 B 0 1
6 B 0 1
7 B 1 9
Predictions:
[[ 0.00002912 0.99997088] # Nonsense predictions for A!
...
[ 0.00000034 0.99999966]] # And for B too...
====
您可以看到,当我将最终权重设置为9(这似乎不是一个不合理的高权重)时,预测就毁了! feat = B的预测不仅荒谬,而且feat = A的预测现在也荒谬.
我的问题是
>当最终权重为9时,这些预测为什么会如此错误?
我做错了什么或被误解了吗?
更笼统地说,我真的很感兴趣是否有任何人成功地在SciKit Learn中使用了加权逻辑回归,并实现了与R的glm(…,family =’binomial’)函数所给出的相似的预测.
在此先感谢您的任何帮助.
解决方法:
看来问题出在求解器中:
solver = 'sag'
对于训练样本具有iid假设的大型数据集,通常使用随机求解器.它不适用于高样品重量.
将求解器更改为lbfgs后,结果与您在R中看到的结果匹配.
solver = 'lbfgs'
标签:logistic-regression,scikit-learn,python 来源: https://codeday.me/bug/20191119/2032987.html