目录
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、计算误差率
根据误差率计算公式构造误差率最小的弱学习器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-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