Как я могу улучшить свою модель XGBoost, если настройка гиперпараметра оказывает минимальное влияние? - PullRequest
1 голос
/ 18 марта 2020

Я работаю над регрессионной моделью с использованием XGBoost, пытаясь предсказать, сколько долларов потратят клиенты за год. У меня ~ 6000 выборок (клиентов), ~ 200 функций, связанных с этими клиентами, и сумма, которую они потратили за год (моя переменная результата). Я разделил свои данные на 75% / 25% разделение поезд / тест и запустил несколько моделей XGBoost с разной степенью успеха ...

В моей исходной модели, похоже, есть некоторая перегрузка без настройки (по умолчанию параметров), которые имели следующие значения R 2 :
• Обучение R 2 - 0,593
• Тест R 2 - 0,098

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

param_grid = {'learning_rate' : [0.05, 0.10, 0.20],  
          'min_child_weight': [1, 5, 10],  
          'gamma': [0.5, 1, 5],  
          'subsample': [0.6, 0.8, 1.0],  
          'colsample_bytree': [0.6, 0.8, 1.0],  
           'max_depth': [3, 4, 5]  
         }  
grid = GridSearchCV(xgb.XGBRegressor(silent=True)
                   ,param_grid
                   ,n_jobs=1
                   ,cv=3
                   ,scoring='r2'
                   ,verbose=1
                   ,refit=True)

• Обучение R 2 - 0,418
• Тест R 2 - 0,093

Я также вручную настроил гиперпараметры и был смог получить следующие результаты, но это все.
• Тренировка R 2 - 0,573
• Тест R 2 - 0,148

Эти 6000 клиенты представляют всех клиентов за год, поэтому я не могу ввести дополнительные образцы, чтобы улучшить размер выборки.

Мой вопрос: Есть ли предложения по настройке других гиперпараметров или стратегий? Мне следует постараться сделать модель более согласованной при разделении поезд / тест и уменьшить перегрузку? Возможно, что слишком большая разница в моей переменной результата (потраченные доллары) не позволяет создать согласованную модель, но я хочу попытаться исчерпать все варианты.

1 Ответ

0 голосов
/ 18 марта 2020

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

Но я все еще готов ответить на ваши вопрос, и если есть какой-то сигнал, который вы определенно можете улучшить в квадрате R.

Во-первых, попытайтесь уменьшить свои возможности . 200 - это множество функций для 4500 строк данных. Попробуйте использовать различное количество функций, таких как 20, 50, 80, 100 и т. Д. c до 100. Или вы можете использовать такие вещи, как SelectKBest из sklearn, или рассчитать размер эффекта для функций, чтобы выбрать лучшие K функций.

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

В-третьих, вместо использования регрессии XGBoost, попробуйте использовать более простые методы регрессии. например, Linear, Lasso, Ridge, Elasti c Net и др. c и посмотрите, сможете ли вы получить что-то лучше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...