groupby Pandas DataFrame 上的线性回归

问题描述 投票:0回答:1

目前我的代码设置如下:

def lregression(data, X, y):
    X = df['sales'].values.reshape(-1, 1)
    y = df['target']
    model = LinearRegression()
    result = model.fit(X, y)
    return model.score(X, y)

然后,我尝试将这个模型应用于每个品牌:

df.groupby('brand').apply(lregression, X, y)

但结果只是应用于完整数据集:

Brand A    0.734
Brand B    0.734
Brand C    0.734

我在这里遗漏了什么吗?我希望模型为每个组单独运行,但我显然是将模型应用于完整的数据集,然后为每个组返回总体分数。谢谢!

python pandas group-by linear-regression
1个回答
1
投票

数据框

一个最小的可重现示例总是很高兴,我将在这里提供它:

np.random.seed(42)
data = {
    'brand': np.random.choice(['Brand A', 'Brand B', 'Brand C'], size=300),
    'sales': np.random.randint(100, 1000, size=300),
    'target': np.random.randint(100, 1000, size=300)
}

df = pd.DataFrame(data)

功能

对我来说,不清楚你是否想要返回单个回归的

score
(即R^2)或
coef
,在这两种情况下,函数仅略有变化:

得分

def lregression(group):
    X = group['sales'].values.reshape(-1, 1)
    y = group['target']
    model = LinearRegression()
    result = model.fit(X, y)
    return result.score(X, y)

系数

def lregression(group):
    X = group['sales'].values.reshape(-1, 1)
    y = group['target']
    model = LinearRegression()
    result = model.fit(X, y)
    return result.coef_

然后是最后一步(

coef_
场景):

>>> df.groupby('brand').apply(lregression)
 
brand
Brand A     [0.20322970187699263]
Brand B     [0.09134770152569331]
Brand C    [0.043343302335992005]
dtype: object

效果符合预期

© www.soinside.com 2019 - 2024. All rights reserved.