我使用statsmodel拟合了一个逻辑模型,如下所示:
import statsmodels.api as sm
logit = sm.Logit(train1['resp'], train1[v])
result = logit.fit()
result.summary()
=================================================================================================
coef std err z P>|z| [0.025 0.975]
-------------------------------------------------------------------------------------------------
AGEINQ -0.0420 0.015 -2.782 0.005 -0.072 -0.012
BKROPN12 0.1048 0.067 1.572 0.116 -0.026 0.236
SCRG001 -0.1600 0.128 -1.251 0.211 -0.411 0.091
BKRATTH 0.0037 0.002 1.947 0.051 -2.42e-05 0.007
HET1001_HE -0.5102 0.178 -2.866 0.004 -0.859 -0.161
SCRS009 0.0167 0.010 1.614 0.107 -0.004 0.037
SCRPF33 -2.874e-06 7.5e-07 -3.834 0.000 -4.34e-06 -1.4e-06
CINS99 -0.0017 0.001 -2.872 0.004 -0.003 -0.001
SCRBI20 -0.0158 0.002 -6.365 0.000 -0.021 -0.011
HMP2N24 -0.1380 0.085 -1.629 0.103 -0.304 0.028
AGE 0.0326 0.005 6.511 0.000 0.023 0.042
SUB_PRIME_BANKCARD_PROPENSITY -0.0005 0.001 -1.019 0.308 -0.002 0.000
FINSCR -0.0043 0.000 -10.570 0.000 -0.005 -0.003
REVMOF -0.0007 0.000 -2.301 0.021 -0.001 -0.000
现在,我正在尝试对以下示例记录使用result.predict()进行预测:
AGEINQ BKROPN12 SCRG001 BKRATTH HET1001_HE SCRS009 SCRPF33 CINS99 \
10 0 1 99 0 3 140000 380
SCRBI20 HMP2N24 AGE SUB_PRIME_BANKCARD_PROPENSITY FINSCR REVMOF
160.0 0 45 331 711 286
产生的概率为:0.003365
。但是,如果我使用手动方法:
logit = sum(coeff * var)和prob = 1/1 + exp(-logit),然后得到prob:0.0000897386
。
statsmodel如何预测效果?
答案 0 :(得分:1)
我不确定您在做什么错,我已经尝试了模拟数据,并且它可以按预期工作。我的API稍有不同(对我执行.summary()会导致错误,如此处https://github.com/statsmodels/statsmodels/issues/3931所述),因此可能存在某些版本不匹配的情况。请尝试以下方法是否为您提供相同的结果:
from statsmodels.api import Logit
import numpy as np
np.random.seed(0)
x = np.random.randn(15,4)
x2 = np.random.randn(10,4)
y = np.random.randint(0,2,15).astype(bool)
logit = Logit(y,x)
result = logit.fit()
print('Fitted parameters:', result.params)
# Returns [ 0.40596774 -0.09559817 -0.31366232 -0.38795499]
print('Prediction:', result.predict(x2))
# Returns [0.66510963 0.60879072 0.34253278 0.67262531 0.44466609 0.4727276
# 0.530712 0.29249711 0.40258415 0.41042116]
logit = x2.dot(result.params)
print('Manual prediction:', 1/(1+np.exp(-logit)))
# Returns [0.66510963 0.60879072 0.34253278 0.67262531 0.44466609 0.4727276
# 0.530712 0.29249711 0.40258415 0.41042116]