机器学习——集成学习对决策树准确率的优化

提升法

提升法与装袋法相比每次的训练样本均为同一组,并且引入了权重的概念,给每个单独的训练样本都会分配一个相同的初始权重。然后进行T轮训练,每一轮中使用一个分类方法训练出一个分类模型,使用此分类模型对所有样本进行分类并更新所有样本的权重,分类正确的样本都会生成一个分类模型,而每次生成的这个分类模型都会更加注意之前分类错误的样本,从而提升分类样本的准确率。对于新的样本,将T论训练出的T个分类模型得出的预测结果加权平均,即可得出最终的预测结果。

在提升法中,有两个主要问题需要解决:

  • 如何在每轮算法结束之后根据分类情况更新样本的权重
  • 如何组合每一轮算法产生的分类模型得出预测结果。

下面我们使用AdaBoost算法介绍提升法的实现过程。

https://baike.baidu.com/item/adaboost/4531273?fr=aladdin

下面我们基于sklearn库中的提升法分类器对决策树进行优化,提高分类准确率。其中load_breast_cancer()方法加载乳腺癌数据集,自变量(细胞核的特征)和因变量(良性、恶性)分别赋给X和Y变量。

代码如下所示:

from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.ensemble import AdaBoostClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn import datasets
dataset_all=datasets.load_breast_cancer()
X=dataset_all.data
Y=dataset_all.target
seed=42
kfold=KFold(n_splits=10,random_state=seed)
dtree=DecisionTreeClassifier(criterion='gini',max_depth=3)
dtree=dtree.fit(X,Y)
result=cross_val_score(dtree,X,Y,cv=kfold)
print('决策树结果:',result.mean())
model=AdaBoostClassifier(base_estimator=dtree,n_estimators=100,random_state=seed)
result=cross_val_score(model,X,Y,cv=kfold)
print("提升法改进结果:",result.mean())

其中,dtree为决策树分类器,model为sklearn库中自带的AdaBoost分类器,两种算法的效果验证均采用k折交叉验证的方法,AdaBoostClassifier构造方法中的n_estimators表示创建100个分类模型。运行结果如下所示:

GBDT 

梯度提升决策树是一种迭代决策树算法,主要用于回归,经过改进后也可以用于实现分类任务。GBDT的实现思想是构建多棵决策树,并将所有决策树的输出结果进行综合,得到最终的结果。

GBDT算法的构建过程与分类决策树类型,主要区别在于回归树节点的数据类型为连续型数据,每一个节点均有一个具体数值,此数值是改叶子节点上所有样本数值的平均值。同时,衡量每个节点的每个分支属性表现,不再使用熵、信息增益或Gini指标等纯度指标,而是通过最小化每个节点的损失函数值来进行每个节点处的分裂。

回归树分类终止的条件为每个叶子节点上的样本数值唯一,或者达到预设的终止条件,如决策树层数、叶子节点个数达到上限。若最终存在叶子节点上的样本数值不唯一,但仍以该节点上的所有样本的平均值作为该节点的回归预测结果。

提升决策树使用提升法的思想,结合多棵决策树来共同进行决策。首先介绍GBDT算法中的残差概念,残差值为真实值与决策树预测值之间的差。GBDT算法采用平均误差作为损失函数,每一棵回归树均学习之前所有决策树累加起来的残差,拟合得到当前的残差决策树。提升决策树是利用加法模型和前项分布算法来实现学习和过程优化。当提升树使用的是平方误差这种损失函数时,每一步的优化往往就变得很艰难。

对于GBDT算法的具体实现,最为出色的是XGBoost树提升系统,此模型的性能已得到广泛的认可,并被大量应用于kaggle等数据挖掘比赛中,取得了极好的效果。在XGBoost系统实现的过程中对于GBDT算法进行了多方面的优化。

下面是一个简单的实现:

import pandas as pd
import xgboost as xgb
df=pd.DataFrame({'x':[1,2,3],'y':[10,20,30]})
X_train=df.drop('y',axis=1)
Y_train=df['y']
T_train_xgb=xgb.DMatrix(X_train,Y_train)
params={"objective":"reg:linear","booster":"gblinear"}
gbm=xgb.train(dtrain=T_train_xgb,params=params)
Y_pred=gbm.predict(xgb.DMatrix(pd.DataFrame({'x':[4,5]})))
print(Y_pred)

调用XGBoost中train()方法进行训练,参数objective表示学习目标,此处reg:linear代表使用线性回归的方法,Booster参数是控制每一步提升的方法,这里使用线性模型gblinear,另外可选择gbtree,即于树的模型。

训练结果如下:

猜你喜欢

转载自blog.csdn.net/qq_41338249/article/details/84967561