lightgbm的查询信息概念是什么(针对地图指标)?

时间:2018-11-01 15:11:54

标签: python optimization classification metrics lightgbm

我正在尝试使用“ 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%的高风险人群送去接受某种医疗)。

希望得到任何帮助。

谢谢!

2 个答案:

答案 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