如何调整sklearn的LogitRegression类适配多自变量与固定效应?
适配多自变量与固定效应的Logit回归实现方案
自定义LogitRegression类修改方案
你原来的类核心逻辑是对因变量做logit转换后用线性回归拟合,再通过sigmoid映射回0-1区间,只要放开单变量限制即可适配多特征和固定效应输入,修改后代码如下:
import numpy as np from sklearn.linear_model import LinearRegression class LogitRegression(LinearRegression): def __sigmoid(self, x): # 截断避免数值溢出 x = np.clip(x, -500, 500) return 1 / (1 + np.exp(-x)) def fit(self, X, y): # 支持输入多特征矩阵,可直接传入连续自变量+国家独热编码的组合 # 因变量边界截断避免logit转换报错 y = np.clip(y, 1e-6, 1 - 1e-6) y_logit = np.log(y / (1 - y)) # 直接调用父类线性回归的拟合逻辑 super().fit(X, y_logit) return self def predict(self, X): linear_output = super().predict(X) return self.__sigmoid(linear_output)
使用注意事项:
- 你已经通过
pd.get_dummies生成的国家独热编码,直接和x1、x2、x3拼接作为输入特征即可 - 如果生成独热编码时没有加
drop_first=True,拟合时需要设置fit_intercept=False避免多重共线性(虚拟变量陷阱) - 输出的预测值会自动落在(0,1)区间,不会出现普通线性回归的越界问题
更便捷的替代实现方案
你提到statsmodels OLS难以添加固定效应的问题,用公式接口可以轻松解决,不需要提前生成独热编码,适配性更强:
import numpy as np import statsmodels.formula.api as smf # 直接在公式中指定分类变量作为固定效应,自动处理虚拟变量陷阱 df['y_logit'] = np.log(np.clip(df['比例因变量'], 1e-6, 1-1e-6) / (1 - np.clip(df['比例因变量'], 1e-6, 1-1e-6))) model = smf.ols("y_logit ~ x1 + x2 + x3 + C(国家)", data=df).fit() # 预测时转换回0-1区间 linear_pred = model.predict(df) pred = 1 / (1 + np.exp(-linear_pred))
如果你的数据是面板结构,还可以直接用statsmodels的PanelOLS接口指定个体/时间固定效应,代码更简洁,也能避免高维独热编码带来的性能损耗。
内容的提问来源于stack exchange,提问作者Hoppity81
相关产品推荐
相关产品推荐

