Использование прогнозных значений из унивариантной модели в качестве входных данных для линейной регрессии

Вопрос или проблема

У меня есть еженедельные временные ряды данных за последние 2 года с переменными "неделя", "расходы на маркетинг", "трафик на сайте" и "выручка". Теперь мне нужно спрогнозировать "потенциальный трафик на сайте" и "потенциальную выручку" на следующие 12 недель. К сожалению, я не знаю "расходы на маркетинг" на ближайшие 12 недель. Меня просят спрогнозировать потенциальные расходы, а на основе этого — другие результаты.

Я немного запутался. Я планирую запустить унивариантную модель, чтобы получить "расходы на маркетинг" на следующие 12 недель, а затем запустить линейную регрессию, чтобы получить "потенциальный трафик на сайте", а потом запустить еще одну линейную регрессию, чтобы получить "потенциальную выручку".

Я знаю, что это может звучать неправильно, но не могли бы вы подсказать, какой может быть правильный подход? Вот наши тестовые данные.

import pandas as pd
import numpy as np

# Создаем диапазон дат с 2021-01-07 по 2022-12-29 (только четверги)
dates = pd.date_range(start="2021-01-07", end='2022-12-29', freq='W-THU')

# Создаем DataFrame с случайными данными
data = pd.DataFrame({
    'date': dates,
    'cost': np.random.uniform(low=100000, high=1500000, size=len(dates)).astype(int),
})
# Рассчитываем столбец выручки на основе столбцов расходов и трафика
data['traffic'] = (data['cost']  * 2.5).round().astype(int)
data['revenue'] = (data['cost']  * 2).round().astype(int)
# Создаем новые столбцы для недели, месяца и года
data['week'] = data['date'].dt.isocalendar().week
data['month'] = data['date'].dt.month
data['year'] = data['date'].dt.year

df = data
df

Модель, которую я использую для прогнозирования расходов, выглядит следующим образом.

import statsmodels.api as sm

# Преобразовываем столбец даты в формат datetime и устанавливаем его в качестве индекса
df['date'] = pd.to_datetime(df['date'])
df.set_index('date', inplace=True)

# Создаем новый DataFrame только со столбцом 'cost'
cost_df = df[['cost']]

# Разделяем данные на обучающую и тестовую выборки
train_data = cost_df.iloc[:-12]
test_data = cost_df.iloc[-12:]

# Преобразуем индекс в числовые значения
train_data['numeric_index'] = range(len(train_data.index))

# Создаем и подгоняем модель с использованием OLS регрессии
model = sm.OLS(train_data['cost'], sm.add_constant(train_data['numeric_index'])).fit()

# Создаем новый DataFrame для следующих 12 недель
next_weeks = pd.DataFrame(pd.date_range(start=df.index[-1]+pd.Timedelta(days=1), periods=12, freq='W-THU'), columns=['date'])
next_weeks['week'] = next_weeks['date'].dt.isocalendar().week
next_weeks['month'] = next_weeks['date'].dt.month
next_weeks['year'] = next_weeks['date'].dt.year

# Преобразуем индекс в числовые значения
next_weeks['numeric_index'] = range(len(train_data.index), len(train_data.index) + len(next_weeks))

# Используем модель для прогнозирования следующих 12 недель
next_weeks['cost'] = model.predict(sm.add_constant(next_weeks['numeric_index']))

# Печатаем DataFrame с прогнозируемыми расходами на следующие 12 недель
print(next_weeks)

Теперь я использую DataFrame next_weeks в качестве тестовой выборки и прогнозирую трафик и выручку на его основе.

from sklearn.multioutput import MultiOutputRegressor
from sklearn.ensemble import RandomForestRegressor

# Разделяем данные на обучающую и тестовую выборки
X_train = df[['week', 'month', 'cost']]
y_train = df[['traffic', 'revenue']]
X_test = next_weeks[['week', 'month', 'cost']]

# Обучаем регрессию случайного леса в качестве многоoutput регрессора
regr = MultiOutputRegressor(RandomForestRegressor(random_state=42))
regr.fit(X_train, y_train)

# Используем модель для прогнозирования следующих 12 недель
y_pred = regr.predict(X_test)

# Добавляем предсказанные столбцы трафика и выручки в DataFrame next_weeks
next_weeks[['traffic', 'revenue']] = np.round(y_pred).astype(int)

print(next_weeks)

Не могли бы вы помочь мне найти лучшее решение или направить меня к правильному подходу к такой задаче? Заранее спасибо!

Ваш подход вполне приемлем! Но вместо того, чтобы оценивать расходы на маркетинг унивариантно, вы могли бы попробовать построить другую регрессионную модель, чтобы оценить их с использованием других параметров.

Ответ или решение

Ваш подход вполне оправдан! Однако я хотел бы предложить некоторые улучшения и альтернативные подходы для более точного прогнозирования.

Шаг 1: Прогнозирование маркетинговых расходов

Вместо использования унивариантной модели для прогноза «маркетинговых расходов», имеет смысл использовать множественную регрессию. При этом вы можете учитывать другие факторы, такие как «трафик», «выручка» и временные характеристики, например, неделя или месяц. Это может помочь учесть влияние переменных друг на друга.

# Создаем новый DataFrame с нужными признаками
X = df[['week', 'month', 'traffic', 'revenue']]
y = df['cost']

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Обучаем модель множественной регрессии
from sklearn.linear_model import LinearRegression
model_cost = LinearRegression()
model_cost.fit(X_train, y_train)

# Прогнозируем расходы на маркетинг для тестового набора
next_weeks[['traffic', 'revenue']] = np.round(y_pred).astype(int)  # старый код

# Используем новые входные данные для прогноза затрат на маркетинг
X_next_weeks = next_weeks[['week', 'month', 'traffic', 'revenue']]
next_weeks['cost'] = model_cost.predict(X_next_weeks)

Шаг 2: Прогнозирование трафика и выручки

После получения прогноза «маркетинговых расходов», можно продолжить с вашим подходом к прогнозированию «трафика» и «выручки». Вы можете использовать ранее обученную модель случайного леса или другую регрессионную модель.

# Заменяем старые значения
X_train = df[['week', 'month', 'cost']]
y_train = df[['traffic', 'revenue']]

regr = MultiOutputRegressor(RandomForestRegressor(random_state=42))
regr.fit(X_train, y_train)

# Обновляем набор тестовых данных
X_test = next_weeks[['week', 'month', 'cost']]

# Прогнозируем трафик и выручку
y_pred = regr.predict(X_test)

# Добавляем предсказанные значения в next_weeks
next_weeks[['traffic', 'revenue']] = np.round(y_pred).astype(int)

print(next_weeks)

Заключение

Ваш текущий подход вполне работоспособен, но рекомендуется использовать более сложные модели регрессии для маркетинговых расходов, учитывающие множество факторов. Это может улучшить точность ваших прогнозов «трафика» и «выручки». Не бойтесь экспериментировать с различными моделями, а также проводить валидацию и оценку модели с использованием кросс-валидации, чтобы выбрать наиболее подходящий алгоритм.

Надеюсь, этот подход окажется для вас полезным. Удачи с вашими прогнозами!

Оцените материал
Добавить комментарий

Капча загружается...