lightgbm自定义eval_metric报错 no attribute'get_label'

在lightgbmClassifier 用eval_metric自定义了一个f1的评估指标,有报错,但是在原生的lgb编辑feval没有该报错,想了解下该如何纠正

报错内容是'numpy.ndarray' object has no attribute 'get_label'



```python
def my_f1_score(preds, train_data):
    labels = train_data.get_label()
    preds=[round(value) for value in preds]
    f_score = f1_score(labels,preds)
    return 'my_f1_score', f_score, True





引用 皆我百晓生 小程序回复内容作答:
出现这个错误是因为在自定义评估指标中,train_data 参数被认为是一个 numpy.ndarray 对象而不是一个 lightgbm.Dataset 对象,而 numpy.ndarray 没有 get_label() 方法。

为了解决这个问题,你可以修改自定义评估函数,以接收标签作为额外的参数,而不是从 train_data 中获取标签。

def my_f1_score(preds, train_data, labels):
    preds=[round(value) for value in preds]
    f_score = f1_score(labels,preds)
    return 'my_f1_score', f_score, True

然后,在训练模型时,将标签作为额外的参数传递给 eval_set 参数中的验证集数据。

lgbm = LGBMClassifier(...)
labels = ... # 标签数据
lgbm.fit(X_train, y_train, ..., eval_set=[(X_val, y_val)], eval_metric=my_f1_score(labels))

这样,你就可以在自定义的评估函数中正确地计算 F1 分数,而不再有该错误。

【以下回答由 GPT 生成】

解决 lightgbm 自定义 eval_metric 报错 'numpy.ndarray' object has no attribute 'get_label'

问题的核心是自定义评估指标时出现了 'numpy.ndarray' object has no attribute 'get_label' 错误。这个错误是因为我们无法直接在 numpy 数组上调用 get_label() 方法。为了解决这个问题,我们需要更改代码以正确处理数据。

首先,我们需要理解 train_data 在 lightgbm 中的数据类型。train_data 是 lgb.Dataset 类型的对象,它包含了训练数据和标签。我们可以从 lgb.Dataset 对象中获取训练数据和标签,然后再传递给自定义的评估函数。

下面是修改后的代码,以解决报错问题:

import numpy as np
import lightgbm as lgb
from sklearn.metrics import f1_score

def my_f1_score(preds, train_data):
    labels = train_data.get_label()
    preds = np.round(preds)
    f_score = f1_score(labels, preds)
    return 'my_f1_score', f_score, True

解决该问题的主要改进点是使用 np.round() 替代原来的 round() 函数来获取整数预测值。此外,还需要确保正确导入了 numpylightgbm 库,并且从 sklearn.metrics 中导入了 f1_score 函数。

通过这些修改,您应该可以成功定义和使用自定义的 f1_score 评估函数,并避免 'numpy.ndarray' object has no attribute 'get_label' 错误。

如果您还遇到其他问题,请告诉我,我会尽力提供帮助!


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^