我正在尝试使用“ map”指标激活lightgbm(我将在本文末尾解释为什么这样做),并使用以下参数dict(使用sklearn API):
param = {
'objective': 'binary',
'num_threads': 40,
'metric': 'map',
'eval_at': 300,
'feature_fraction': 1.0,
'bagging_fraction': 1.0,
'min_data_in_leaf': 50,
'max_depth': -1,
'subsample_for_bin': 200000,
'subsample': 1.0,
'subsample_freq': 0,
'min_split_gain': 0.0,
'min_child_weight': 0.001,
'min_child_samples': 20,
'n_estimators': 9999
}
但出现以下错误:
> [LightGBM] [Fatal] For MAP metric, there should be query information
> Traceback (most recent call last): File
> "/home/danri/anaconda3/lib/python3.6/site-packages/IPython/core/interactiveshell.py",
> line 2910, in run_code
> exec(code_obj, self.user_global_ns, self.user_ns) File "<ipython-input-76-81403c753a65>", line 44, in <module>
> eval_metric=param_1['metric']) File "/home/danri/anaconda3/lib/python3.6/site-packages/lightgbm/sklearn.py",
> line 539, in fit
> callbacks=callbacks) File "/home/danri/anaconda3/lib/python3.6/site-packages/lightgbm/sklearn.py",
> line 391, in fit
> callbacks=callbacks) File "/home/danri/anaconda3/lib/python3.6/site-packages/lightgbm/engine.py",
> line 168, in train
> booster = Booster(params=params, train_set=train_set) File "/home/danri/anaconda3/lib/python3.6/site-packages/lightgbm/basic.py",
> line 1215, in __init__
> ctypes.byref(self.handle))) File "/home/danri/anaconda3/lib/python3.6/site-packages/lightgbm/basic.py",
> line 47, in _safe_call
> raise LightGBMError(_LIB.LGBM_GetLastError()) lightgbm.basic.LightGBMError: b'For MAP metric, there should be query
> information'
我为查询信息概念找到的唯一解释是在lightgbm parameters docs
中这是解释:
查询数据
对于LambdaRank学习,它需要查询信息以获取训练数据。 LightGBM使用其他文件来存储查询数据。以下是一个 例如:
27 18 67 ...
这意味着前27行样本属于一个查询,而后18行属于 属于另一个,依此类推。(注意:数据应按查询顺序排序) 数据文件的名称为“ train.txt”,查询文件应命名为 “ train.txt.query”,并且位于培训数据的同一文件夹中。 LightGBM将 自动加载查询文件(如果存在)。
您现在可以在数据文件中指定特定的查询/组ID。请参阅 上面的参数组。
我也研究了lightgbm代码以找到它的用途,但仍然不了解查询信息的概念。有人可以解释吗?
我尝试使用“地图”指标的原因是,我的分类模型的目的是在最高的10%风险中达到最高的PPV。当我通过“ auc”进行优化时,排名的任何改善(最高风险十分位数或样本数据集的其他部分)都会改善AUC。我希望该模型仅在提高前10%的PPV时进行优化,因为这将是其实际用途(即,将前10%的高风险人群送去接受某种医疗)。
希望得到任何帮助。
谢谢!
答案 0 :(得分:0)
有几件事:
.current_page_item,
.current-menu-ancestor {
background-color:#ff0000;
}
方法的eval_group
参数提供组,请参见here。这是一个数组列表。列表的长度与fit
相同,并且各个数组包含每个组中元素的数量。因此,数组中的整数之和应算出相应评估集中的样本数。请注意,为了使该分组突出显示起作用,代码假定分组按顺序出现。例如,eval_set
表示度量标准评估将期望具有长度为5(= 2 + 3)的评估样本,并且前2个元素应属于一个组,而第3个元素则属于另一组。 答案 1 :(得分:0)
您是否考虑过使用其他指标? 据我对您的问题的了解,第一分位数的lift可能是一个很好的评估指标。它比较了您的模型在n%最高概率中发现随机风险的“风险人物”的能力。
简而言之,您将按概率排序的样本的最高十分位数(如模型所预测的那样,这些人是“风险最高的人”),计算其中的实际“ 1”数,然后将其除以数随机预测给出的实际“ 1”。
这是在lightgbm中实现它的方法。您需要将其作为“ f_eval”参数。它不会用于优化,仅用于评估(以及提前停止)。此代码无法处理相等的预测。
auto