【问题标题】:Sklearn equivalent to statsmodel logitSklearn 相当于 statsmodel logit
【发布时间】:2020-09-06 04:14:13
【问题描述】:

我有一个带有

的数据框 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”时,与上面的等价物是什么?

【问题讨论】:

    标签: python scikit-learn statsmodels


    【解决方案1】:

    您可以从提供 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)))
    

    看系数:

    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
    

    【讨论】:

    • 感谢您的回答,但我想避免先运行 statsmodel,因为由于某种原因我无法在特定机器上运行 statsmodel。但是我可以运行 sklearn,所以我想知道我是否可以在 sklearn 中独立运行等效代码。也许我应该提到这一点。
    • 嗯,你可以运行 patsy 吗?对比部分需要一些编码
    • 很遗憾没有... Statsmodel 和 patsy 在我的机器上存在依赖冲突问题,我至今无法解决。
    猜你喜欢
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 2022-06-15
    • 2020-09-04
    • 2014-09-15
    • 2022-01-13
    • 2021-07-12
    相关资源
    最近更新 更多