其他分享
首页 > 其他分享> > 使用sample_weight参数时,sklearn LogisticRegressiondict_proba()给出错误的预测

使用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' 

对于训练样本具有i​​id假设的大型数据集,通常使用随机求解器.它不适用于高样品重量.

将求解器更改为lbfgs后,结果与您在R中看到的结果匹配.

solver = 'lbfgs' 

标签:logistic-regression,scikit-learn,python
来源: https://codeday.me/bug/20191119/2032987.html