当前位置: 首页 > 面试题库 >

lightgbm中的f1_score指标

应涵容
2023-03-14
问题内容

我想培养与定制度量的LGB模式:f1_scoreweighted平均水平。

我在这里遍历了lightgbm的高级示例,并发现了自定义二进制错误函数的实现。我实现了类似的功能来返回f1_score,如下所示。

def f1_metric(preds, train_data):

    labels = train_data.get_label()

    return 'f1', f1_score(labels, preds, average='weighted'), True

我试图通过传递feval参数来训练模型,f1_metric如下所示。

evals_results = {}

bst = lgb.train(params, 
                     dtrain, 
                     valid_sets= [dvalid], 
                     valid_names=['valid'], 
                     evals_result=evals_results, 
                     num_boost_round=num_boost_round,
                     early_stopping_rounds=early_stopping_rounds,
                     verbose_eval=25, 
                     feval=f1_metric)

然后我得到 ValueError: Found input variables with inconsistent numbers of samples:

训练集将传递给函数,而不是验证集。

如何配置以便通过验证集并返回f1_score。


问题答案:

该文档有点混乱。在描述传递给feval的函数的签名时,他们将其参数 称为predstrain_data ,这有点误导。

但是以下似乎有效:

from sklearn.metrics import f1_score

def lgb_f1_score(y_hat, data):
    y_true = data.get_label()
    y_hat = np.round(y_hat) # scikits f1 doesn't like probabilities
    return 'f1', f1_score(y_true, y_hat), True

evals_result = {}

clf = lgb.train(param, train_data, valid_sets=[val_data, train_data], valid_names=['val', 'train'], feval=lgb_f1_score, evals_result=evals_result)

lgb.plot_metric(evals_result, metric='f1')

要使用多个自定义指标,请像上面定义一个整体自定义指标函数,在其中您可以计算所有指标并返回一个元组列表。

编辑:固定代码,当然F1越大越好,应将其设置为True。



 类似资料:
  • LightGBM(Light Gradient Boosting Machine) 是微软开源的一个实现 GBDT 算法的框架,支持高效率的并行训练。 GBDT (Gradient Boosting Decision Tree) 是机器学习中一个长盛不衰的模型,其主要思想是利用弱分类器(决策树)迭代训练以得到最优模型,该模型具有训练效果好、不易过拟合等优点。GBDT 在工业界应用广泛,通常被用于点

  • 本文向大家介绍lightgbm优势相关面试题,主要包含被问及lightgbm优势时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 1)更快的训练速度和更高的效率:LightGBM使用基于直方图的算法。2)更低的内存占用:使用离散的箱子(bins)保存并替换连续值导致更少的内存占用。3)更高的准确率(相比于其他任何提升算法):它通过leaf-wise分裂方法产生比level-wise分裂方法更

  • 本文向大家介绍xgboost和lightgbm的区别和适用场景?相关面试题,主要包含被问及xgboost和lightgbm的区别和适用场景?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: (1)xgboost采用的是level-wise的分裂策略,而lightGBM采用了leaf-wise的策略,区别是xgboost对每一层所有节点做无差别分裂,可能有些节点的增益非常小,对结果影响不大,但

  • 问题内容: 我是Java菜鸟。我已经掌握了将C / C ++指针转换为Java引用的概念,并且进展相当顺利。 我打了一段有指针的代码(即* ptr)。我需要取消引用指针并更改其指向的指针的值(即 ptr =&newthing;) 在Java中这似乎要困难得多。是否有人对如何解决此问题有任何想法?快速谷歌搜索什么都没有。 这是C ++中的代码示例。我想在Java中获得类似的工作,但是ptr_to_p

  • 我们使用Jersey和web创建了多个APIendpoint。xml设置而不是资源配置设置。我们希望捕获并显示每个endpoint的所有请求的度量,包括所有不同的响应代码。到目前为止,我已经创建了一个类,它扩展了InstrumentedFilterContextListener,并在其中包含了Graphite reporter。 在web.xml中,我添加了以下块来使报告工作: 因此,通过上述配置

  • C++ 类 & 对象 一个指向 C++ 类的指针与指向结构的指针类似,访问指向类的指针的成员,需要使用成员访问运算符 ->,就像访问指向结构的指针一样。与所有的指针一样,您必须在使用指针之前,对指针进行初始化。 下面的实例有助于更好地理解指向类的指针的概念: #include <iostream> using namespace std; class Box { public:

  • 问题内容: 我们可以传递不可变的变量引用作为函数中的参数吗? 例: 问题答案: 由于JavaScript不支持通过引用传递参数,因此您需要将变量设置为对象: 在这种情况下,是对对象的引用。当传递给函数时,该引用将复制到。因此,与内存中的引用相同。改变财产的性质影响财产的性质。 Javascript将始终按值传递函数参数。那只是语言的规范。您 可以在两个函数都本地的作用域中创建,而根本不传递变量。

  • 问题内容: C ++支持指针,而Java不支持指针。但是,当许多程序员质疑您如何在没有指针的情况下工作时,启动器开始说“受限指针”。所以我们可以说Java支持受限指针吗? 问题答案: 这里的术语很模糊。 Java支持所谓的“引用”。引用的行为 非常 类似于类似C / C ++的语言中的指针。他们 不会 采取同样的方式“引用”,在这些语言的工作。 C语言中的指针与Java语言中的引用之间的 主要 区