基于 F1 的自定义评估函数,用于 xgboost - Python API

2024-02-21

我编写了以下自定义评估函数与 xgboost 一起使用,以优化 F1。不幸的是,当使用 xgboost 运行时它会返回异常。

评价函数如下:

def F1_eval(preds, labels):

    t = np.arange(0, 1, 0.005)
    f = np.repeat(0, 200)
    Results = np.vstack([t, f]).T

    P = sum(labels == 1)

    for i in range(200):
        m = (preds >= Results[i, 0])
        TP = sum(labels[m] == 1)
        FP = sum(labels[m] == 0)

        if (FP + TP) > 0:
            Precision = TP/(FP + TP)

        Recall = TP/P

        if (Precision + Recall >0) :
            F1 = 2 * Precision * Recall / (Precision + Recall)                
        else:                
            F1 = 0

        Results[i, 1] = F1

    return(max(Results[:, 1]))

下面我提供了一个可重现的示例以及错误消息:

    from sklearn import datasets

    Wine = datasets.load_wine()

    X_wine = Wine.data
    y_wine = Wine.target

    y_wine[y_wine == 2] = 1

    X_wine_train, X_wine_test, y_wine_train, y_wine_test = train_test_split(X_wine, y_wine, test_size = 0.2)

    clf_wine = xgb.XGBClassifier(max_depth=6, learning_rate=0.1,silent=False, objective='binary:logistic', \
                      booster='gbtree', n_jobs=8, nthread=None, gamma=0, min_child_weight=1, max_delta_step=0, \
                      subsample=0.8, colsample_bytree=0.8, colsample_bylevel=1, reg_alpha=0, reg_lambda=1)

    clf_wine.fit(X_wine_train, y_wine_train,\
    eval_set=[(X_wine_train, y_wine_train), (X_wine_test, y_wine_test)], eval_metric=F1_eval, early_stopping_rounds=10, verbose=True)

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-453-452852658dd8> in <module>()
     12 clf_wine = xgb.XGBClassifier(max_depth=6, learning_rate=0.1,silent=False, objective='binary:logistic',                   booster='gbtree', n_jobs=8, nthread=None, gamma=0, min_child_weight=1, max_delta_step=0,                   subsample=0.8, colsample_bytree=0.8, colsample_bylevel=1, reg_alpha=0, reg_lambda=1)
     13 
---> 14 clf_wine.fit(X_wine_train, y_wine_train,eval_set=[(X_wine_train, y_wine_train), (X_wine_test, y_wine_test)], eval_metric=F1_eval, early_stopping_rounds=10, verbose=True)
     15 

C:\ProgramData\Anaconda3\lib\site-packages\xgboost\sklearn.py in fit(self, X, y, sample_weight, eval_set, eval_metric, early_stopping_rounds, verbose, xgb_model, sample_weight_eval_set)
    519                               early_stopping_rounds=early_stopping_rounds,
    520                               evals_result=evals_result, obj=obj, feval=feval,
--> 521                               verbose_eval=verbose, xgb_model=None)
    522 
    523         self.objective = xgb_options["objective"]

C:\ProgramData\Anaconda3\lib\site-packages\xgboost\training.py in train(params, dtrain, num_boost_round, evals, obj, feval, maximize, early_stopping_rounds, evals_result, verbose_eval, xgb_model, callbacks, learning_rates)
    202                            evals=evals,
    203                            obj=obj, feval=feval,
--> 204                            xgb_model=xgb_model, callbacks=callbacks)
    205 
    206 

C:\ProgramData\Anaconda3\lib\site-packages\xgboost\training.py in _train_internal(params, dtrain, num_boost_round, evals, obj, feval, xgb_model, callbacks)
     82         # check evaluation result.
     83         if len(evals) != 0:
---> 84             bst_eval_set = bst.eval_set(evals, i, feval)
     85             if isinstance(bst_eval_set, STRING_TYPES):
     86                 msg = bst_eval_set

C:\ProgramData\Anaconda3\lib\site-packages\xgboost\core.py in eval_set(self, evals, iteration, feval)
    957         if feval is not None:
    958             for dmat, evname in evals:
--> 959                 feval_ret = feval(self.predict(dmat), dmat)
    960                 if isinstance(feval_ret, list):
    961                     for name, val in feval_ret:

<ipython-input-383-dfb8d5181b18> in F1_eval(preds, labels)
     11 
     12 
---> 13         P = sum(labels == 1)
     14 
     15 

TypeError: 'bool' object is not iterable

我不明白为什么该功能不起作用。我遵循了这里的例子:https://github.com/dmlc/xgboost/blob/master/demo/guide-python/custom_objective.py https://github.com/dmlc/xgboost/blob/master/demo/guide-python/custom_objective.py

我想了解我错在哪里。


做的时候sum(labels == 1), Python 将 labels == 1 计算为Boolean对象,因此你得到TypeError: 'bool' object is not iterable

功能sum期待一个可迭代的对象,比如列表。这是您的错误的示例:

In[32]: sum(True)
Traceback (most recent call last):
  File "C:\ProgramData\Anaconda3\lib\site-packages\IPython\core\interactiveshell.py", line 2963, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-32-6eb8f80b7f2e>", line 1, in <module>
    sum(True)
TypeError: 'bool' object is not iterable

如果你想使用 scikit-learn 的 f1_score ,你可以实现以下总结:

from sklearn.metrics import f1_score
import numpy as np

def f1_eval(y_pred, dtrain):
    y_true = dtrain.get_label()
    err = 1-f1_score(y_true, np.round(y_pred))
    return 'f1_err', err

总结的参数是list(预测)和DMatrix,它返回一个字符串,float

# Setting your classifier
clf_wine = xgb.XGBClassifier(max_depth=6, learning_rate=0.1,silent=False, objective='binary:logistic', \
                      booster='gbtree', n_jobs=8, nthread=None, gamma=0, min_child_weight=1, max_delta_step=0, \
                      subsample=0.8, colsample_bytree=0.8, colsample_bylevel=1, reg_alpha=0, reg_lambda=1)

# When you fit, add eval_metric=f1_eval
# Please don't forget to insert all the .fit arguments required
clf_wine.fit(eval_metric=f1_eval)

Here https://github.com/dmlc/xgboost/blob/master/demo/guide-python/custom_objective.py您可以查看如何实现自定义目标函数和自定义评估指标的示例

包含以下代码的示例:

# user defined evaluation function, return a pair metric_name, result
# NOTE: when you do customized loss function, the default prediction value is margin
# this may make builtin evaluation metric not function properly
# for example, we are doing logistic loss, the prediction is score before logistic transformation
# the builtin evaluation error assumes input is after logistic transformation
# Take this in mind when you use the customization, and maybe you need write customized evaluation function
def evalerror(preds, dtrain):
    labels = dtrain.get_label()
    # return a pair metric_name, result
    # since preds are margin(before logistic transformation, cutoff at 0)
    return 'error', float(sum(labels != (preds > 0.0))) / len(labels)

指定评估函数作为参数 (predictions, dtrain) dtrain 的类型DMatrix并返回一个字符串,float,它是指标和错误的名称。


添加工作 python 代码示例

import numpy as np

def _F1_eval(preds, labels):
    t = np.arange(0, 1, 0.005)
    f = np.repeat(0, 200)
    results = np.vstack([t, f]).T
    # assuming labels only containing 0's and 1's
    n_pos_examples = sum(labels)
    if n_pos_examples == 0:
        raise ValueError("labels not containing positive examples")

    for i in range(200):
        pred_indexes = (preds >= results[i, 0])
        TP = sum(labels[pred_indexes])
        FP = len(labels[pred_indexes]) - TP
        precision = 0
        recall = TP / n_pos_examples

        if (FP + TP) > 0:
            precision = TP / (FP + TP)

        if (precision + recall > 0):
            F1 = 2 * precision * recall / (precision + recall)
        else:
            F1 = 0
        results[i, 1] = F1
    return (max(results[:, 1]))

if __name__ == '__main__':
    labels = np.random.binomial(1, 0.75, 100)
    preds = np.random.random_sample(100)
    print(_F1_eval(preds, labels))

如果您想实现 _F1_eval 专门用于 xgboost 评估方法,请添加以下内容:

def F1_eval(preds, dtrain):
    res = _F1_eval(preds, dtrain.get_label())
    return 'f1_err', 1-res
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于 F1 的自定义评估函数,用于 xgboost - Python API 的相关文章

  • 安装 geopandas 的问题

    我正在尝试在我的笔记本电脑 Windows 10 版本 1709 机器 上安装 geopandas 执行 pip install geopandas 命令后 我收到以下消息 command python setup py egg info
  • 语音识别产生 OSError:没有可用的默认输入设备

    This import speech recognition as sr r sr Recognizer with sr Microphone as source print Speak Anything audio r listen so
  • 多个异步调用阻塞

    My code import asyncio async def test i await asyncio sleep i print test async def main await test 2 await test 2 await
  • xgboost.plot_tree:二元特征解释

    我构建了一个 XGBoost 模型并试图检查各个估计器 作为参考 这是一个具有离散和连续输入特征的二元分类任务 输入特征矩阵是scipy sparse csr matrix 然而 当我去检查单个估计器时 我发现很难解释二进制输入特征 例如f
  • OS X 上的 ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] 证书验证失败 (_ssl.c:747)

    我正在尝试这段代码 import pandas as pd fiddy states pd read html https simple wikipedia org wiki List of U S states print fiddy s
  • xgboost中的访问训练和评估错误

    我开始使用Pythonxgboost后勤 有没有办法在每个训练时期获得训练和验证错误 我在其中找不到一个文档 https xgboost readthedocs org en latest python index html content
  • Python 拖放损坏

    我最近安装了pywin 我必须更改注册表项才能做到这一点 但我又把它改回来了 我还卸载了 Python 2 7 从那时起 我无法再将文件拖放到我的 python 脚本中 我还丢失了文件关联 我已经卸载 重新安装 在注册表上运行 CClean
  • 从 werkzeug 导入安全导入 werkzeug VS

    我目前的理解 基于这些答案 one https stackoverflow com questions 9439480 from import vs import two https stackoverflow com questions
  • Keras model.predict() 在第一次迭代时较慢,然后变得更快

    我正在尝试跑步model predict 在 for 循环中多次并计时在同一图像上花费的时间 该数据将用于计算运行预测所需时间的平均值 如果我在单独的脚本中运行预测 它将在我的 MacBook 上运行大约 300 毫秒 如果我随后在 for
  • 如何实施xgboost增量训练?

    问题是由于列车数据大小 我的列车数据无法放入 RAM 中 所以我需要一种方法 首先在整个训练数据集上构建一棵树 计算残差构建另一棵树等等 就像梯度提升树一样 显然如果我打电话model xgb train param batch dtrai
  • 如何去掉tableview底部的空白区域

    QTableWidget 的 tableview 底部总是有一个平淡的区域 如何去掉这个空白区域 让tableview只根据给定的数据显示行和列 你必须设置Stretch作为 resizeMode 到verticalheader impor
  • 将文本输入保存到 kivy 应用程序中的变量

    我正在制作一个基于文本的游戏 游戏有时会要求用户输入他们的姓氏 我已经找到了一种将名称保存到文件并从文件加载名称的方法 但我不知道如何保存已输入变量的文本 我尝试过网上看到的各种方法 但到目前为止没有一个对我有用 我的代码部分目前看起来像这
  • 将 Python 枚举编码为 JSON

    我有一本字典 其中一些键是 Enum 实例 enum Enum 的子类 我正在尝试使用自定义 JSON 编码器类将字典编码为 JSON 字符串 如下所示文档 https docs python org 3 library json html
  • 如何推迟/推迟 f 字符串的评估?

    我正在使用模板字符串生成一些文件 并且我喜欢为此目的而使用的新 f 字符串的简洁性 以减少我以前的模板代码 如下所示 template a The current name is name names foo bar for name in
  • 如何在Python中的多类分类问题上获取每个类的SHAP值

    我有以下数据框 import pandas as pd import random import xgboost import shap foo pd DataFrame id 1 2 3 4 5 6 7 8 9 10 var1 rando
  • 如何在Python 3.6中安装pymssql模块?

    我已经阅读了一些涉及 FreeTDS Wheel git 和 github 的文档 但在我的带有 Python 3 6 的 Windows 10 PC 上没有任何功能 但我需要安装它 我正在开发一个项目 我对已经安装在我的电脑中的 mssq
  • 比较 2 个 csv 文件之间的列并使用 Python 写入差异

    我试图通过比较 2 个 csv 文件之间的列来打印出差异 CSV1 SERVER FQDN IP ADDRESS serverA device1 com 10 10 10 1 serverA device2 com 10 11 11 1 s
  • 如何在 OSX 上使用多线程安装 XGBoost

    我正在尝试按照指南在我的 mac osx 10 12 1 上安装 xgboosthere http xgboost readthedocs io en latest build html building on osx但我遇到了一些问题 S
  • 为什么 __instancecheck__ 没有被调用?

    我有以下 python3 代码 class BaseTypeClass type def new cls name bases namespace kwd result type new cls name bases namespace p
  • 使用 imblearn 管道进行交叉验证之前或之后是否发生过采样?

    在对训练数据进行交叉验证以验证我的超参数之前 我已将数据分为训练 测试 我有一个不平衡的数据集 并且想要在每次迭代中执行 SMOTE 过采样 因此我使用以下方法建立了一个管道imblearn 我的理解是 将数据分成k折后应该进行过采样 以防

随机推荐