如何用Scikit-learn在Python中按组拟合多变量逻辑回归?
按分组拟合多变量逻辑回归的问题与解决
问题描述
我尝试实现按分组拟合多变量逻辑回归,参考了分组回归的相关内容,但运行代码时报错,示例代码及错误如下:
示例代码:
import pandas as pd from sklearn.linear_model import LogisticRegression df = pd.DataFrame({'group': [1,2,3,4,5,6], 'var1': [9,5,3,1,2,3], 'var2': [3,4,1,6,4,9], 'var3': [3,5,2,8,4,4], 'closed': [0,1,1,1,0,0], 'date': [2020, 2020, 2021, 2022, 2021, 2021] }) def GroupRegress(data, yvar, xvars): Y = data[yvar] X = data[xvars] result = LogisticRegression(Y, X).fit() return result.params df.groupby('group').apply(GroupRegress, 'closed', ['X'])
报错信息:TypeError: __init__() takes from 1 to 2 positional arguments but 3 were given
实际场景中有近20个X变量,同时我的非分组逻辑回归代码如下:
import pandas as pd import datetime as dt from sklearn.model_selection import train_test_split as tts from sklearn.linear_model import LogisticRegression X = df.drop('closed', axis=1) X['date']=X['date'].map(dt.datetime.toordinal) y = df['closed'] X_train, X_test, y_train, y_test = tts(X, y, test_size=0.20) model = LogisticRegression() model.fit(X_train, y_train)
解决方案
1. 错误根源
sklearn的LogisticRegression类的构造函数不需要传入训练数据,你错误地把Y和X传给了构造函数,数据应该通过fit()方法传入。
2. 修正分组回归函数
重新编写分组回归函数,正确初始化模型并传入数据:
from sklearn.linear_model import LogisticRegression import pandas as pd import datetime as dt def group_logistic_regress(data, yvar, xvars): y = data[yvar] X = data[xvars] # 初始化模型,可根据需要调整max_iter避免收敛问题 model = LogisticRegression(max_iter=1000) model.fit(X, y) # 整理系数和截距为Series,方便分组查看结果 params = pd.Series(model.coef_.flatten(), index=xvars) params['intercept'] = model.intercept_[0] return params
3. 调用分组回归
自动获取所有特征变量,处理日期后执行分组拟合:
# 定义目标变量和特征变量(排除group和closed) yvar = 'closed' xvars = [col for col in df.columns if col not in [yvar, 'group']] # 处理日期变量,与非分组逻辑保持一致 df['date'] = df['date'].map(dt.datetime.toordinal) # 按group分组拟合模型 group_results = df.groupby('group').apply(group_logistic_regress, yvar=yvar, xvars=xvars) # 查看每个分组的回归结果 print(group_results)
4. 关键注意事项
- 样本量要求:每个分组必须有足够样本,且目标变量的两类都要存在,否则模型无法拟合(比如示例中每个group只有1条数据,实际运行会报错,需确保真实数据分组样本量达标)。
- 模型参数调整:如果遇到收敛警告,可增大
max_iter参数,或调整正则化参数C来优化。 - 特征预处理:所有特征需做统一预处理(如日期转换、标准化等),避免特征尺度差异影响模型性能。
内容的提问来源于stack exchange,提问作者knawhatimean
相关产品推荐
相关产品推荐

