Sklearn相当于statsmodel logit

2024-09-28 03:11:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个带有

df.head()

enter image description here

(变量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”,与上述操作的等效性是什么


Tags: 代码fromimportdfmodelsklearn级别head
1条回答
网友
1楼 · 发布于 2024-09-28 03:11:49

您可以从提供onehot编码的内容开始,基本上删除最后一个级别,然后在与最后一个级别对应的行中插入-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)))

enter image description here

看看系数:

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

相关问题 更多 >

    热门问题