В настоящее время мой код настроен следующим образом:
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
Я что-то упускаю? Я хочу, чтобы модель запускалась отдельно для каждой группы, но вместо этого я, очевидно, применяю модель к полному набору данных, а затем получаю общий балл для каждой группы. Спасибо!
На данный момент из приведенного примера я могу понять, что вы хотите запросить все записи для бренда и разместить поверх них регрессор. Один из способов — получить все уникальные названия брендов, а затем запросить их данные по отдельности — обучить модель и сохранить модель под названием бренда.
Набор данных просто прогнозирует целевую переменную с использованием продаж, и я хотел бы, чтобы регрессия оценивалась для каждой группы, а не на общем уровне. Я знаю, что есть способ сделать это подобным образом, но мне просто не удалось получить результат.
Минимальный воспроизводимый пример всегда приятно иметь, я приведу его здесь:
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
Что работает так, как ожидалось
Понял на примере в следующий раз, спасибо большое! Я смог использовать это, чтобы заставить его работать, я просто не понимал, как должна работать моя функция.
Вам необходимо предоставить дополнительную информацию о наборе данных, который вы используете.