在 lightgbm 中,为什么当数据集构造中已经存在 categorical_feature 参数时,train 和 cv API 还要接受它

问题描述 投票:0回答:1

以下是lightgbm的.cv API

lightgbm.cv(参数,train_set,num_boost_round=100,folds=None,nfold=5,分层=True,shuffle=True,metrics=None,feval=None,init_model=None,feature_name='auto',categorical_feature='自动',fpreproc =无,种子= 0,回调=无,eval_train_metric = False,return_cvbooster = False)

有一个参数

cateogrical_feature

分类特征。如果是 int 列表,则解释为索引。如果是 str 列表,则解释为功能名称(还需要指定 feature_name)。

现在是 .train API

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,callbacks=None)

这里还有一个

categorical_feature
参数。这方面的文档与上面相同

现在,您会注意到这两个 API 都使用 lightgbm 数据集,它本身需要一个

categorical_feature
参数。文档完全一样

问题:

  1. 如果两者都指定,哪一个优先?
  2. 建议在哪一个位置指定 categorical_feature?
  3. 这两种选择在 lightgbm 管道的工作内部有什么不同吗?
machine-learning lightgbm
1个回答
0
投票

lightgbm.cv()
包中的
lightgbm
中的这些竞争模式自 2017 年 9 月以来一直在库中(此提交)。在两个接口中添加指定功能主要是为了方便。它在功能上与将这些参数传递给
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?

© www.soinside.com 2019 - 2024. All rights reserved.