按ClientID分组构建线性回归模型报错求助
按ClientID分组的线性回归问题解决与优化思路
问题背景
基于DataFrame dfTotal3,按ClientID分组,以WeightDiff(自上次记录后的体重变化)为自变量、Steps(客户每日步数)为因变量构建线性回归模型,原代码运行触发维度不匹配错误。
错误原因
报错提示Expected 2D array, got 1D array instead,因为sklearn的LinearRegression.predict()要求输入特征为2D数组,但传入的target是1D结构。此外原代码存在两个逻辑问题:
model函数的第一个参数命名错误,groupby.apply会将每个分组的子DataFrame传入该参数,而非全局的dfTotal3group_predictions函数中错误覆盖了传入的target参数,替换为未定义的dfWeightComp['DTWDG']
修正后的代码
import numpy as np from sklearn.linear_model import LinearRegression import pandas as pd def model(group_df, target): # 提取当前分组的自变量和因变量 X = group_df[['WeightDiff']].values # 保持2D数组格式 y = group_df['Steps'].values # sklearn接受1D格式的因变量 lr_model = LinearRegression() lr_model.fit(X, y) # 将target转换为2D数组,兼容Series和numpy数组输入 if isinstance(target, pd.Series): target_2d = target.values.reshape(-1, 1) else: target_2d = target.reshape(-1, 1) return lr_model.predict(target_2d) def group_predictions(df, target): # 按ClientID分组,对每个分组应用模型 return df.groupby('ClientID').apply(model, target=target) # 调用示例:传入待预测的WeightDiff数据 predictions = group_predictions(dfTotal3, dfTotal3['DTWDG'])
其他建模思路
- 多元线性回归:若有客户年龄、性别、饮食数据等额外特征,可加入模型提升拟合精度,只需修改
X为多列特征即可 - 混合效应模型(随机效应):当客户群体存在共性+个体差异时,使用混合效应模型能同时利用组间和组内信息,比单纯分组回归更高效:
import statsmodels.api as sm from statsmodels.regression.mixed_linear_model import MixedLM # 构建混合效应模型,ClientID作为随机分组 mixed_model = MixedLM.from_formula( 'Steps ~ WeightDiff', data=dfTotal3, groups=dfTotal3['ClientID'] ) model_result = mixed_model.fit() print(model_result.summary()) # 生成预测结果 mixed_predictions = model_result.predict(dfTotal3) - 非线性模型:若步数与体重变化并非线性关系,可尝试分组应用多项式回归、决策树回归等非线性模型,捕捉更复杂的变量关系
内容的提问来源于stack exchange,提问作者Aodhan
相关产品推荐
相关产品推荐

