GBDT与xgboost :流失预测 shap解释 调参 保存调参好的模型

2023-11-15

集成学习

集成学习的方式分为两类:
个体的学习器之间存在强依赖关系,必须串行生成序列化方法,代表
Boosting;
个体学习器之间不存在强依赖关系,可同时生成并行化方法,代表是Bagging和随机森林。

在这里插入图片描述
在这里插入图片描述

bagging

在这里插入图片描述

boosting

在这里插入图片描述
在这里插入图片描述

stacking

在这里插入图片描述
2)点击率预估
使用GBDT+LR进行点击率(CTR)预估。
https://blog.csdn.net/Snoopy_Yuan/article/details/80703175?depth_1-utm_source=distribute.pc_r
elevant.none-task&utm_source=distribute.pc_relevant.none-task

在这里插入图片描述
在这里插入图片描述

XGBOOST 的推导过程

在这里插入图片描述
实例:

在这里插入图片描述
在这里插入图片描述
XGBOOST 是一个加法模型
在这里插入图片描述
在这里插入图片描述
T为叶子节点的个数,Wj为叶子节点的权重。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Xgboost-重要参数

在这里插入图片描述
在这里插入图片描述
对于General paramaters,表示使用何种基本模型,通常是决策树或线性模型,一般不需要调整,采
用默认值即可,参数调优不包括这部分

主要参数是以下几类:
在这里插入图片描述
在这里插入图片描述
对于Booster paramaters,表示若学习器相关参数,需要仔细调整,会影响模型性能。.
eta 学习率
gamma
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
对于Learning task parameters,与任务有关,定下来后通常不需要调整

在这里插入图片描述

XGBoost调参技巧

在这里插入图片描述
XGBOOST 比GBDT的特点
在这里插入图片描述

选用哪一种xgboost

在这里插入图片描述
*

代码实操* :

## 获取数据
import xgboost as xgb # 调用陈天奇的库
from xgboost.sklearn import XGBClassifier # 使用sklearn api
import numpy as np 
import pandas as pd 
import matplotlib.pyplot as plt

from sklearn import metrics
data =  pd.read_table('C:/Users/lb/Desktop/test/gouwu.txt',sep='\t',engine="python",encoding = 'utf-8')
data.columns.values
data.head()

在这里插入图片描述

data.shape

在这里插入图片描述
分割数据集

from sklearn.model_selection import train_test_split
data_x = data.drop(['留存标签'],axis=1)
data_y = data['留存标签']
train_x,test_x,train_y,test_y = train_test_split(data_x,data_y,test_size=0.3,random_state=5)

行标签的恢复以后注意添加这个步骤

for i in [train_x,test_x]:
    i.index = range(i.shape[0])
train_x.head()

在这里插入图片描述
模型的训练

from sklearn.metrics import accuracy_score

model = XGBClassifier( ) 
# 训练模型
model.fit(train_x,train_y) 
# 预测模型
pred_y = model.predict(test_x)
metrics.accuracy_score(test_y, pred_y)

分类的准确率

在这里插入图片描述

xgboost 进阶用法

在这里插入图片描述
监控每一步的表现

# 监控模型每一步的表现
# eval_set=[(x_test,y_test)]  评估数据集,list类型
# eval_metric 评估标准(多分类问题,使用mlogloss作为损失函数),二分类 auc
# early_stopping_rounds= 10   如果模型的loss十次内没有减小,则提前结束模型训练
# verbose = True  True显示,False不显示
eval_set = [(test_x, test_y)] 
model.fit(train_x, train_y, early_stopping_rounds=10, eval_metric="auc",
          eval_set=eval_set, verbose=True)

在这里插入图片描述

显示特征的重要性

#显示各个特征的重要性  ----  基于训练的特征树输出
from xgboost import plot_importance
from matplotlib import pyplot
plt.rcParams['font.sans-serif']=['SimHei'] #显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
plot_importance(model)
pyplot.show()

在这里插入图片描述
为了得到影响因素正向还是逆向的影响,用shap

shap 来解释xgboost模型

import shap
shap.initjs()
explainer = shap.TreeExplainer(model)
shap_values = explainer.shap_values(train_x)
print(shap_values)

在这里插入图片描述

shap_values.shape 
train_x.shape 

在这里插入图片描述

plt.rcParams['font.sans-serif']=['SimHei'] #显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
shap.summary_plot(shap_values,train_x,max_display=30)
#红色高 蓝色低

在这里插入图片描述

shap.summary_plot(shap_values,train_x, plot_type="bar")

在这里插入图片描述
做一个简单的验证

pd.DataFrame(abs(shap_values),columns=train_x.columns).mean().sort_values(ascending=False)

在这里插入图片描述

# 多个变量交互
shap_interaction_values = shap.TreeExplainer(model).shap_interaction_values(train_x)
shap.summary_plot(shap_interaction_values, train_x, max_display=4)

在这里插入图片描述

依赖图

依赖图
同样可以通过单变量的依赖图看出单变量对目标的影响,横坐标是特征值纵坐标是shap值:

shap.dependence_plot('购物距离注册时长', 
                     shap_values,train_x, 
                     interaction_index=None,
                     show=False)

在这里插入图片描述
可以看出购物距离注册市场对于用户的留存存在正相关的作用
类似案例的参考解释:
在这里插入图片描述
在这里插入图片描述
那么双变量呢? 参考案例如下:
其他别人案例代码:

shap.dependence_plot('Pclass', shap_values[1], X_test, interaction_index='Sex_encoding', show=False)

在这里插入图片描述
得出一个经验:不要看太多的颜色而是方向
[添加链接描述] 可再去参考这个教程(https://blog.csdn.net/weixin_43615654/article/details/103436632?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param)

观察某一行各个特征对结果的影响

shap.initjs()
shap.force_plot(explainer.expected_value, shap_values[5], train_x.iloc[5])

在这里插入图片描述

模型调参

from sklearn.model_selection import GridSearchCV
#这里交叉验证也可以  K折
from sklearn.model_selection import StratifiedKFold 
#设定网格搜索的xgboost参数搜索范围,值搜索XGBoost的主要6个参数.
#注意看这里是个字典
param_dist = {
        'n_estimators':range(80,150,5),
        'max_depth':range(3,10,1),
        'learning_rate':np.linspace(0.01,0.1,20),
        'subsample':np.linspace(0.7,0.9,20),
        'colsample_bytree':np.linspace(0.5,0.98,10),
        'min_child_weight':range(1,9,1)
        }

网格搜索

grid = GridSearchCV(model,param_dist,cv = 3,scoring = 'neg_log_loss',
                    n_jobs = -1)
#在训练集上训练
grid.fit(train_x, train_y)
#返回最优的训练器
grid.best_params_

model_best = XGBClassifier(grid.best_params_)

速度慢下3.

#上面这个速度太慢
model1 = XGBClassifier()
learning_rate = [0.0001, 0.001, 0.01, 0.1,0.12,0.15,0.2,0.3]
#转成字典
param_grid = dict(learning_rate=learning_rate)```

```python
param_grid 

在这里插入图片描述
score 在不同场景情况下的取值
Python-sklearn包中StratifiedKFold和KFold生成交叉验证数据集的区别
利用KFOLD 实现交叉验证
在这里插入图片描述

在这里插入图片描述

model1 = XGBClassifier()
learning_rate = [0.0001, 0.001, 0.01, 0.1,0.12,0.15,0.2,0.3]
param_grid = dict(learning_rate=learning_rate)
kfold = StratifiedKFold(n_splits=10, shuffle=True, random_state=7)
grid_search = GridSearchCV(model1, param_grid, scoring="neg_log_loss",
                           n_jobs=-1, cv=kfold)
grid_result = grid_search.fit(train_x, train_y)
print("Best: %f using %s" % (grid_result.best_score_, grid_result.best_params_))

在这里插入图片描述

model2 = XGBClassifier()
n_estimators = range(80,200,5)
param_grid = dict(n_estimators = n_estimators)
kfold = StratifiedKFold(n_splits=10, shuffle=True, random_state=7)
grid_search = GridSearchCV(model2, param_grid, scoring="neg_log_loss",
                           n_jobs=-1, cv=kfold)
grid_result = grid_search.fit(train_x, train_y)
print("Best: %f using %s" % (grid_result.best_score_, grid_result.best_params_))

在这里插入图片描述

# 调参
model3 = XGBClassifier(n_estimators=110,learning_rate= 0.12)
model3.fit(train_x,train_y) 
# 预测模型
pred_y = model3.predict(test_x)
metrics.accuracy_score(test_y, pred_y)

0.7625979843225084

保存模型

# 保存模型
import pickle
pickle.dump(model,open("C:/Users/lb/Desktop/test/tl.dat","wb")) 
# 可以进行读
# 读取模型,重新打开jupyter
import pickle
load_file = open("C:/Users/lb/Desktop/test/tl.dat","rb")
load_game_data = pickle.load(load_file)
load_file.close()
load_game_data

在这里插入图片描述
接着预测

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

GBDT与xgboost :流失预测 shap解释 调参 保存调参好的模型 的相关文章

  • 如何使用固定的 pandas 数据框进行动态 matplotlib 绘图?

    我有一个名为的数据框benchmark returns and strategy returns 两者具有相同的时间跨度 我想找到一种方法以漂亮的动画风格绘制数据点 以便它显示逐渐加载的所有点 我知道有一个matplotlib animat
  • 如何生成给定范围内的回文数列表?

    假设范围是 1 X 120 这是我尝试过的 gt gt gt def isPalindrome s check if a number is a Palindrome s str s return s s 1 gt gt gt def ge
  • Pycharm Python 控制台不打印输出

    我有一个从 Pycharm python 控制台调用的函数 但没有显示输出 In 2 def problem1 6 for i in range 1 101 2 print i end In 3 problem1 6 In 4 另一方面 像
  • DreamPie 不适用于 Python 3.2

    我最喜欢的 Python shell 是DreamPie http dreampie sourceforge net 我想将它与 Python 3 2 一起使用 我使用了 添加解释器 DreamPie 应用程序并添加了 Python 3 2
  • Flask 和 uWSGI - 无法加载应用程序 0 (mountpoint='')(找不到可调用或导入错误)

    当我尝试使用 uWSGI 启动 Flask 时 出现以下错误 我是这样开始的 gt cd gt root localhost uwsgi socket 127 0 0 1 6000 file path to folder run py ca
  • 如何在 Sublime Text 2 的 OSX 终端中显示构建结果

    我刚刚从 TextMate 切换到 Sublime Text 2 我非常喜欢它 让我困扰的一件事是默认的构建结果显示在 ST2 的底部 我的程序产生一些很长的结果 显示它的理想方式 如在 TM2 中 是并排查看它们 如何在 Mac 操作系统
  • Python 多处理示例不起作用

    我正在尝试学习如何使用multiprocessing但我无法让它发挥作用 这是代码文档 http docs python org 2 library multiprocessing html from multiprocessing imp
  • 如何在Windows上模拟socket.socketpair

    标准Python函数套接字 套接字对 https docs python org 3 library socket html socket socketpair不幸的是 它在 Windows 上不可用 从 Python 3 4 1 开始 我
  • 打破嵌套循环[重复]

    这个问题在这里已经有答案了 有没有比抛出异常更简单的方法来打破嵌套循环 在Perl https en wikipedia org wiki Perl 您可以为每个循环指定标签 并且至少继续一个外循环 for x in range 10 fo
  • __del__ 真的是析构函数吗?

    我主要用 C 做事情 其中 析构函数方法实际上是为了销毁所获取的资源 最近我开始使用python 这真的很有趣而且很棒 我开始了解到它有像java一样的GC 因此 没有过分强调对象所有权 构造和销毁 据我所知 init 方法对我来说在 py
  • 从 scikit-learn 导入 make_blobs [重复]

    这个问题在这里已经有答案了 我收到下一个警告 D Programming Python ML venv lib site packages sklearn utils deprecation py 77 DeprecationWarning
  • Python - 按月对日期进行分组

    这是一个简单的问题 起初我认为很简单而忽略了它 一个小时过去了 我不太确定 所以 我有一个Python列表datetime对象 我想用图表来表示它们 x 值是年份和月份 y 值是此列表中本月发生的日期对象的数量 也许一个例子可以更好地证明这
  • 如何改变Python中特定打印字母的颜色?

    我正在尝试做一个简短的测验 并且想将错误答案显示为红色 欢迎来到我的测验 您想开始吗 是的 祝你好运 法国的首都是哪里 法国 随机答案不正确的答案 我正在尝试将其显示为红色 我的代码是 print Welcome to my Quiz be
  • 检查所有值是否作为字典中的键存在

    我有一个值列表和一本字典 我想确保列表中的每个值都作为字典中的键存在 目前我正在使用两组来确定字典中是否存在任何值 unmapped set foo set bar keys 有没有更Pythonic的方法来测试这个 感觉有点像黑客 您的方
  • 使用基于正则表达式的部分匹配来选择 Pandas 数据帧的子数据帧

    我有一个 Pandas 数据框 它有两列 一列 进程参数 列 包含字符串 另一列 值 列 包含相应的浮点值 我需要过滤出部分匹配列 过程参数 中的一组键的子数据帧 并提取与这些键匹配的数据帧的两列 df pd DataFrame Proce
  • 您可以在 Python 类型注释中指定方差吗?

    你能发现下面代码中的错误吗 米皮不能 from typing import Dict Any def add items d Dict str Any gt None d foo 5 d Dict str str add items d f
  • Python - 字典和列表相交

    给定以下数据结构 找出这两种数据结构共有的交集键的最有效方法是什么 dict1 2A 3A 4B list1 2A 4B Expected output 2A 4B 如果这也能产生更快的输出 我可以将列表 不是 dict1 组织到任何其他数
  • Python:元类属性有时会覆盖类属性?

    下面代码的结果让我感到困惑 class MyClass type property def a self return 1 class MyObject object metaclass MyClass a 2 print MyObject
  • Python 分析:“‘select.poll’对象的‘poll’方法”是什么?

    我已经使用 python 分析了我的 python 代码cProfile模块并得到以下结果 ncalls tottime percall cumtime percall filename lineno function 13937860 9
  • PyAudio ErrNo 输入溢出 -9981

    我遇到了与用户相同的错误 Python 使用 Pyaudio 以 16000Hz 录制音频时出错 https stackoverflow com questions 12994981 python error audio recording

随机推荐

  • 【计算机网络】【湖科大MOOC】网络层路由选择协议概述 内部网关协议RIP和OSPF的工作原理、工作过程 详细解读

    目录 网络层 6 路由选择协议 6 1 概述 6 1 1 路由选择 类别 6 1 2 因特网所采用的路由选择协议的 主要特点 6 1 3 常见的 路由选择协议 6 1 4 路由器的基本结构 6 2 内部网关协议 路由信息协议 RIP Rou
  • kali linux配置网络代理

    一 命令行终端 1 进入 etc profile d目录 新建文件proxy sh 内容如下 kali kali etc profile d cat proxy sh export proxy http 192 168 150 1 7890
  • 【Zabbix实战之部署篇】Zabbix客户端的安装部署方法

    Zabbix实战之部署篇 Zabbix客户端的安装部署方法 一 Zabbix agent2介绍 1 Zabbix agent2简介 2 Zabbix agent2优点 3 主动模式和被动模式 二 环境规划 1 Zabbix服务器部署链接 2
  • 【探索Linux】—— 强大的命令行工具 P.4(编译器 gcc/g++ 使用)

    阅读导航 前言 一 编译的四大过程 背景知识 1 预处理 Preprocessing 2 编译 Compilation 3 汇编 Assembly 4 链接 Linking 二 gcc的使用 1 概念 2 gcc主要特性和命令行选项 三 g
  • MATLAB学习各类函数归类总结笔记(主要图像处理方面)

    A开头 B开头 bwlabel函数 调用格式 L bwlabel BW n 或 L num bwlabel BW n 返回一个和BW大小相同的L矩阵 包含了标记了BW中每个连通区域的类别标签 这些标签的值为1 2 num 连通区域的个数 n
  • 手写Promise.resolve,Promise.reject, Promise.all

    promise A 规范中说明promise有三种状态 且状态一旦被改变就不能再次发生变化 const PENDING Pending const FULFILLED Fulfilled const REJECTED Rejected cl
  • 普洛斯与宁德时代签署战略合作协议;高博昌平国际研究型医院成为北京自贸区首批签约项目

    今日看点 普洛斯宣布与宁德时代签署战略合作协议 双方凭借在各自产业领域内的领先优势 组建资产管理合资公司 持有 管理和运营宁德时代电池 储能系统及其支持的各类车辆 船舶等资产 通过绿色能源资产服务化 降低物流 运输等相关企业大规模使用新能源
  • econgnition选择面向对象的样本,输出shp并在arcmap里打开,随机平均分为训练样本和测试样本

    有不懂的可以看我发的前一篇 打开软件 进行一个尺度为100的多尺度分割 进行一个类别的加 然后用它上面那个蓝色的三角尺工具 这个工具是直接指定类别的 不是用来选择样本的 在toolbar第二个选条那里选择你要的类别 比如我是vegetati
  • maven的安装和配置

    一 下载maven 1 下载地址Maven Download Apache Maven 2 将下载的文件进行解压到任意目录 linux解压用tar xvf apache maven 3 6 3 bin tar gz 3 windows配置环
  • CVE-2019-3396 Confluence RCE漏洞简单粗暴复现

    CVE 2019 3396 Confluence RCE漏洞简单粗暴复现 1 前言 网上也有很多关于该漏洞的说明和复现 不再做过多阐述 在复现该漏洞时踩了一些坑 然后发现了一个快速复现的方法 所以本篇文章介绍的是如何简单快速地复现该漏洞 想
  • Quartz 之 JobKey 源码解读

    首先 我们看下上个博文 CronTrigger 示例2 中部分打印的日志内容 INFO 17 一月 09 41 40 016 下午 MyScheduler Worker 9 com example03 SimpleJob SimpleJob
  • 2021-01-25Redis存取list

    redis存取list类型数据 首先 为了避免高并发给myql数据库增加负担 所有大多数时候会利用redis数据库解决这个问题 1 首先启动redis服务 在bin目录下打开powshell命令如下 PS D devtools Redis
  • 浅谈程序分析

    孙军 新加坡管理大学教授 研究方向为 形式化方法 软件工程 安全等 爱好 爬山 攀岩等 如果读者想了解更多有关程序分析相关的技术内容 欢迎加入编程语言技术社区 SIG 程序分析 加入方式 文末有小助手微信 添加并备注加入 SIG 程序分析
  • 获取map中第一个数据值

    为什么80 的码农都做不了架构师 gt gt gt 获取map中第一个非空数据值 param
  • Git GUI基本操作

    一 Git GUI基本操作 1 版本库初始化 gitpractise文件夹就变成了Git可以管理的仓库 目录下多了一个 git文件夹 此目录是Git用于管理版本库的 不要擅自改动里面的文件 这样会破坏Git仓库 git文件夹默认是隐藏的 如
  • 二进制编码

    前言 我们都知道 一个程序是 数据结构 算法 如果对应到组成原理或者是硬件层面上来说 算法就是我们的各种计算机指令 而数据结构就是我们对应的二进制数据 字符串的表示 从编码到数字 其实不仅数字可以用字符串来表示 最典型的例子就是字符串 最早
  • Java基础5--数组

    Java基础5 数组 数组定义 数组是相同类型数据的有序集合 数组描述的是相同类型的若干个数据 按照一定的先后次序排列组合而成 其中 每一个数据称作一个数组元素 每个数组元素可以通过一个下标来访问它们 数组声明与创建 首先必须声明数组变量
  • NLTK: [Error:11004] getaddrinfo failed

    当我运行nltk的词分割时 from nltk tokenize import word tokenize text God is Great I won a lottery print word tokenize text 出现了缺少pu
  • 【Linux驱动】copy_to_user 、copy_from_user 函数

    用户一般访问内核 需要从用户态变为内核态 然后再访问内核 这么做的目的是防止用户随意篡改内核 在编写某个外设的驱动时 我们需要实现内核中的 read 和 write 函数 此时站在内核的角度 无法直接读取用户缓冲区 或者 无法直接向用户缓冲
  • GBDT与xgboost :流失预测 shap解释 调参 保存调参好的模型

    集成学习 集成学习的方式分为两类 个体的学习器之间存在强依赖关系 必须串行生成序列化方法 代表 Boosting 个体学习器之间不存在强依赖关系 可同时生成并行化方法 代表是Bagging和随机森林 bagging boosting sta