我正在嘗試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學習,並取得了類似的預測由[R的glm(..., family='binomial')
函數給出的。
很多人提前感謝任何幫助。
大衛,非常感謝!這似乎是完美的。出於某種原因,我已經將它納入我的腦海,只有'sag'解算器可以用於sample_weight,但事實並非如此。 –