XGB-5: DART Booster

2024-02-09 04:52
文章标签 dart booster xgb

本文主要是介绍XGB-5: DART Booster,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

XGBoost 主要结合了大量的回归树和一个小的学习率。在这种情况下,早期添加的树是重要的,而晚期添加的树是不重要的。

Vinayak 和 Gilad-Bachrach 提出了一种将深度神经网络社区的 dropout 技术应用于梯度提升树的新方法,并在某些情况下报告了更好的结果

以下是新的树增强器 dart 的说明。

原始论文

Rashmi Korlakai Vinayak, Ran Gilad-Bachrach。“DART: Dropouts meet Multiple Additive Regression Trees.” [arXiv]。

特性

  • 通过删除树来解决过拟合问题。
    • 可以阻止不重要的普通树(以纠正普通错误)

由于训练中引入的随机性,可以期待以下一些差异:

  • 由于随机丢弃dropout会阻止使用预测缓冲区,因此训练可能比 gbtree

  • 由于随机性,早停Early-stop可能不稳定

工作原理

  • 在第 m m m训练轮次中,假设 k k k棵树被选中丢弃。

  • D = ∑ i ∈ K F i D = \sum_{i \in \mathbf{K}} F_i D=iKFi为被丢弃树的叶节点分数, F m = η F ~ m F_m = \eta \tilde{F}_m Fm=ηF~m为新树的叶节点分数。

  • 目标函数如下:

O b j = ∑ j = 1 n L ( y j , y ^ j m − 1 − D j + F ~ m ) Ω ( F ~ m ) . \mathrm{Obj} = \sum_{j=1}^n L \left( y_j, \hat{y}_j^{m-1} - D_j + \tilde{F}_m \right)\Omega \left( \tilde{F}_m \right). Obj=j=1nL(yj,y^jm1Dj+F~m)Ω(F~m).

  • D D D F m F_m Fm是超调,因此使用缩放因子

y ^ j m = ∑ i ∉ K F i + a ( ∑ i ∈ K F i + b F m ) . \hat{y}_j^m = \sum_{i \not\in \mathbf{K}} F_i + a \left( \sum_{i \in \mathbf{K}} F_i + b F_m \right) . y^jm=iKFi+a(iKFi+bFm).

参数

Booster dart 继承自 gbtree booster,因此支持 gbtree 的所有参数,比如 etagammamax_depth 等。

以下是额外的参数:

  • sample_type:采样算法的类型。

    • uniform:(默认)以均匀方式选择要删除的树。
    • weighted:以权重比例选择要删除的树。
  • normalize_type:规范化算法的类型。

    • tree:(默认)新树的权重与每个被删除的树相同。

      a ( ∑ i ∈ K F i + 1 k F m ) = a ( ∑ i ∈ K F i + η k F ~ m ) ∼ a ( 1 + η k ) D = a k + η k D = D , a = k k + η \begin{split}a \left( \sum_{i \in \mathbf{K}} F_i + \frac{1}{k} F_m \right) &= a \left( \sum_{i \in \mathbf{K}} F_i + \frac{\eta}{k} \tilde{F}_m \right) \\ &\sim a \left( 1 + \frac{\eta}{k} \right) D \\ &= a \frac{k + \eta}{k} D = D , \\ &\quad a = \frac{k}{k + \eta}\end{split} a(iKFi+k1Fm)=a(iKFi+kηF~m)a(1+kη)D=akk+ηD=D,a=k+ηk

    • forest:新树的权重等于被删除的树的权重之和(森林)。

      a ( ∑ i ∈ K F i + F m ) = a ( ∑ i ∈ K F i + η F ~ m ) ∼ a ( 1 + η ) D = a ( 1 + η ) D = D , a = 1 1 + η . \begin{split}a \left( \sum_{i \in \mathbf{K}} F_i + F_m \right) &= a \left( \sum_{i \in \mathbf{K}} F_i + \eta \tilde{F}_m \right) \\ &\sim a \left( 1 + \eta \right) D \\ &= a (1 + \eta) D = D , \\ &\quad a = \frac{1}{1 + \eta} .\end{split} a(iKFi+Fm)=a(iKFi+ηF~m)a(1+η)D=a(1+η)D=D,a=1+η1.

  • dropout_rate: 丢弃率。

    • 范围:[0.0, 1.0]
  • skip_dropout: 跳过丢弃的概率。

    • 如果跳过了dropout,新树将以与 gbtree 相同的方式添加。
    • 范围:[0.0, 1.0]

示例

import xgboost as xgb# read in data
dtrain = xgb.DMatrix('./xgboost/demo/data/agaricus.txt.train?format=libsvm')
dtest = xgb.DMatrix('./xgboost/demo/data/agaricus.txt.test?format=libsvm')# specify parameters via map
param = {'booster': 'dart','max_depth': 5, 'learning_rate': 0.1,'objective': 'binary:logistic','sample_type': 'uniform','normalize_type': 'tree','rate_drop': 0.1,'skip_drop': 0.5}num_round = 50
bst = xgb.train(param, dtrain, num_round)
preds = bst.predict(dtest)

参考

  • https://xgboost.readthedocs.io/en/latest/tutorials/dart.html
  • https://arxiv.org/abs/1505.01866

这篇关于XGB-5: DART Booster的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/693176

相关文章

dart 中的 泛型 怎么写??

import 'package:flutterdemo/bean/MyUser.dart';class BaseResp<T> {int code;String str;T data;BaseResp({this.code, this.str, this.data});BaseResp.fromJson(Map<String, dynamic> jsonStr) {code = jsonStr['

dart 单例

在Dart中,如果你想要在类一创建时就运行的函数,你可以将这个函数放在类的构造函数中。对于单例模式,构造函数是私有的,所以你需要在类的内部调用这个函数。 //创建时 没有 需要运行函数的class ChoosePrizeController extends ChangeNotifier {// 静态私有成员,持有类的唯一实例static final ChoosePrizeController

xgb-练习

以下代码未验证,仅用作练习 #!/usr/bin/env python3# -*- coding: utf-8 -*-import pandas as pdimport numpy as npimport matplotlib.pyplot as pltimport seaborn as snsfrom sklearn.model_selection import train_test

初探 Dart 语法 01

欢迎来到 Dart 编程的世界,最开始将通过初探 Dart 的基本语法;让你对 Dart 整个语法体系轮廓、Dart 的编程有个大概了解,然后再深入到具体每个语法点细节和使用场景。由于文章篇幅的问题,初探 Dart 语法主要分为上下两篇来介绍。 1. Hello Dart 这是第一个 Hello Dart 程序,很多程序入口都是从 main 函数开始,所以 Dart 也不例外,一起来看下百变的

初探 Dart 语法 02

本篇文章上接初探 Dart 语法上篇,主要涉及一些 Dart 中的运算符、异常、函数、面向对象等。 1. 运算符 1.1 算术运算符 名称运算符例子加+var result = 1 + 1;减-var result = 5 - 1;乘*var result = 3 * 5;除/var result = 3 / 5; //0.6整除~/var result = 3 ~/ 5; //0取余%va

掌握 Dart 集合的使用

我们将继续 Dart 语法的集合,虽然集合在第一篇中已经介绍的差不多,但是在这篇文章中将会更加全面介绍有关 Dart 中的集合,因为之前只是介绍了 dart:core 包中的 List、Set、Map,实际上在 Dart 中还提供一个非常丰富的 dart:collection 包,接下来将会一一介绍。 1. List 在 Dart 中的 List 集合是具有长度的可索引对象集合。 初始化

深入分析 Dart 集合源码

本篇文章将继续 Dart 中集合,不过本篇文章将会深入 Dart 集合源码分析。看过集合源码小伙伴都知道 dart:core 包中的集合实际上是委托到 dart:collection 包中实现的,所以下面我也会从源码的角度去把两者联系起来。当然这里也只会选择几个常用的集合作为介绍。 1. List 在 Dart 中 List 集合,它没有委托 dart:collection 包中集合实现,完全

掌握 Dart 集合操作符函数使用

在上一篇文章中,我们全面地分析了常用集合的使用以及集合部分源码的分析。那么这一节讲点更实用的内容,绝对可以提高你的 Flutter 开发效率的函数,那就是集合中常用的操作符函数。这次说的内容的比较简单就是怎么用,以及源码内部是怎么实现的。 1. Iterable<E> 在 Dart 中几乎所有集合拥有的操作符函数(例如:map、every、where、reduce 等)都是因为继承或者实现了

深入分析 Dart 集合操作符源码

上篇文章我们详细介绍了有关 Dart 集合操作符函数的基本使用,那么这篇文章将会从源码角度,分析其内部原理。通过它你将会理解什么是惰性迭代器。 1. forEach 函数源码解析 void forEach(void f(E element)) {//可以看到在 forEach 内部实际上就是利用 for-in 迭代,每迭代一次就执行一次 f 函数,//并把当前 element 回调出去fo