以下是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
参数。文档完全一样
问题:
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?