Я пытаюсь запустить случайный поиск, используя функцию CV случайного поиска sklearn, чтобы выбрать гиперпараметры для XGBoost для задачи регрессии. Вот мой код:
#search space
params_xgboost = {
"learning_rate" : [0.05, 0.10, 0.15, 0.20, 0.25, 0.30],
"max_depth" : [ 3, 4, 5, 6, 8, 10, 12, 15],
"min_child_weight" : [ 1, 3, 5, 7 ],
"gamma" : [ 0.0, 0.1, 0.2 , 0.3, 0.4 ],
"colsample_bytree" : [ 0.3, 0.4, 0.5 , 0.7],
'n_estimators' : [5, 10, 15, 20, 25, 30, 35],
'objective': 'reg:squarederror'
}
model = XGBRegressor()
random_search = RandomizedSearchCV(estimator = model,
param_distributions = params_xgboost,
n_iter = 100,
cv = 5,
verbose=1,
random_state=42,
scoring = 'neg_mean_squared_error',
n_jobs = -1)
#params glare proba
random_search.fit(X_transform, Y['dgp'])
Я действительно изо всех сил пытаюсь понять, почему я получаю следующую ошибку
Unknown objective function: `u`
XGBoostError: [16:46:53] /Users/runner/miniforge3/conda-bld/xgboost_1607604592557/work/src/objective/objective.cc:26: Unknown objective function: `u`
Objective candidate: survival:aft
Objective candidate: binary:hinge
Objective candidate: multi:softmax
Objective candidate: multi:softprob
Objective candidate: rank:pairwise
Objective candidate: rank:ndcg
Objective candidate: rank:map
Objective candidate: reg:squarederror
Objective candidate: reg:squaredlogerror
Objective candidate: reg:logistic
Objective candidate: reg:pseudohubererror
Objective candidate: binary:logistic
Objective candidate: binary:logitraw
Objective candidate: reg:linear
Objective candidate: count:poisson
Objective candidate: survival:cox
Objective candidate: reg:gamma
Objective candidate: reg:tweedie
Stack trace:
[bt] (0) 1 libxgboost.dylib 0x00000001210ad23e dmlc::LogMessageFatal::~LogMessageFatal() + 110
[bt] (1) 2 libxgboost.dylib 0x00000001211a4bd7 xgboost::ObjFunction::Create(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, xgboost::GenericParameter const*) + 759
[bt] (2) 3 libxgboost.dylib 0x0000000121168d06 xgboost::LearnerConfiguration::ConfigureObjective(xgboost::LearnerTrainParam const&, std::__1::vector<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > >*) + 1926
[bt] (3) 4 libxgboost.dylib 0x000000012115de1f xgboost::LearnerConfiguration::Configure() + 1247
[bt] (4) 5 libxgboost.dylib 0x000000012115e2e7 xgboost::LearnerImpl::UpdateOneIter(int, std::__1::shared_ptr<xgboost::DMatrix>) + 119
[bt] (5) 6 libxgboost.dylib 0x00000001210b1e5c XGBoosterUpdateOneIter + 156
[bt] (6) 7 libffi.7.dylib 0x0000000107c40ead ffi_call_unix64 + 85
[bt] (7) 8 ??? 0x00007ffee8691a00 0x0 + 140732797622784
Я запустил тот же код в отдельной задаче классификации, и он отлично работал с целью multi:softmax
, поэтому я не уверен, почему в приведенном выше случае я получаю эту ошибку.
objective='reg:squarederror'
используется по умолчанию, поэтому его можно смело опускать:
XGBRegressor?
Init signature: XGBRegressor(objective='reg:squarederror', **kwargs)
Docstring:
Implementation of the scikit-learn API for XGBoost regression.
Если вы хотите указать это явно, вы всегда можете сделать:
XGBRegressor(objective='reg:squarederror'...)
Обратите также внимание на примечание о **kwargs
для sklearn API (документы):
** kwargs не поддерживается scikit-learn. Мы не гарантируем, что параметры, переданные через этот аргумент, будут корректно взаимодействовать с scikit-learn.
Я согласен с @SergeyBushmanov, но чтобы уточнить ошибку здесь: вы не дали список целей, а только строку 'reg:squarederror'
. Но поскольку строки в python являются итерируемыми, случайный поиск рассматривает это как 16 целей, которые нужно попробовать: 'r'
, 'e'
, 'g'
и т. д. (и первая попытка — это 'u'
, как жалуется ваша ошибка). Добавление скобок списка вокруг него должно работать; но опять же, для вещей, которые вы на самом деле не заинтересованы в поиске, просто укажите их в оценщике, как в ответе @Sergey.