Я пытаюсь использовать 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_