Почему случайный лес дает лучшие результаты, чем XGBoost?

#machine-learning #scikit-learn #random-forest #xgboost

#машинное обучение #scikit-learn #случайный лес #xgboost

Вопрос:

Я пытаюсь сравнить результаты точности (в наборе данных titanic) между random forest и XGBoost , и я не могу понять, почему random forest дает лучшие результаты.

  • XGBoost — это своего рода оптимизированная базовая модель дерева. Он вычисляет оптимизированное дерево каждый цикл (каждый новый оценщик).
  • Случайный лес постройте много деревьев (с разными данными и разными функциями) и выберите лучшее дерево.

Я работаю над набором данных titanic (после обработки Nan и удаления некоторого шума). (Обе модели получают один и тот же набор данных)

Для обоих алгоритмов я настраиваю гиперпараметры.

Модель XGBoost:

 model = XGBClassifier(n_jobs=-1, random_state=42)
hyperparams = {'max_depth': [2,3,4,5,6,7,8],
               'n_estimators': [20, 50, 100, 120],
               'learning_rate': [0.1, 0.2, 0.3, 0.4, 0.5]}

randomized = RandomizedSearchCV(model, hyperparams, n_iter=40, cv=5, random_state=42, scoring='accuracy')
randomized.fit(x,y)
best_params = randomized.best_estimator_
model = XGBClassifier(n_jobs=-1,
                                   max_depth=best_params.max_depth,
                                   n_estimators=best_params.n_estimators,
                                   learning_rate=best_params.learning_rate)
model.fit(train_df_x, train_df_y)
y_pred = model.predict(test_df_x)
 

Модель случайного леса:

 model = RandomForestClassifier(random_state=42, n_jobs=-1)
hyperparams = {'n_estimators': [20, 50, 100, 120],
                'max_depth': [2,3,4,5,6,7,8]}

randomized = RandomizedSearchCV(model, hyperparams, n_iter=20, cv=5, random_state=42, scoring='accuracy')
randomized.fit(x, y)
best_params = randomized.best_estimator_
model = RandomForestClassifier(random_state=42,
                                            n_jobs=-1,
                                            n_estimators=best_params.n_estimators,
                                            max_depth=best_params.max_depth)
model.fit(train_df_x, train_df_y)
y_pred = model.predict(test_df_x)
 

Как вы можете видеть:

  • Я использую больше итераций гиперпараметров XGBoost (потому что у него больше параметров для настройки).

Я получаю следующие результаты точности:

  • Случайный лес: 86,6
  • XGBoost: 85.41

Перед запуском теста я был уверен, что XGBoost даст мне лучшие результаты.

Как это может random forest дать лучшие результаты? Чего мне не хватает при использовании XGBoost ?

Комментарии:

1. RF — очень мощный классификатор в целом . Тот факт, что XGBoost обычно работает лучше, носит эмпирический и статистический характер и не оправдывает ваше удивление здесь; в конце концов, многое зависит от конкретного набора данных.

2. Набор данных titanic невелик. Возможно, если у вас будет гораздо больше данных, то с Xgboost вы получите лучшие результаты. Но это очень сильно зависит от данных…