首页 > 编程语言 >Python中AdaBoost与GBDT模型【附代码】

Python中AdaBoost与GBDT模型【附代码】

时间:2024-03-13 20:33:17浏览次数:23  
标签:权重 Python 模型 算法 GBDT AdaBoost model

目录

1、AdaBoost算法的原理介绍

(1)AdaBoost算法核心思想

(2)AdaBoost算法数学原理概述

1、初始化各个样本点权重,各权重相等

2、计算误差率

3、调整弱学习区权重

4、更新样本点权重

5、反复迭代

6、正则化项

(3)AdaBoost算法的简单代码实现

2、案例 - AdaBoost信用卡精准营销模型

(1)背景

(2)模型搭建

1、读取数据

2、提取特征变量和目标变量

3、划分训练集和测试集

4、模型训练及搭建

(3)模型预测及评估

3、GBDT算法的原理介绍

(1)GBDT算法核心思想

(2)GBDT算法数学原理概述       

(3) GBDT算法数学原理举例

4、案例 - GBDT产品定价模型

(1)背景

(2)模型搭建

1、读取数据

2、提取特征变量和目标变量

3、划分训练集和测试集

4、模型训练及搭建

(3)模型预测及评估


1、AdaBoost算法的原理介绍

(1)AdaBoost算法核心思想

       AdaBoost算法 (Adaptive Boosting) 是一种有效而实用的Boosting算法,它以一种高度自适应的方法顺序地训练弱学习器。AdaBoost根据前一次的分类效果调整数据的权重,上一个弱学习器中错误分类样本的权重会在下一个弱学习器中增加,正确分类样本的权重会相应减少,并且在每一轮迭代时会向模型加入一个新的弱学习器。不断重复调整权重和训练弱学习器的过程,直到误分类数低于预设值或迭代次数达到指定最大迭代次数时,我们会得到一个强分类器。

       绘制了如下一张图来解释调整权重的概念,在步骤一中先切一刀对数就进行划分,此时将小三角形错误的划分到了圆形类别中,在步骤二便调整这一分类错误的小三角形的权重,使它变成一个大三角形,这样它和三角形类型的数据就更加接近了,因此重新分类时,它便能准确的分类到三角形类别

       预先设定AdaBoost算法在误分类数为0时终止迭代,即全部分类正确时(即误差率为0)停止迭代,并定义误差率为错误划分类别的样本权重之和,例如对于9个样本,每个样本的权重为1/9,若此时有2个样本划分错误,那么此时的误差率就是1/9 + 1/9=2/9。

算法步骤:

步骤一:设定各样本初始权重相等,均为1/9,切一刀划分类别使得误差率最低。

步骤二:误分类数为3,此时的误差率为1/9+1/9+1/9=1/3;这时提高分类错误的样本权重,降低分类正确的样本权重。

步骤三:根据新权重,再切一刀划分类别使得误差率最低。

步骤四:误分类数为2,未达到预设值0,重复步骤二。

步骤五:重复步骤三。

步骤六:误差率已达预设值0,建模结束。

(2)AdaBoost算法数学原理概述

         AdaBoost分类算法的流程图如下所示:

1、初始化各个样本点权重,各权重相等

2、计算误差率

       根据误差率e^{m}计算公式构造误差率最小的弱学习器Fm (x):

       误差率(错误划分类别的样本权重之和),这里是一个更加学术的写法,其中是样本i的权重,是弱学习器所预测的样本i的分类,也即预测值,是样本i的实际值,是一个指示函数,当括号内的条件成立时(也即预测失败)函数取值为1,否则(也即预测成功)取值为0。

3、调整弱学习区权重

       有了误差率之后,就可以调整原来弱学习器的权重了,计算弱学习器Fm(x)的系数ɑ:

       得到第m次迭代的强学习器:

4、更新样本点权重

       有了弱学习器的权重后,就可以更新原来样本点的权重。增大错误分类点的权重,减少正确分类点的权重,从而再之后的分类中实现较为准确的分类:

5、反复迭代

       将上面的过程反复迭代,代直到误分类数达到阈值或达到最大迭代次数。M次迭代后得到最终强学习器:

       其中sign(x)是符号函数,即:

6、正则化项

       为防止Adaboost过拟合,可以向模型加入正则化项,即为每个弱学习器的权重缩减系数ν,也即learning rate,也称之为学习率。取值范围为(0,1]取值较大意味着相同的学习效果,迭代次数更少,需要训练的弱学习器更少,取值较小意味着达到一定的误分类数或学习效果,需要更多迭代次数和更多弱学习器的迭代公式为:

       加入权重缩减系数后公式变为:

(3)AdaBoost算法的简单代码实现

      AdaBoost分类模型简单代码演示如下所示:

from sklearn.ensemble import AdaBoostClassifier
X = [[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]]
y = [0, 0, 0, 1, 1]

model = AdaBoostClassifier(random_state=123)
model.fit(X, y)

print(model.predict([[5, 5]]))

       AdaBoost分类模型简单代码演示如下所示:

from sklearn.ensemble import AdaBoostRegressor
X = [[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]]
y = [1, 2, 3, 4, 5]

model = AdaBoostRegressor(random_state=123)
model.fit(X, y)

print(model.predict([[5, 5]]))

2、案例 - AdaBoost信用卡精准营销模型

(1)背景

       当前经济增速下行,风控压力加大,各家商业银行纷纷投入更多资源拓展信用卡业务,信用卡产业飞速发展。因为市场竞争激烈,信用卡产品同质化严重,商业银行需要采用更快捷有效的方式扩大客户规模,实现精准营销,从而降低成本提高效益,增强自身竞争力。该精准营销模型也可以应用其他领域的精准营销,例如信托公司信托产品的精准营销等。

(2)模型搭建

1、读取数据

       首先读取1000条信用卡营销的客户数据,特征变量有客户的年龄,性别,月收入,月消费以及月消费与月收入之比,目标变量是精准营销后客户是否响应(即客户在营销后是否办了信用卡),取值为1代表精准营销有效,为0代表营销失败。其中有400个客户响应,600个客户没有响应。

import pandas as pd
df = pd.read_excel('信用卡精准营销模型.xlsx')
df.head()

2、提取特征变量和目标变量

       通过如下代码将特征变量和目标变量单独提取出来,代码如下:

X = df.drop(columns='响应') 
y = df['响应']

3、划分训练集和测试集

       提取完特征变量后需要将数据拆分为训练集及测试集。划分训练集和测试集的代码如下:

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=123)

4、模型训练及搭建

       划分为训练集和测试集之后,就可以从Scikit-Learn库中引入AdaBoost分类器模型进行模型训练了,代码如下:

from sklearn.ensemble import AdaBoostClassifier
clf = AdaBoostClassifier(random_state=123)
clf.fit(X_train, y_train)

(3)模型预测及评估

       通过第一行代码预测测试集数据,和类似的代码,我们可以将预测值和实际值进行对比:

a = pd.DataFrame()  
a['预测值'] = list(y_pred)
a['实际值'] = list(y_test)
a.head()

       可以看到此时前五项的预测准确度为100%,如果想看所有测试集数据的预测准确度,可以使用如下代码:

from sklearn.metrics import accuracy_score
score = accuracy_score(y_pred, y_test)
print(score)

       此时获得的模型准确度评分score为0.85,也就是说模型的预测准确度达到了85%。AdaBoost算法中弱学习器是分类决策树模型,其本质预测的并不是准确的0或1的分类,而是预测其属于某一分类的概率,可以通过如下代码查看预测属于各个分类的概率:

y_pred_proba = clf.predict_proba(X_test)
y_pred_proba[0:5] 

       利用代码绘制ROC曲线来评估模型预测的效果:

from sklearn.metrics import roc_curve
fpr, tpr, thres = roc_curve(y_test.values, y_pred_proba[:,1])
import matplotlib.pyplot as plt
plt.plot(fpr, tpr)
plt.show()

       通过如下代码求出模型的AUC值:

from sklearn.metrics import roc_auc_score
score = roc_auc_score(y_test, y_pred_proba[:,1])

       将获得AUC值打印出来为:0.9559

       通过如下特征重要性相关知识点进行整理,方便结果呈现,代码如下:

features = X.columns  
importances = clf.feature_importances_  

importances_df = pd.DataFrame()
importances_df['特征名称'] = features
importances_df['特征重要性'] = importances
importances_df.sort_values('特征重要性', ascending=False)

3、GBDT算法的原理介绍

(1)GBDT算法核心思想

       GBDT算法则将损失函数的负梯度作为残差的近似值,不断使用残差迭代和拟合回归树最终生成强学习器。简单来说,AdaBoost算法是调整权重,而GBDT算法则是拟合残差。我们通过一个简单案例来阐明这一核心思想:以简单的信用卡额度预测为例,以下有4个客户样本,特征变量X为年龄和月收入,目标变量y是信用卡额度。

       假设我们建立的第一棵决策树如下:

       下面的步骤就是GBDT算法的核心思想体现了:我们将构造一颗新的决策树来拟合第一棵树的产生的残差,注意我们这里拟合的是残差,这时构造的拟合残差的决策树如下所示:

       因此最终的模型就是如下所示多个模型集成在一起的内容,这个也充分体现了集成算法集成的思想。

(2)GBDT算法数学原理概述       

       迭代模型为:

       对GBDT来说,只需要简单地拟合当前模型的残差,以下为算法步骤:

(3) GBDT算法数学原理举例

       GBDT分类模型简单代码演示如下所示:

from sklearn.ensemble import GradientBoostingClassifier
X = [[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]]
y = [0, 0, 0, 1, 1]

model = GradientBoostingClassifier(random_state=123)
model.fit(X, y)

print(model.predict([[5, 5]]))

       GBDT回归模型简单代码演示如下所示:

from sklearn.ensemble import GradientBoostingRegressor
X = [[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]]
y = [1, 2, 3, 4, 5]

model = GradientBoostingRegressor(random_state=123)
model.fit(X, y)

print(model.predict([[5, 5]]))

4、案例 - GBDT产品定价模型

(1)背景

       出版社在对图书进行定价的时候会考虑图书的页数,纸张,类别,作者,内容,读者等各个方面。因为定价所需要考虑的因素较多,人工考虑起来较为繁琐,并且容易遗漏。如果我们能够建立一个模型综合考虑各方面因素并对图书进行定价,那么就能节约成本,提升效率,并契合买者需求,提高销售量挖掘潜在利润。该产品定价模型也可以用于其他领域的产品定价模型,例如金融产品的定价模型。

(2)模型搭建

1、读取数据

       首先读取1000条图书价格数据,特征变量有图书的页数,类别,彩印和纸张,目标变量是图书的定价。这里为了方便演示,只选取了4个特征变量

import pandas as pd
df = pd.read_excel('产品定价模型.xlsx')
df.head()

        通过value_counts()函数查看这1000本图书有哪些类别及各个类别对应的比例:

df['类别'].value_counts()

       结果如下:

技术类    336
教辅类    333
办公类    331
Name: 类别, dtype: int64

       因为“类别”和“纸张”两列是分类型文本变量,因此可以采用LabelEncoder()函数对分类变量进行编号,以便于后续的模型拟合:

[5]
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
df['类别'] = le.fit_transform(df['类别'])

       因为这里的类别并不多,所以也可以用pandas库中的replace()函数来进行替换,代码如下:

df['类别'] = df['类别'].replace({'办公类': 0, '技术类': 1, '教辅类': 2})  

2、提取特征变量和目标变量

       通过如下代码将特征变量和目标变量单独提取出来:

X = df.drop(columns='价格') 
y = df['价格']  

3、划分训练集和测试集

       提取完特征变量后需要将数据拆分为训练集及测试集。划分训练集和测试集的代码如下:

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=123)

4、模型训练及搭建

       划分为训练集和测试集之后,就可以从Scikit-Learn库中引入GBDT模型进行模型训练了,代码如下:

from sklearn.ensemble import GradientBoostingRegressor
model = GradientBoostingRegressor(random_state=123)
model.fit(X_train, y_train)

(3)模型预测及评估

       我们还可以通过模型自带的score()函数来查看模型预测的效果:

y_pred = model.predict(X_test)
print(y_pred[0:50])

       此时获得的模型准确度评分score为0.874,说明模型的效果不错,这个评分其实也就是模型的R-squared值(也即统计学中常说的R^{2}),通过如下代码查看模型的R-squared值,来评判模型的拟合程度:

from sklearn.metrics import r2_score
r2 = r2_score(y_test, model.predict(X_test))
print(r2)

       得出评分为0.874,与模型自带的score结果相同。

标签:权重,Python,模型,算法,GBDT,AdaBoost,model
From: https://blog.csdn.net/weixin_60476982/article/details/136688925

相关文章

  • 在vscode中如何利用快捷键运行python文件
    通常运行python文件只能选择调试运行,或者右键点击需要鼠标点击比较麻烦可以自己设置一个快捷键在上方的搜索框键入>运行python文件点击这个齿轮由于我设置过了快捷键所以能看到Shift+R点击图中的标识,你就能编辑你想要的快捷键随后你就可以用新设置的快捷键在终端直......
  • 【华为OD机试真题 Python】人气最高的店铺|解题思路、代码解析
    文章目录题目描述输入输出示例1输入输出说明示例2输入输出说明解题思路实现代码题目描述某购物城有m个商铺,现决定举办一场活动选出人气最高店铺。活动共有n位市民参与,每位市民只能投一票,但1号店铺如果给该市民发放q元的购物补贴,该市民会改......
  • Python collections详细介绍及实例
    Python的collections库提供了许多有用的数据结构,这些数据结构是对内建数据类型的补充。以下是一些collections库中主要数据结构的详细介绍和示例:CounterCounter是一个字典子类,用于计数可哈希对象。常用于统计字符出现的次数、列表中元素出现的次数等。示例:fromcollections......
  • 运维常用的Python第三方模块及实例
    在运维工作中,Python是一种非常流行的脚本语言,因为它具有简洁的语法、丰富的库和跨平台的能力。运维工程师经常使用Python来编写自动化脚本,以简化日常任务。以下是一些运维常用的Python第三方模块及其示例:paramiko-用于SSH连接和执行命令。示例:importparamikossh=par......
  • python内置函数 C
    python内置函数CPython解释器内置了很多函数和类型,任何时候都能使用。C名称描述callable检查一个对象是否是可调用的。chr将整数(表示Unicode码点)转换为对应的字符。classmethod将一个方法转变为类方法。compile将源代码字符串编译为字节码对象。complex创建复数。call......
  • python内置函数 A
    python内置函数APython解释器内置了很多函数和类型,任何时候都能使用。A名称描述abs返回一个数的绝对值。aiter返回对象的异步迭代器。all所有元素均为真值(或可迭代对象为空)则返回True。anext获取异步迭代器中的下一个异步项。any任一元素为真值则返回True。ascii返......
  • Python 内置模块及实例
    Python有许多内置模块,这些模块提供了各种功能,如数学运算、文件操作、日期和时间处理、数据压缩等。以下是一些常用内置模块及其简单实例:math-提供数学函数和常量。实例:importmathprint(math.sqrt(16))#输出:4.0print(math.pi)#输出:3.1415926535897......
  • L2-033 简单计算器(Python)
    作者 陈越单位 浙江大学本题要求你为初学数据结构的小伙伴设计一款简单的利用堆栈执行的计算器。如上图所示,计算器由两个堆栈组成,一个堆栈 S1​ 存放数字,另一个堆栈 S2​ 存放运算符。计算器的最下方有一个等号键,每次按下这个键,计算器就执行以下操作:从 S1​ 中弹......
  • Python 函数的参数传递 *args和 **kwargs
    知识点:在函数调用时,*会以单个元素的形式解包一个元祖,使其成为独立的参数。在函数调用时,**会以键/值对的形式解包一个字典,使其成为独立的关键字参数。 deff(a,*args):print(args)f(1,2,3,4)​```输出为:(2,3,4)​```虽然传入1,2,3,4,但是解包为(1),(2,3,4),其中a是1......
  • 【分享】记一次项目迁移(docker java | docker python)
    项目:前端Vue3,后端Python+Java,数据库Redis+MySQL原先部署在centos7里面的,使用的宝塔面板部署的,还算方便。但是服务器要到期了,要将项目迁移到另外一台服务器。另外一台服务器是opencloudos+1plane本来想构建一个jdk1.8+python3.12+Nodejs环境的镜像奈何本人没学过docker,操作起......