You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

按ClientID分组构建线性回归模型报错求助

按ClientID分组的线性回归问题解决与优化思路

问题背景

基于DataFrame dfTotal3,按ClientID分组,以WeightDiff(自上次记录后的体重变化)为自变量、Steps(客户每日步数)为因变量构建线性回归模型,原代码运行触发维度不匹配错误。

错误原因

报错提示Expected 2D array, got 1D array instead,因为sklearn的LinearRegression.predict()要求输入特征为2D数组,但传入的target是1D结构。此外原代码存在两个逻辑问题:

  • model函数的第一个参数命名错误,groupby.apply会将每个分组的子DataFrame传入该参数,而非全局的dfTotal3
  • group_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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 22:15:09