Отрицательный R2_score Плохие прогнозы для моей задачи прогнозирования продаж с использованием LightGBM.

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

Мой проект заключается в попытке предсказать количество продаж для конкретного товара в течение всего года. Я использовал пакет LightGBM для проведения прогнозов. Параметры, которые я установил, следующие:

params = {
'nthread': 10,
'max_depth': 5, #DONE
'task': 'train',
'boosting_type': 'gbdt',
'objective': 'regression_l1',
'metric': 'mape', # это abs(a-e)/max(1,a)
'num_leaves': 2, #DONE
'learning_rate': 0.2180, #DONE
'feature_fraction': 0.9, #DONE
'bagging_fraction': 0.990, #DONE
'bagging_freq': 1, #DONE
'lambda_l1': 3.097758978478437, #DONE
'lambda_l2': 2.9482537987198496, #DONE
'verbose': 1,
'min_child_weight': 6.996211413900573,
'min_split_gain': 0.037310344962162616,
'min_data_in_bin': 1, #DONE
'min_data_in_leaf':2, #DONE
'num_boost_round': 1, #DONE
'max_bin': 7, #DONE
'extra_trees': True, #DONE
'early_stopping_rounds':-1
}

Мой набор данных состоит из ежедневных данных о продажах (столбцы: дата, количество) за 2017, 2018, 2019 годы и 3 месяца 2020 года. Я пытался использовать данные за 2017 и 2018 годы для обучения и кросс-валидации, а для тестирования — данные за 2019 год. Однако, мои прогнозы на год сильно ошибочны при рассмотрении количества на еженедельной, ежемесячной, ежеквартальной или годовой основе (ошибка ~40-50%) (я настроил параметры, чтобы снизить ошибку до этих значений). Более того, при учете прогнозов, мой показатель r2_score дает мне отрицательное значение около -2.9148426301633803. Есть ли какие-то предложения, что можно сделать, чтобы улучшить ситуацию?

Скрипт для LightGBM:

lgb_train = lgb.Dataset(train_x, train_y)
lgb_valid = lgb.Dataset(test_x, test_y)
model = lgb.train(params, lgb_train, \
                  valid_sets=[lgb_train, lgb_valid],\
                  verbose_eval=50)
test_df_pred = df[(df.date >= '2019-01-01') & (df.date < '2020-01-01')]
#test_df_pred = df[(df.date >= '2019-01-01') & (df.date < '2019-02-01')]
#test_df_pred = df[(df.date >= '2019-01-15') & (df.date < '2019-01-22')]
test_df_pred['month'] = test_df_pred['date'].dt.month
test_df_pred['day'] = test_df_pred['date'].dt.dayofweek
test_df_pred['year'] = test_df_pred['date'].dt.year
col = [i for i in test_df_pred.columns if i not in ['date','id', 'qty']]
y_test_pred = model.predict(test_df_pred[col])
test_df_pred['qty_pred'] = y_test_pred
mse = mean_squared_error(y_true=test_df_pred['qty'], y_pred=test_df_pred['qty_pred'])
mae = mean_absolute_error(y_true=test_df_pred['qty'], y_pred=test_df_pred['qty_pred'])
mape = mean_absolute_percentage_error(y_true=test_df_pred['qty'], y_pred=test_df_pred['qty_pred'])
qty = test_df_pred.qty.sum()
qty_pred = test_df_pred.qty_pred.sum()
diff = qty_pred - qty

enter image description here
enter image description here

enter image description here

Я предполагаю, что вы новичок в этой области, поэтому я бы посоветовал использовать учебные материалы для достижения вашей цели. Потому что то, что вы сделали, полностью неверно, и ваш подход неправилен. Я думаю, вы хотите моделировать продажи как временной ряд без использования каких-либо предсказателей, вместо этого вы хотите моделировать будущие значения, рассматривая прошлые значения. Для этого вам нужно использовать такие алгоритмы, как ARIMA, экспоненциальное сглаживание и т. д. То, что вы сделали, — это попытка коррелировать год, месяц и день с продажами, что не несет никакой информации о продаже, как ожидалось (также вы неправильно это раскодировали). Поэтому ваш показатель производительности показывает вам отрицательный результат. В качестве справки посмотрите эти статьи, которые похожи на вашу задачу. Источник1, Источник2, Источник3. Эти материалы помогут решить вашу проблему.

.

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

Проблема, которую вы описали, связана с попыткой предсказать количество продаж, используя LightGBM, и получением отрицательного значения коэффициента детерминации (R²) в сочетании с высокой процентной ошибкой. Давайте разберемся в деталях и предложим решения.

Анализ проблемных моментов

  1. Отрицательный R²: Отрицательное значение R² указывает на то, что ваша модель работает хуже, чем простое среднее значение целевой переменной (в данном случае, количества продаж). Это сигнализирует о том, что модель плохо обучена и не способна предсказывать данные с приемлемой точностью.

  2. Высокая процентная ошибка (40-50%): Это также указывает на то, что предсказания существенно отличаются от реальных значений, что, вероятно, связано с неправильной спецификацией модели и использованием неподходящих признаков.

Возможные причины и рекомендации

1. Неправильная обработка данных

Вы пытаетесь предсказать продажи, используя только признаки даты (год, месяц, день недели). Такие признаки могут быть недостаточны для моделирования временных рядов продаж, которые зависят от многих внешних факторов.

2. Параметры модели LightGBM

Вы используете очень агрессивные параметры для модели. Например, пониженная глубина деревьев (max_depth = 5) и небольшое количество листьев (num_leaves = 2) может ограничивать способность модели к обучению сложных зависимостей в данных. Также использование всего одного раунда бустинга (num_boost_round = 1) вероятно приведет к недообучению.

3. Неоптимальная реализация временного прогнозирования

Ваша задача возможна решить как проблематику временных рядов. Вместо текущего подхода рекомендуется использовать более специализированные алгоритмы для временных рядов, такие как ARIMA, SARIMA, или даже подходы машинного обучения, заточенные под временные ряды, такие как Пропет или LSTM.

Рекомендации по улучшению модели

  1. Более богатые данные для обучения: Используйте более полные данные, добавив, например, сезонные факторы, праздники, промо-акции и другие внешние показатели, которые могут влиять на продажи.

  2. Пересмотреть параметры LightGBM: Рассмотрите увеличение num_boost_round, num_leaves и max_depth, чтобы модель могла лучше обучаться на данных. Также следует рассмотреть использование другого распределения потерь, например регрессию MSE (regression) вместо L1 (regression_l1) в качестве objective.

  3. Временные ряды: Для вашей задачи было бы уместно попробовать модели временных рядов. Прогнозирование на основе временных рядов поможет лучше уловить временные зависимости и сезонные тренды. Изучите использование ARIMA или даже более сложных подходов, таких как Prophet.

  4. Кросс-валидация: Убедитесь, что используете подходящий метод кросс-валидации для временных рядов, например, TimeSeriesSplit, чтобы модель не обучалась на будущих данных.

Заключение

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

Надеемся, что наши рекомендации помогут вам улучшить точность модели и достичь лучших прогнозов продаж.

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

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