2016-02-15 217 views
2

我正在嘗試SciKit學習。我想我會嘗試一個加權logistic迴歸,但是當使用sample_weight參數初始化它時,我從sklearn的LogisticRegression對象中獲得無意義的預測。sklearn LogisticRegression predict_proba()在使用sample_weight參數時給出了不正確的預測

這是一個玩具的例子,它演示了這個問題。我建立了一個非常簡單的數據集,包含一個功能和一個二進制目標輸出。

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 S,它看起來就像有0.5的成功機率
  • 如果W=9,現在有效九個1 s和三個0 s,所以有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學習,並取得了類似的預測由[Rglm(..., family='binomial')函數給出的。

很多人提前感謝任何幫助。

回答

1

看來,問題出在求解:

solver = 'sag' 

使用隨機求解器是與你訓練的例子獨立同分布的假設大型數據集普遍。對於較高的樣本權重,它效果不佳。

改變求解器來lbfgs後的結果符合您所看到的在R.

solver = 'lbfgs' 
+0

大衛,非常感謝!這似乎是完美的。出於某種原因,我已經將它納入我的腦海,只有'sag'解算器可以用於sample_weight,但事實並非如此。 –

相關問題