Ниже приведены API-интерфейсы .cv LightGBM.
Lightgbm.cv(params, train_set, num_boost_round=100,folds=None, nfold=5, stratified=True, shuffle=True, metrics=None, feval=None, init_model=None, Feature_name='auto', categorical_feature='auto ', fpreproc=None,seed=0, обратные вызовы=None, eval_train_metric=False, return_cvbooster=False)
Есть параметр cateogrical_feature
Категориальные особенности. Если список целых чисел, интерпретируется как индексы. Если список строк, интерпретируется как имена функций (необходимо также указать имя_функции).
Теперь API .train
Lightgbm.train(params, train_set, num_boost_round=100, valid_sets=None, valid_names=None, feval=None, init_model=None, Feature_name='auto', categorical_feature='auto', Keep_training_booster=False, обратные вызовы=None)
Здесь также есть параметр categorical_feature
. Документация для этого такая же, как указано выше.
Теперь, как вы заметили, оба API используют набор данных lightgbm , который сам принимает параметр categorical_feature
. Документация точно такая же
Вопросы:
Эти конкурирующие шаблоны в lightgbm.cv()
в пакете lightgbm
находятся в библиотеке с сентября 2017 года (этот коммит). Возможность указать это в обоих интерфейсах добавлена в основном для удобства. Функционально это не отличается от передачи этих аргументов в lightgbm.Dataset()
.
Если указаны оба, какой из них имеет приоритет?
В каком месте рекомендуется указать categorical_feature?
Отличаются ли эти два варианта каким-либо образом от работы конвейера LightGBM?
Всегда предпочитайте передавать его lightgbm.Dataset
и игнорируйте аргумент lightgbm.cv()
/lightgbm.train()
.
Аргумент categorical_feature
, передаваемый в lightgbm.cv()
/lightgbm.train()
, используется только в одном месте, при вызове Dataset.set_categorical_feature()
внутри функции lightgbm.cv()
/lightgbm.train()
. В лучшем случае это будет бесполезно и не обновит Dataset
.
В худшем случае это может вызвать ошибку, если необработанные данные больше не доступны.
import lightgbm as lgb
from sklearn.datasets import make_regression
X, y = make_regression(n_samples=1_000, n_features=10)
dtrain = lgb.Dataset(
X,
label=y,
categorical_feature=[1, 4],
free_raw_data=True
)
dtrain.construct()
bst = lgb.train(
params = {"objective": "regression"},
train_set=dtrain,
categorical_feature=[1, 3]
)
# lightgbm.basic.LightGBMError: Cannot set categorical feature after freed raw data,
# set free_raw_data=False when construct Dataset to avoid this.
В каком месте рекомендуется указать categorical_feature?
Я ответил ниже, но также хочу сказать... спасибо! Благодаря вашему сообщению это запутанное дублирование может быть удалено в будущей версии LightGBM: github.com/microsoft/LightGBM/issues/6435