如何解决在R中的lightgbm模型中提取变量名称
我在 R 中有多个 lightgbm 模型,我想验证和提取拟合期间使用的变量名称。使用 LastRow = ws.max_row
tab = Table(displayName="Table10",ref="A1:CU198",totalsRowShown=True)
style = TableStyleInfo(name="TableStyleMedium9",showFirstColumn=False,showLastColumn=False,showRowStripes=False,showColumnStripes=True)
tblcolmn = TableColumn(id=1,name='TableTotals',totalsRowFunction='sum',totalsRowLabel='Totals')
tab.TableColumn = tblcolmn
tab.tableStyleInfo = style
ws.add_table(tab)
这真的很简单,但我可以设法使用 lightgbm 模型找到方法(如果可能,请参阅 here)。
这里有一个可重现的例子,让一切更清晰:
我使用了 lightgbm 包中的数据:
glm
我首先运行基本的lgbm模型:
library(lightgbm)
data(agaricus.train,package = "lightgbm")
现在,我可以为 # formating the data
dtrain <- lgb.Dataset(train$data,label = train$label)
data(agaricus.test,package = "lightgbm")
test <- agaricus.test
dtest <- lgb.Dataset.create.valid(dtrain,test$data,label = test$label)
params <- list(objective = "regression",metric = "l2")
valids <- list(test = dtest)
# running the model
model_lgbm <- lgb.train(
params = params,data = dtrain,nrounds = 10L,valids = valids,min_data = 1L,learning_rate = 1.0,early_stopping_rounds = 5L
)
做同样的事情:
glm
从 ## preparing the data
dd <- data.frame(label = train$label,as(train$data,"matrix")[,1:10])
## making the model
model_glm <- glm(label ~ .,data=dd,family="binomial")
中,有很多方法可以快速找到用于建模的变量,例如最明显的一种:
glm
lightgbm 中没有实现这个功能:
variable.names(model_glm)
[1] "(Intercept)" "cap.shape.bell" "cap.shape.conical" "cap.shape.convex"
[5] "cap.shape.flat" "cap.shape.knobbed" "cap.shape.sunken" "cap.surface.fibrous"
[9] "cap.surface.grooves" "cap.surface.scaly"
尝试使用 variable.names(model_lgbm)
NULL
进入模型对象没有帮助:
str
我设法访问使用的变量名称的唯一方法是从 str(model_lgbm)
Classes 'lgb.Booster','R6' <lgb.Booster>
Public:
add_valid: function (data,name)
best_iter: 3
best_score: 0
current_iter: function ()
dump_model: function (num_iteration = NULL,feature_importance_type = 0L)
eval: function (data,name,feval = NULL)
eval_train: function (feval = NULL)
eval_valid: function (feval = NULL)
finalize: function ()
initialize: function (params = list(),train_set = NULL,modelfile = NULL,lower_bound: function ()
predict: function (data,start_iteration = NULL,num_iteration = NULL,raw: NA
record_evals: list
reset_parameter: function (params,...)
rollback_one_iter: function ()
save: function ()
save_model: function (filename,feature_importance_type = 0L)
save_model_to_string: function (num_iteration = NULL,feature_importance_type = 0L)
set_train_data_name: function (name)
to_predictor: function ()
update: function (train_set = NULL,fobj = NULL)
upper_bound: function ()
Private:
eval_names: l2
get_eval_info: function ()
handle: 8.19470876878865e-316
higher_better_inner_eval: FALSE
init_predictor: NULL
inner_eval: function (data_name,data_idx,feval = NULL)
inner_predict: function (idx)
is_predicted_cur_iter: list
name_train_set: training
name_valid_sets: list
num_class: 1
num_dataset: 2
predict_buffer: list
set_objective_to_none: FALSE
train_set: lgb.Dataset,R6
train_set_version: 1
valid_sets: list
函数,但它不太理想,因为计算变量重要性对于大型模型来说可能很慢,我什至不确定它是否报告了所有变量:
lgb.importance
有没有办法只访问 lightgbm 模型中使用的变量名称?谢谢。
解决方法
“我什至不确定它是否报告了所有变量”的评论让我对您在说“拟合期间使用的变量名称”时所要求的内容感到有些困惑,所以我已经回答了这两种解释在这里。
两个答案都假设您的可重现示例的版本略小。
library(lightgbm)
data(agaricus.train,package = "lightgbm")
# formating the data
dtrain <- lgb.Dataset(
agaricus.train$data,label = agaricus.train$label
)
data(agaricus.test,package = "lightgbm")
params <- list(
objective = "regression",metric = "l2"
)
# running the model
model_lgbm <- lgb.train(
params = params,data = dtrain,nrounds = 10L,min_data = 1L,learning_rate = 1.0
)
输入数据集的特征名称
如果您想知道传递给 LightGBM 的输入数据集中所有特征的名称,无论是否选择所有这些列进行拆分,您都可以检查转储模型。
parsed_model <- jsonlite::fromJSON(
model_lgbm$dump_model()
)
parsed_model$feature_names
[1] "cap-shape=bell"
[2] "cap-shape=conical"
[3] "cap-shape=convex"
[4] "cap-shape=flat"
[5] "cap-shape=knobbed"
[6] "cap-shape=sunken"
[7] "cap-surface=fibrous"
[8] "cap-surface=grooves"
[9] "cap-surface=scaly"
[10] "cap-surface=smooth"
为拆分选择的功能
如果您想知道 LightGBM 选择的拆分中实际使用了哪些特征,您可以使用 lgb.model.dt.tree()
或您上面给出的特征重要性示例。
modelDT <- lgb.model.dt.tree(model_lgbm)
modelDT$split_feature
lgb.model.dt.tree()
返回已训练模型的 data.table
表示。表中的一行对应于拆分的一侧或一个叶节点。引用叶节点的行有 NA
表示 $split_feature
。
如果您有更轻松的建议,欢迎在 https://github.com/microsoft/LightGBM 上提出 PR 和问题。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。