Sklearn 相当于 statsmodel logit

Sklearn equivalent to statsmodel logit

我有一个数据框 df

df.head()

(变量 F1、F2 和 F3 的 3、3 和 6 级),以及 运行 代码

from patsy.contrasts import Sum
import statsmodels.formula.api as smf

model = 'SEL ~ C(F1, Sum) + C(F2, Sum) + C(F3, Sum)'
model = smf.logit(model, data=df)
model_fit = model.fit()

1) 上述使用 sklearn 的等效项是什么?

2) 上面使用 sklearn 但在对模型变量的第一次赋值时删除 "Sum" 的等效项是什么?

您可以从提供单热编码的东西开始,基本上删除最后一层,然后在与最后一层对应的那些行中插入 -1:

from sklearn.linear_model import LogisticRegression
import matplotlib.pyplot as plt
from sklearn import preprocessing

def contrSum(DF,column):
    DF[column] = DF[column].astype('category')
    nlevels = len(DF[column].unique())
    dm = pd.get_dummies(DF[column],prefix=column,dtype=np.int64)
    dm.loc[dm[dm.columns[nlevels-1]]==1,dm.columns[:(nlevels-1)]] = -1
    return dm.iloc[:,:(nlevels-1)]

contrSum(df,'F1')

    F1_1    F1_2
0   1   0
1   0   1
2   1   0
3   0   1
4   0   1
... ... ...
95  1   0
96  -1  -1
97  1   0
98  0   1
99  -1  -1

现在我们将此函数应用于所有列,连接并适合:

dmat = pd.concat([contrSum(df,'F1'),contrSum(df,'F2'),contrSum(df,'F3')],axis=1)
clf = LogisticRegression(fit_intercept=True).fit(dmat,df['SEL'])

让我们绘制:

prob = clf.predict_proba(dmat)[:,1]
plt.scatter(x=model_fit.fittedvalues,y=np.log(prob/(1-prob)))

查看系数:

pd.DataFrame({'sk_coef':clf.coef_[0],'smf_coef':model_fit.params[1:]})

    sk_coef smf_coef
C(F1, Sum)[S.1] 0.007327    0.023707
C(F1, Sum)[S.2] -0.337868   -0.375865
C(F2, Sum)[S.1] -0.174720   -0.192799
C(F2, Sum)[S.2] 0.018365    0.031589
C(F3, Sum)[S.1] 0.197189    0.251827
C(F3, Sum)[S.2] 0.058658    0.045554
C(F3, Sum)[S.3] -0.103133   -0.148508
C(F3, Sum)[S.4] -0.209002   -0.265786
C(F3, Sum)[S.5] 0.238623    0.303353