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
我有一个数据框 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