前言

本文讨论的GBDT算法,也是基于决策树

开始探索

scikit-learn

老规矩,先上代码,看看GBDT的用法

from sklearn.datasets import load_iris
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report X, y = load_iris(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0) gbdt_model = GradientBoostingClassifier(n_estimators=100, learning_rate=0.1, max_depth=3, random_state=0)
gbdt_model.fit(X_train, y_train)
gbdt_pred = gbdt_model.predict(X_test) print("\nClassification Report (GBDT):")
print(classification_report(y_test, gbdt_pred))

脚本!启动:

深入理解GBDT

GBDT全称,梯度提升决策树(Gradient Boosting Decision Tree),通过“不断拟合上一步误差”的方式来迭代构建模型,每一步都用一棵新的决策树来逼近当前的残差,从而不断提升整体模型性能

不断的迭代决策树,通过损失函数的负梯度作为每一轮迭代的优化目标,每一棵决策树纠正前一棵树的误差,最终将所有树的预测结果加权求和得到最终输出

基本思路

1)首先计算出初始概率:

预测值计算公式(logit公式): $$F=log(\frac{p}{1-p})$$

概率计算公式(sigmoid公式): $$P=\frac{1}{1+e^{-F}}$$

2)计算残差,通过一棵回归树拟合该残差

\[\begin{aligned}
T_t(x)=
\left\{
\begin{array}{ll}
a \qquad ,x ∈ 正类 \\
b \qquad ,x ∈ 负类
\end{array}
\right.
\end{aligned}
\]

3)再次计算概率

该轮预测值: $$F_t(x)=F_{t-1}(x)+η·T_t(x)$$

  • \(F_t(x)\):当前轮次对x的预测值
  • \(F_{t-1}\):上一轮次对x的预测值
  • \(η\):学习率,每轮更新的步长
  • \(T_t(x)\):每轮训练的回归树,用来拟合上一轮训练的残差

计算出概率: $$P=\frac{1}{1+e^{-F}}$$

4)计算残差、拟合残差、求树的梯度。循环往复,直至收敛

举例说明

下面以二分类任务为例,有10个样本,6个正类(1),4个负类(0)

1)计算初始概率

初始预测值:所有样本的初始预测值为正类的对数几率,通过logit函数计算:$$F=log(\frac{p}{1-p})=log(\frac{0.6}{0.4}) \approx 0.4055 $$

带入到sigmoid计算预测概率:$$P=\frac{1}{1+e{-F}}=\frac{1}{1+e{-0.4055}} \approx 0.6$$

2)计算残差,所谓残差,是单个样本点的预测值与真实值之间的差

正类样本(1)的残差:\(r_i=1-0.6=0.4\)

负类样本(0)的残差:\(r_i=0-0.6=-0.6\)

3)训练第一棵决策回归树

\[\begin{aligned}
T_t(x)=
\left\{
\begin{array}{ll}
\frac{6·0.4}{6} = 0.4 \qquad ,x ∈ 正类 \\
\frac{4·(-0.6)}{4} = -0.6 \qquad ,x ∈ 负类
\end{array}
\right.
\end{aligned}
\]

4)再次计算概率

假设学习率\(\eta=0.1\),更新模型预测:

  • 正类预测:\(F_{正类}=0.4055+0.1×0.4 = 0.4455\)
  • 负类预测:\(F_{负类}=0.4055+0.1×(−0.6) = 0.3455\)

计算预测概率

更新预测概率\(P\)

  • 正类概率:\(P_{正类}=\frac{1}{1+e^{-0.4455}} \approx 0.6095\)
  • 负类概率:\(P_{负类}=\frac{1}{1+e^{-0.3455}} \approx 0.5854\)

由于设置了迭代次数:n_estimators=5,继续迭代

4)计算二轮残差

  • 正类残差:\(r_{正类}=1-0.6095=0.3905\)
  • 负类残差:\(r_{负类}=0-0.5854=−0.5854\)

5)继续训练第二棵决策回归树

\[\begin{aligned}
T_t(x)=
\left\{
\begin{array}{ll}
\frac{6·0.3905}{6} = 0.3905 \qquad ,x ∈ 正类 \\
\frac{4·(-0.5854)}{4} = -0.5854 \qquad ,x ∈ 负类
\end{array}
\right.
\end{aligned}
\]
  • 模型预测\(F\)

    • 正类预测:\(F_{正类}=0.4455+0.1×0.3905 \approx 0.4846\)
    • 负类预测:\(F_{负类}=0.3455+0.1×(-0.5854) \approx 0.287\)
  • 预测概率\(P\)
    • 正类概率:\(P_{正类} \approx 0.6188\)
    • 负类概率:\(P_{负类} \approx 0.5713\)

6)不断迭代,直至n_estimators=5

默认使用最后一次的参数,有位彦祖就说,这不合理啊,有可能中途第三次训练的参数拟合度更高,为什么不用第三次的参数呢,这个问题可以使用早停法解决,后面会说

回归树

有位彦祖问了,我明明是做分类问题,为什么要用回归树来拟合残差?“回归”这个词到底指的是什么?

我们用的决策树,是回归决策树,是为了拟合残差。之前讨论过决策树,但是是分类决策树,这里简单描述一下回归决策树

直接上一个例子,更加明白。比如现在有一组样本

x y
1 5
2 6
3 7
4 15
5 16
6 17

为了简单说明,假设我们的树深度只有1

1)选择切分点,两个样本中间

x = [1 2 3 4 5 6] => [1.5 2.5 3.5 4.5 5.5]

假设选择3.5的切分点

2)计算损失函数MSE

  • 左子集:x = [1 2 3],y = [5 6 7]

    • 均值:\(\frac{5+6+7}{3} = 6\)
    • MSE = \(\frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2 = \frac{(5-6)^2+(6-6)^2+(7-6)^2}{3} \approx 0.6667\)
  • 右子集:x = [4 5 6],y = [15 16 17]

    • 均值:\(\frac{15+16+17}{3} = 16\)
    • MSE = \(\frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2 = \frac{(15-16)^2+(16-16)^2+(17-16)^2}{3} \approx 0.6667\)
  • 加权总MSE:\(\frac{3}{6}·0.6667 + \frac{3}{6}·0.6667 = 0.6667\)

也可以选择其他的分割点,然后计算MSE,选择最优分割点

3)拟合树

\[\begin{aligned}
T_t(x)=
\left\{
\begin{array}{ll}
\frac{5+6+7}{3} = 6\qquad ,x > 3.5 \\
\frac{15+16+17}{3} = 16 \qquad ,x <= 3.5
\end{array}
\right.
\end{aligned}
\]

残差与梯度

根据二分类的交叉熵公式以及求概率公式

\[\begin{cases}
L(y, \hat{y})=-(y \log(\hat{y}) + (1 - y) \log(1 - \hat{y})) \\
\hat{y}=\frac{1}{1+e^{-F}} \\
\end{cases}
\]

对特征\(x\)求导,通过剥洋葱方法:

\[\frac{\partial L}{\partial F}=\frac{\partial L}{\partial \hat{y}}·\frac{\partial \hat{y}}{\partial F}=-(\frac{y}{\hat{y}}-\frac{1-y}{1-\hat{y}})·\frac{e^{-F}}{(1+e^{-F})^2}
\]

由于\(\hat{y}=\frac{1}{1+e^{-F}}\),那么\(1-\hat{y}=\frac{e^{-F}}{1+e^{-F}}\),带入上面:

\[\frac{\partial L}{\partial F}=-(\frac{y}{\hat{y}}-\frac{1-y}{1-\hat{y}})· \hat{y}(1-\hat{y})=\hat{y}-y
\]

梯度有了,那负梯度自然也计算出来了

\[y-\hat{y}
\]

通过计算,负梯度=残差,所以,在上面演示的GBDT二分类任务中,就是沿着负梯度(残差)方向不断的寻找

早停法

顾名思义,就是发现模型性能下降的时候,立刻停止训练,并且保留性能最高的那组参数

import lightgbm as lgb
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score X, y = make_classification(n_samples=1000, n_features=20, random_state=0)
X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2, random_state=0) train_data = lgb.Dataset(X_train, label=y_train)
val_data = lgb.Dataset(X_val, label=y_val, reference=train_data) params = {
'objective': 'binary',
'metric': 'binary_logloss',
'learning_rate': 0.1,
'max_depth': 3,
'num_leaves': 7,
'verbose': -1
} model = lgb.train(
params,
train_data,
num_boost_round=1000,
valid_sets=[val_data],
callbacks=[
lgb.early_stopping(stopping_rounds=5),
lgb.log_evaluation(period=10)
]
) y_pred = model.predict(X_val, num_iteration=model.best_iteration)
y_pred_binary = [1 if p > 0.5 else 0 for p in y_pred]
print(f"Validation Accuracy: {accuracy_score(y_val, y_pred_binary):.4f}")
print(f"Best iteration: {model.best_iteration}")

脚本,启动!

  • objective:binary表示分类任务的损失函数
  • metric:binary_logloss表示监控指标为对数损失函数,也可以换成binary_error表示误差率
  • num_boost_round=1000:最大迭代次数
  • stopping_rounds=5:连续5轮不提升则停止
  • period=10:每10轮打印日志

小结

给一组系统性能数据,能不能发现潜在的风险,风险判定为,日志错误率为>100条

如果错误日志为80条,虽然没有告警,但是系统已经在风险边缘了

先给一组数据,通过系统性能指标进行分类,然后再对于各时段的性能数据进行分类,看系统是否处于崩溃边缘

联系我

  • 联系我,做深入的交流


至此,本文结束

在下才疏学浅,有撒汤漏水的,请各位不吝赐教...

彩笔运维勇闯机器学习--GBDT的更多相关文章

  1. 论反馈信息如何推动 IT 运维团队进步?

    我们还记得<快乐大本营>中经典游戏----快乐传真吗?游戏规则是:很多人站一排,只有第一个人才看到最准确的信息,用东西隔着,戴耳机,一一将从前一个人获得的信息传递下去,最后一个人说出推测的 ...

  2. 干货云集 WOT 2017全球架构与运维技术峰会揭密技术难点

    WOT,World Of Tech专注互联网IT技术领域,是一场不容错过的技术盛会!WOT 2017全球架构与运维技术峰会三大章节,15大技术专场,60+国内外一线互联网精英大咖站台,打造兼顾技术视野 ...

  3. 织云 Metis:看腾讯怎么做智能运维

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 作为企业智能运维门户,业界早已关注织云的智能运维体系.我们很荣幸地宣布织云 Metis 智能运维体系正式发布.自此,织云家族已发布:织云企业 ...

  4. 有效运维的 on-call 机制

    [编者按]本文作者为云告警平台OneAlert负责人,著<云计算与OpenStack>,在IT运营管理.云计算方面从业10多年. 正文 互联网技术的发展,离不开运维支撑工作,没有零bug的 ...

  5. AIOps 一场颠覆传统运维的盛筵

    "颠覆传统运维."是 OneAPM CEO 陈旭经常挂在嘴边的一句话.为什么说 AIOps 将颠覆传统运维?如何才能把人工智能和运维管理相结合并落地? 2018年5月,OneAPM ...

  6. 百度云曲显平:AIOps时代下如何用运维数据系统性地解决运维问题?

    百度云智能运维负责人 曲显平 本文是根据百度云智能运维负责人曲显平10月20日在msup携手魅族.Flyme.百度云主办的第十三期魅族技术开放日<百度云智能运维实践>演讲中的分享内容整理而 ...

  7. 网络流量分析——NPMD关注IT运维、识别宕机和运行不佳进行性能优化。智能化分析是关键-主动发现业务运行异常。科来做APT相关的安全分析

    科来 做流量分析,同时也做了一些安全分析(偏APT)——参考其官网:http://www.colasoft.com.cn/cases-and-application/network-security- ...

  8. 2019年,Linux运维行业的趋势,跟不上学习就被淘汰

    运维行业经历了多年的发展,已经有了很大的变化,最开始的机房.网线.人肉,到现在一步步的自动化.智能化.容器化,运维人员的职业技能要求越来越高,稍不注意就可能被淘汰. 今天马小哥就来盘点一下2019年运 ...

  9. Knative Serverless 之道:如何 0 运维、低成本实现应用托管?

    作者 | 牛秋霖(冬岛)  阿里云容器平台技术专家 关注"阿里巴巴云原生"公众号,回复关键词"1205"即可观看 Knative-Demo 演示视频. 导读:S ...

  10. PHM与智慧运维落地实践案例集 — 机车运用数据智能诊断系统正式上线

    2019年9月20日,经过为期一个多月的紧张测试,北京润科通用技术有限公司为中车某机车单位倾力打造的“机车运用数据智能诊断系统”正式上线运行,标志着润科通用在轨道交通智慧运维领域的又一案例成功落地. ...

随机推荐

  1. java--使用正则对象实现正则的获取功能

    获取需要使用到正则的两个对象: 使用的是用正则对象Pattern 和匹配器Matcher. 用法: 范例: Pattern p = Pattern.compile("a*b"); ...

  2. 放弃Cursor,拥抱Claude code(白嫖100美金余额,可以用Claude Sonnet 4)

    前言 之前一直在使用Cursor,但是最近Cursor一直偷偷改价降智,不是那么好用了,Claude的公司Anthropic自己推出AI编程工具Claude code体验了一下,感觉非常的丝滑,主要是 ...

  3. MS 笔试 FT面试

    手写轮播 我也是醉了 闭包机制   外面的 可以访问 闭包里面的变量 会长时间存在在栈上 js变量类型 我就写了var  真是... function forsum () { var i,sum = ...

  4. linux 虚拟内存增加

    简介 增加内存以跑动大内存程序 https://www.cnblogs.com/lori/p/13344060.html 主要命令 增加10个G的虚拟内存 sudo dd if=/dev/zero o ...

  5. Hive自定义函数(UDF)开发和应用流程.18981521

    目录 引言 一.Hive自定义函数的类型 二.准备环境和工具 三.实际案例开发编译 四.前方有坑请注意 五.总结 引言      Hive作为大数据领域的核心计算引擎,凭借其强大的SQL支持和丰富的内 ...

  6. 进阶篇:6.2)公差的正态分布与CPK与制程能力(重要)

    本章目的:明确公差分布(Tolerance Distribution)也有自己的形状,了解CPK概念. 1.正态分布(常态分布)normal distribution的概念 统计分析常基于这样的假设: ...

  7. vscode 全局搜索屏蔽一些不需要看到的文件的办法

    vscode 全局搜索的时候总是容易把工程中map文件的一些索引搜索到,十分的烦人 发现一个办法可以过滤掉: 打开折叠项,开启排除搜索文件,填入*.map, *.htm,我这里只需要过滤这两种类型文件 ...

  8. 亚马逊机器学习大学推出"负责任AI"课程 - 聚焦AI偏见缓解与公平性实践

    亚马逊机器学习大学推出"负责任AI"课程 亚马逊机器学习大学(MLU)最新发布"负责任AI--偏见缓解与公平性标准"课程.这个免费的在线公开课程教授负责任AI的 ...

  9. Java泛型中<?>和<T>的区别浅析

    https://www.jb51.net/article/270336.htm 一.定义 1.T 代表一种类型 可以加在类上,也可以加在方法上 1)T 加在类上 1 2 3 class SuperCl ...

  10. Apple Logic Pro v10.8.1 - MAC上专业的音频编辑混音工具

    Logic Pro 是用于专业歌曲创作,编辑和混音的精密工具,围绕现代界面而构建,旨在快速获得创造性的结果,并在需要时提供更多的功能. Logic Pro包含了大量的乐器,效果和循环,提供了一个完整的 ...