Поиск по сетке и классификатор XGB с использованием весов классов - PullRequest
0 голосов
/ 11 января 2019

Я пытаюсь использовать scikit-learn GridSearchCV вместе с оболочкой XGBoost XGBClassifier для моей несбалансированной многоклассовой классификации. До сих пор я использовал список весов классов в качестве входных данных для аргумента scale_pos_weight, но, похоже, это не работает, поскольку все мои прогнозы относятся к классу большинства. Вероятно, это связано с тем, что в документации XGBClassifier упоминается, что scale_pos_weight может использоваться только для задач двоичной классификации.

Итак, мой вопрос, как я могу ввести веса выборки / класса для задачи классификации нескольких классов, используя scikit-learn GridSearchCV?

Мой код указан ниже:

import numpy as np
import xgboost as xgb
from sklearn.model_selection import GridSearchCV
from sklearn.utils.class_weight import compute_class_weight

class_weights = compute_class_weight('balanced', np.unique(training_targets), 
                                 training_targets[target_label[0]])

random_state = np.random.randint(0, 1000)

parameters =    {
            'max_depth': [3, 4, 5],
            'learning_rate': [0.1, 0.2, 0.3],
            'n_estimators': [50, 100, 150],
            'gamma': [0, 0.1, 0.2],
            'min_child_weight': [0, 0.5, 1],
            'max_delta_step': [0],
            'subsample': [0.7, 0.8, 0.9, 1],
            'colsample_bytree': [0.6, 0.8, 1],
            'colsample_bylevel': [1],
            'reg_alpha': [0, 1e-2, 1, 1e1],
            'reg_lambda': [0, 1e-2, 1, 1e1],
            'base_score': [0.5]
            }

xgb_model = xgb.XGBClassifier(scale_pos_weight = class_weights, silent = True,
                          random_state = random_state)

clf = GridSearchCV(xgb_model, parameters, scoring = 'f1_micro', n_jobs = -1, cv = 5)

clf.fit(training_features, training_targets.values[:, 0])

model = clf.best_estimator_

1 Ответ

0 голосов
/ 11 января 2019

scale_pos_weight предназначен только для двоичной классификации, поэтому он не будет работать для задач классификации с несколькими метками.

Для вашего случая более целесообразно использовать параметр weight, как описано здесь (https://xgboost.readthedocs.io/en/latest/python/python_api.html). Аргументом будет массив, каждый элемент которого представляет вес, назначенный для соответствующей точки данных.

Идея заключается в том, чтобы вручную назначать разные веса различным классам. Там нет стандарта в том, как вам нужно назначить веса, это больше зависит от вашего решения. Чем больше веса присваивается выборке, тем больше она влияет на целевую функцию во время тренировки.

Однако, если вы используете формат Scikit Learn API, вы не можете ни указать весовой параметр, ни использовать формат DMAtrix. К счастью, xgboost имеет собственную функцию перекрестной проверки, подробности которой вы можете найти здесь: https://xgboost.readthedocs.io/en/latest/python/python_api.html

...