机器学习-GBDT

2023-11-10

GBDT

        gbdt是一种以CART树(通常)为基分类器的boosting算法,大家可以仔细查一下boosting的介绍,这里不再赘述。

        gbdt通过多轮迭代,每轮迭代产生一个弱分类器,每个分类器在上一轮分类器的残差基础上进行训练。对弱分类器的要求一般是足够简单,并且是低方差和高偏差的。因为训练的过程是通过降低偏差来不断提高最终分类器的精度,(此处是可以证明的)。

在训练的过程中,希望大家养成习惯, 参考API文档来选择参数

常见参数介绍: 

loss : {‘deviance’, ‘exponential’}, optional (default=’deviance’)

loss:损失函数度量,有对数似然损失deviance和指数损失函数exponential两种,默认是deviance,即对数似然损失,如果使用指数损失函数,则相当于Adaboost模型。

learning_rate : float, optional (default=0.1)

学习率将每棵树的贡献缩小学习率。学习率和估计值之间有一个权衡。表示,向梯度最低点每次移动的步长一般设置为0.01,0.001等 一般学习率更低基分类器个数更多训练效果更好。

n_estimators : int (default=100)

表示基分类器的个数,或者boosting的轮数,要执行的增压阶段数。梯度助推对于过拟合是相当稳健的,因此大量的梯度助推通常会产生更好的性能。

subsample : float, optional (default=1.0)

采样比例,这里的采样和bagging的采样不是一个概念,这里的采样是指选取多少比例的数据集利用决策树基模型去boosting,默认是1.0,即在全量数据集上利用决策树去boosting。

criterion : string, optional (default=”friedman_mse”)

样本集的切分策略,决策树中也有这个参数,但是两个参数值不一样,这里的参数值主要有friedman_mse、mse和mae3个,分别对应friedman最小平方误差、最小平方误差和平均绝对值误差,friedman最小平方误差是最小平方误差的近似。“friedman_mse”的默认值通常是最好的,因为它可以在某些情况下提供更好的近似值

New in version 0.18.

min_samples_split : int, float, optional (default=2)

      这个值限制了子树继续划分的条件,如果某节点的样本数少于min_samples_split,则不会继续再尝试选择最优特征来进行划分。 默认是2.如果样本量不大,不需要管这个值。如果样本量数量级非常大,则推荐增大这个值。我之前的一个项目例子,有大概10万样本,建立决策树时,我选择了min_samples_split=10。可以作为参考。

min_samples_leaf : int, float, optional (default=1)

这个参数是减枝策略,这个值限制了子树继续划分的条件,如果某节点的样本数少于min_samples_split,则不会继续再尝试选择最优特征来进行划分。 默认是2.如果样本量不大,不需要管这个值。如果样本量数量级非常大,则推荐增大这个值。我之前的一个项目例子,有大概10万样本,建立决策树时,我选择了min_samples_split=10。可以作为参考。

min_weight_fraction_leaf : float, optional (default=0.)

这个值限制了叶子节点所有样本权重和的最小值,如果小于这个值,则会和兄弟节点一起被剪枝。 默认是0,就是不考虑权重问题。一般来说,如果我们有较多样本有缺失值,或者分类树样本的分布类别偏差很大,就会引入样本权重,这时我们就要注意这个值了。  

max_depth : integer, optional (default=3)

     决策树的最大深度,默认可以不输入,如果不输入的话,决策树在建立子树的时候不会限制子树的深度。一般来说,数据少或者特征少的时候可以不管这个值。如果模型样本量多,特征也多的情况下,推荐限制这个最大深度,具体的取值取决于数据的分布。常用的可以取值10-100之间。

max_features : int, float, string or None, optional (default=None)

节点分裂时参与判断的最大特征数

max_leaf_nodes : int or None, optional (default=None)

 通过限制最大叶子节点数,可以防止过拟合,默认是"None”,即不限制最大的叶子节点数。如果加了限制,算法会建立在最大叶子节点数内最优的决策树。如果特征不多,可以不考虑这个值,但是如果特征分成多的话,可以加以限制,具体的值可以通过交叉验证得到。

warm_start : bool, default: False

“暖启动”,默认值是False,即关闭状态,如果打开则表示,使用先前调试好的模型,在该模型的基础上继续boosting,如果关闭,则表示在样本集上从新训练一个新的基模型,且在该模型的基础上进行boosting。

min_impurity_decrease:节点划分最小不纯度:float, optional (default=0.) 
这个值限制了决策树的增长,如果某节点的不纯度(基尼系数,信息增益,均方差,绝对差)小于这个阈值,则该节点不再生成子节点。 

 实际代码如下,可供参考

def train(X_train, y_train,X_test,y_test,params = {'n_estimators': 600, 'max_depth': 6, 'min_samples_split': 3,'learning_rate': 0.01, 'loss': 'ls','random_state':0}):
    deno = np.sum(y_test)
    print "training",X_train.shape,"testing gt num",deno

    n_estimators = params['n_estimators']
    clf = ensemble.GradientBoostingRegressor(**params)
    #clf = ensemble.GradientBoostingClassifier(**params)
    clf.fit(X_train, y_train)
    mse = mean_squared_error(y_test, clf.predict(X_test))

    test_result = enumerate(clf.staged_predict(X_test))
    pred_test = np.zeros((n_estimators,X_test.shape[0]), dtype=np.float64) 
    test_score = np.zeros((n_estimators,), dtype=np.float64)
    rec = [(0,0)]*n_estimators

    for i, y_pred in test_result:
        test_score[i] = clf.loss_(y_test, y_pred)
        true,score = count(y_test,y_pred,orderid2)
        try:
            p,r,th = precision_recall_curve(true,score)
            wh=np.searchsorted(p,0.90)
            if i == 132:
                print y_pred[ 346:352]
            print i,sum(true),"precision",p[wh], "recall",r[wh],"threshold",th[wh]

            rec[i] = (r[wh],sum(true))
            pred_test [i] = y_pred
        except:
            continue

集成学习中,我们也可以看到各个属性的重要性

from collections import OrderedDict
d = {}
for i in range(len(clf.feature_importances_)):
    if clf.feature_importances_[i] > 0.01:
        d[i] = clf.feature_importances_[i]

sorted_feature_importances = OrderedDict(sorted(d.items(), key=lambda x:x[1], reverse=True))
D = sorted_feature_importances
rects = plt.bar(range(len(D)), D.values(), align='center')
plt.xticks(range(len(D)), D.keys(),rotation=90)
plt.show()

               

 

 

 

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

机器学习-GBDT 的相关文章

  • [Luogu] P1438 无聊的数列

    题目背景 无聊的 YYB 总喜欢搞出一些正常人无法搞出的东西 有一天 无聊的 YYB 想出了一道无聊的题 无聊的数列 K峰 这题不是傻X题吗 题目描述 维护一个数列 a i a i ai 支持两种操作 1 l r K D 给出一个长度等于

随机推荐

  • java 接口类与抽象类

    接口可以继承接口 抽象类可以实现 implements 接口 但不可以继承自接口 抽象类可以继承具体类 抽象类中可以有静态的 main 方法 抽象类里可以有抽象方法 抽象方法一定要在抽象类里 抽象类可以派生 抽象类的父类可以是非抽象类 某一
  • XSS之xss-labs-level5

    文章目录 0x01 XSS Labs 0x02 实验工具 0x03 实验环境 0x04 实验步骤 0x05 实验分析 0x06 参考链接 0x01 XSS Labs XSS 跨站脚本攻击 是指恶意攻击者往Web页面里插入恶意Script代码
  • 递归对比对象函数

    在JavaScript中 对象之间的比较通常通过引用进行 当你使用 运算符比较两个对象时 它会检查它们是否引用了同一个内存地址 而不是逐个比较对象的属性 上图可见 obj1和 是两个不同的对象 尽管它们具有相同的结构 都是空对象 因此 使用
  • vue项目使用vue-video-player实现视频直播功能

    文章目录 引言 一 基本使用 1 播放mp4 2 options常用属性 3 常用事件 二 使用videojs contrib hls播放m3u8 三 视频链接测试工具 potplayer 引言 随着互联网的快速发展 视频直播已经成为了越来
  • [C++]拷贝(复制)构造函数

    拷贝 复制 构造函数 拷贝构造函数是一种特殊的构造函数 其形参为本类的对象引用 形式如下 class 类名 public 类名 形参 构造函数 类名 类名 对象名 拷贝构造函数 拷贝构造函数实例 include
  • C语言程序设计--学生信息管理系统

    题目 学生信息管理系统 1 系统设计 1 1设计要求 1 1 1设计任务 创建一个学生信息管理系统 让它来运行和管理学生信息 进行对学生学号 姓名 性别 年龄 出生年月日 住址 电话 E maill等信息的管理 1 1 2性能指标要求 程序
  • 刷脸支付随刷随走用户体验更好

    目前不管是商铺还是银行 又或者是交通等领域都已实现刷脸支付应用 我们的社会已经初步进入了靠脸吃饭的时代 相信很多用户都很是好奇 扫码支付才盛行不久 而且也非常的方便实用 为什么刷脸支付才刚入市 就大有取代扫码支付的趋势呢 其实很简单 刷脸支
  • idea编译级别设置

    方法一 File gt Project Structure gt Project File gt Settings gt Build Execution Deployment gt Compiler gt Java Compiler 方法二
  • sqli-labs26

    文章目录 一 审查源码 1 判断注入点和闭合方式 2 过滤方式 二 SQL注入 1 获取数据库 2 获取数据表 3 获取字段 双写绕过 anandd 大小写绕过And 括号绕过 ASCII编码绕过 20 0a绕过 内联注释 替换 如 and
  • 蓝桥杯提交代码每次都是运行出错,但自己在编辑器上运行没问题...

    问题描述 自己在eclipse上面跑的java题目是完全可以编译运行的 但是提交到系统中却一直是运行错误 检查了好久觉得自己没有哪里写错 解决办法 最后发现是自己给不同的题目分了类放在了不同的包下面 提交代码的时候没有把引入的包名注释掉 因
  • 移动BI应该怎么规划?每一个数据产品经理必看

    在移动化 大数据浪潮的今天 基于数据做决策应该是每一家公司的标配 每家公司都有专门负责数据的人 也都应该有一个BI部门 而移动BI 基于手机端随时随地进行数据查询和分析 更是BI中不可或缺的一部分 那么移动BI怎么做 我们按照 用户体验要素
  • 链式输送机传动装置设计(说明书+CAD图纸+PPT)

    摘要 齿轮传动是应用极为广泛和特别重要的一种机械传动形式 它可以用来在空间的任意轴之间传递运动和动力 目前齿轮传动装置正逐步向小型化 高速化 低噪声高可靠性和硬齿面技术方向发展 齿轮传动具有传动平稳可靠 传动效率高 一般可以达到94 以上
  • Qt中opengl使用swapBuffers()函数报错解决办法

    swapBuffers qt文档中方的翻译 用屏幕外缓冲区交换屏幕内容 仅当窗口小部件的格式指定双缓冲模式时 此方法才有效 通常 不需要显式调用此函数 因为它是在每个小部件重新绘制后 即每次执行paintGL 之后 自动完成的 我是在线程中
  • Visual Studio(VS) 编程推荐字体及设置

    菜单栏 工具 选项 选择Consolas就是最常见的编码字体了 在这个字体下的中英文标点和半角圆角符号也能有比较明显的区别
  • YARN之Container-什么是Container?

    在最基本的层面上 Container是单个节点上如RAM CPU核核磁盘等物理资源的集合 单个节点上 或者单个大节点 可以有多个Container 系统中的每个节点可以认为是由内存 如512MB或者1GB 和CPU的最小容量的多个Conta
  • gin-巧用Context传递多种参数

    目录 引言 1 巧妙包装gin Context为NewContext 2 在使用gin Use对每一个请求的Context进行组装 3 在路由绑定时解析出NewContext来为应用层函数提供参数 并且调用应用层函数 4 总结 引言 首先给
  • wget

    参考 http apple stackexchange com questions 100570 getting files all at once from a web page using curl 一份份的下载文件有点麻烦 所以 wg
  • 数据结构之图:邻接矩阵和邻接表、深度优先遍历和广度优先遍历

    简介 线性表是一种线性结构 除了头结点和尾节点 线性表的每个元素都只有一个前取节点和一个后继节点 而树结构则相较于线性表更加复杂 它描述的关系为数据元素之间的父子关系 也是现实世界父子关系的缩影 一个父亲节点可以有零个或者多个子节点 而每个
  • 解决tensorflow没有compat的问题

    经过我多年的产bug经验判断 一般这种情况出现在anaconda下载的tensorflow2 x版本中 如果知道自己的tensorflow环境地址的话可以进去检查一下当前版本的tensorflow缺以下哪几个包 不知道也没关系 直接无脑下载
  • 机器学习-GBDT

    GBDT gbdt是一种以CART树 通常 为基分类器的boosting算法 大家可以仔细查一下boosting的介绍 这里不再赘述 gbdt通过多轮迭代 每轮迭代产生一个弱分类器 每个分类器在上一轮分类器的残差基础上进行训练 对弱分类器的