首页 > 编程知识 正文

xgboost算法优点,xgboost并行原理

时间:2023-05-04 13:30:39 阅读:32107 作者:3135

是个问题。 在CSDN中如何编辑公式?

XGBoost算法是从GBDT算法发展而来的,GBDT算法在求解优化问题时应用了一阶微分技术,而XGBoost不仅使用了损耗函数的一阶微分和二阶微分,

也可以自己定义损失函数。 自己定义损耗函数的前提是损耗函数可以一阶导和二阶导。

XGBoost算法的原理: (一定保证先学习决策树算法)其实算法的原理是不断在一个决策树中添加树,比如在n-1棵树中添加树成为n棵树的同时算法精度提高,效果更好

基础理解:

损耗函数:L(yi,yi^ ) (yi-yi^ ) *2)在此,损耗函数以色散损耗为例。 因为容易计算和符号表达,所以这个也很好。 当然损失函数可以变更】

如何优化? (f* ) x )=argmine(x,y ) (l ) y,f ) x ) )

最终,集成算法显示: yi^=sum(fk(Xi ); 其中k=1~K; fk属于f

yi0^=0

(Yi1^=F1(Xi )=yi0 ^ f1 (Xi ) ) () ) ) ) ) ) ) 652 )

(y2^=F1(Xi ) F2 ) Xi )=yi1 ^ F2 (Xi ) ) ) ) ) ) ) 65

.

yin^=sum(fk(Xi ) )=yi{n-1}^fn ) Xi ); 但是,k=1~n。

推导过程:在样品中着手计算,样品真值yi、预测值yi^。

在目标:obj{t}=sum(L(yi,yi^{t-1}ft ) Xi ) ) c中,c是常数,i=1~n至n,u ) ft是L2正则化的罚函数

(明确地说L2正则项:QtLambad*1/2*sum(wj**2) )其中j=1~T到t; qT是某个常数,t是叶节点的个数)

知识补充:

可靠的整子展开3360f(xx ) (f ) x ) f ) x )的一阶导(x ) f ) x )的二阶导定义:gi=g(y(t-1 ) ^}*L ) yi,y ) t-1 } hi gi是一次导,hi是二次导。 因此,目标函数变换由obj{t}~sum(l(yi,yi{t-1}^ ) gi * ft (Xi )1/2* hi * ft (Xi ) **2); 但i=1~n。 实际上,L(yi,yi{t-1}^ )一次也不变,收敛于某个特定的常数,因此相当于常数值。

重新转换:得到obj{t}~sum(gi*ft(Xi )1/2* hi * ft (Xi ) *2) u ) ft ); 但i=1~n。

将示例中的遍历计算转换为叶节点中的遍历计算: obj{t}=sum((sum(gi,I属于Ij ) wj1/2* ) sum(hi,I属于Ij ) lambad ) * wj**2

最终目标函数简化为:obj{t}=sum(gj*wj1/2* ) HJlambad ) * wj**2) qT; 其中gj=sum(gi,I属于Ij ),gj=sum(gi,I属于Ij )。

求最终目标函数:一致操作:求偏导数,偏导数为0,代入原函数;

对j(ft ) wj求偏导数=gj(HJlambad ) wj=0wj=-)=gj(HJlambad )如果将wj带回原始obj(t )最终目标函数,则obj=-1/2*sum ) gj 添加新节点时模型复杂性的代价是:gain=1/2*(g(l ) *2/) h ) lambad(- ) r ) *2/(h ) r ) lambad(- ) l ) r )

XG boost的思路总结:1 .根据数据集初始化一棵树2 .确定损耗函数3 .提取树作为引导“样本遍历计算”的过程,通过函数变换得到“叶节点上的遍历计算”,进行模型4 .虽然可以根据计算所得模型的复杂度设置复杂度阈值,但如果计算资源成本过大,也不太好。

在wl包中安装XG boost后,在import中部署即可使用

其中,xgboost模块的XGBClassifier类是分类问题的解决,XGBRegressor类是回归问题的解决。

XG boost.xgbclassifier (max _ depth=3,learning_rate=0.1,n_estimators=100,silent=True,objective=‘biective’

nthread=None,gamma=0,min_child_weight=1,max_delta_step=0,subsample=1,colsample_bytree=1,

reg_lambda=1,scale_pos_weight=1,base_score=0.5,ran

dom_state=0,seed=None,missing=None)

xgboost.XGBRegressor(max_depth=3,learning_rate=0.1,n_estimators=100,silent=True,objective=‘binary:linear’,booster=‘gbtree’,n_jobs=1, nthread=None,gamma=0,min_child_weight=1,max_delta_step=0,subsample=1,colsample_bytree=1,colsample_bylevel=1,reg_alpha=0,reg_lambda=1,
scale_pos_weight=1,base_score=0.5,random_state=0,seed=None,missing=None)

参数解释: max_depth用于指定每个基础模型所包含的最大深度、默认为3层。learning_rate 用于指定模型迭代的学习率(步长)、默认为0.1;【与前面的提升树模型、梯度提升树模型含义相同】n_estimators 用于指定基础模型的数量、默认为100个。silent:bool类型参数,是否输出算法运行过程中的日志信息,默认为True。objective用于指定目标函数中的损失函数类型,1.对于分类类型的XGBoost算法、默认损失函数为二分类的Logistic损失(模型返回概率值)函数,也可以是’multi:softmax’表示处理多分类的损失函数(模型返回类别值)、还可以是’multi:softprob’处理多分类(模型返回各类别对应的概率值)。 2.对于预测型的XGBoost算法,默认损失函数为线性回归损失’binary:linear’。booster:用于指定基础模型的类型,默认为’gbtree’,即CART模型,也可以是’gblinear’表示基础模型为线性模型。nthread:用于指定XGBoost算法在运行时所使用的线程数、默认为None表示计算机最大可能的线程数。gamma:用于指定节点分割所需的最小损失函数下降值,即增益值Gain的阈值,默认为0.min_child_weight : 用于指定叶子节点中各样本点二阶导之和的最小值,即Hj的最小值,默认为1,该参数的值越小模型越容易过拟合,max_delta_step:用于指定模型在更新过程中的步长,如果为0表示没有约束;如果取值为某个较小的正数就会导致模型更加保守。subsample:用于指定构建基础模型所使用的抽样比例,默认为1,表示使用原始数据构建每一个基础模型;当抽样比例小于1时,表示构建随机梯度提升树模型,通常会导致模型的方差降低、偏差提高。colsample_bytree:用于指定每个基础模型所需要的采样字段比例,默认为1表示使用原始数据的所有字段。colsample_bylevel:用于指定每个基础模型在节点分割时所需的采样字段比例,默认为1表示使用原始数据的所有字段。reg_alpha:用于指定L1正则项的系数、默认为0。reg_lambda:用于指定L2正则项的系数、默认为1。scale_pos_weight:当各类别样本的比例十分不平衡时,通过设定该参数为一个正值可以使算法更快收敛。base_score:用于指定所有样本的初始化预测得分,默认为0.5。random_state:默认为0表示使用默认的随机数生成器。seed:与random_state相同。missing:用于指定缺失值的表示方法,默认为None,即NaN为默认值。 XGBoost实战案例 数据集:信用卡欺诈数据集、来源于kaggle网站。包含25个变量、284807条记录,因变量为class表示用户在交易中是否发生欺诈行为(0表示不欺诈、1表示欺诈)由于数据涉及敏感信息、文件中已经做好了主成分分析(PCA)处理。

读取数据:

import pandas as pdcreditcard = pd.read_csv(r'creditcard.csv')creditcard.head(5)

查看各类别的标签比例:

#探索查看各类别的比例差异import matplotlib.pyplot as pltplt.rcParams['font.sans-serif']=['SimHei']plt.rcParams['axes.unicode_minus'] = False# 为确保绘制的饼图为圆形,需执行如下代码plt.axes(aspect = 'equal')# 统计交易是否为欺诈的频数counts = creditcard.Class.value_counts()# 绘制饼图plt.pie(x = counts, # 绘图数据 labels=pd.Series(counts.index).map({0:'正常',1:'欺诈'}), # 添加文字标签 autopct='%.2f%%' # 设置百分比的格式,这里保留一位小数 )# 显示图形plt.show()

在28w条交易数据中、欺诈交易仅占0.17%,两个类别的比例存在严重的不平衡。
如果直接建模则模型的准确率会偏向多数类别的样本,而正确预测交易为欺诈的概率几乎为0.所以,需要使用SMOTE算法转换为相对平衡的数据:

from sklearn import model_selection# 将数据拆分为训练集和测试集# 删除自变量中的Time变量X = creditcard.drop(['Time','Class'], axis = 1)y = creditcard.Class# 数据拆分X_train,X_test,y_train,y_test = model_selection.train_test_split(X,y,test_size = 0.3, random_state = 1234)from imblearn.over_sampling import SMOTE# 运用SMOTE算法实现训练数据集的平衡over_samples = SMOTE(random_state=1234) over_samples_X,over_samples_y = over_samples.fit_sample(X_train, y_train)#over_samples_X, over_samples_y = over_samples.fit_sample(X_train.values,y_train.values.ravel())# 重抽样前的类别比例print(y_train.value_counts()/len(y_train))# 重抽样后的类别比例print('')print(pd.Series(over_samples_y).value_counts()/len(over_samples_y))

使用默认参数直接建模:(也可以进行交叉验证以及其它方式找出最优参数,但我的目的是想看一下处理非平衡数据以及不处理非平衡数据会是怎么样的一种对比)

from sklearn import metricsimport xgboostimport numpy as np# 构建XGBoost分类器xgboost = xgboost.XGBClassifier()# 使用重抽样后的数据,对其建模xgboost.fit(over_samples_X,over_samples_y)# 将模型运用到测试数据集中resample_pred = xgboost.predict(np.array(X_test)) #传入的是array# 返回模型的预测效果print('模型的准确率为:n',metrics.accuracy_score(y_test, resample_pred))print('模型的评估报告:n',metrics.classification_report(y_test, resample_pred))

计算欺诈交易的概率值,用于生成ROC曲线的数据:

y_score = xgboost.predict_proba(np.array(X_test))[:,1]fpr,tpr,threshold = metrics.roc_curve(y_test, y_score)# 计算AUC的值roc_auc = metrics.auc(fpr,tpr)# 绘制面积图plt.stackplot(fpr, tpr, color='steelblue', alpha = 0.5, edgecolor = 'black')# 添加边际线plt.plot(fpr, tpr, color='black', lw = 1)# 添加对角线plt.plot([0,1],[0,1], color = 'red', linestyle = '--')# 添加文本信息plt.text(0.5,0.3,'ROC curve (area = %0.2f)' % roc_auc)# 添加x轴与y轴标签plt.xlabel('1-Specificity')plt.ylabel('Sensitivity')# 显示图形plt.show()

利用不平衡数据建模进行对比一下

# 构建XGBoost分类器import xgboostxgboost2 = xgboost.XGBClassifier()# 使用非平衡的训练数据集拟合模型xgboost2.fit(X_train,y_train)# 基于拟合的模型对测试数据集进行预测pred2 = xgboost2.predict(X_test)# 混淆矩阵pd.crosstab(pred2,y_test) # 返回模型的预测效果print('模型的准确率为:n',metrics.accuracy_score(y_test, pred2))print('模型的评估报告:n',metrics.classification_report(y_test, pred2))

计算欺诈交易的概率值,用于生成ROC曲线的数据:

y_score = xgboost2.predict_proba(X_test)[:,1]fpr,tpr,threshold = metrics.roc_curve(y_test, y_score)# 计算AUC的值roc_auc = metrics.auc(fpr,tpr)# 绘制面积图plt.stackplot(fpr, tpr, color='steelblue', alpha = 0.5, edgecolor = 'black')# 添加边际线plt.plot(fpr, tpr, color='black', lw = 1)# 添加对角线plt.plot([0,1],[0,1], color = 'red', linestyle = '--')# 添加文本信息plt.text(0.5,0.3,'ROC curve (area = %0.2f)' % roc_auc)# 添加x轴与y轴标签plt.xlabel('1-Specificity')plt.ylabel('Sensitivity')# 显示图形plt.show()

AUC值一个是0.98,一个是0.97,虽然处理非平衡数据过后只是提升了0.01,但是也算是得到了优化。
希望大家能多多给予意见和建议。谢谢。
欢迎加入QQ群一起学习和交流,只为学习和交流:275259334

或者直接扫码加入:

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。