用Python实现GBDT算法并处理Iris数据集

GBDT,梯度提升树属于一种有监督的集成学习方法,与之前学习的监督算法类似,同样可以用于分类问题的识别和预测问题的解决。该集成算法体现了三个方面的又是,分别是提升Boosting、梯度Gradient、决策树Decision Tree。“提升”是指将多个弱分类器通过线下组合实现强分类器的过程;“梯度”指的是在Boosting过程中求解损失函数时增加了灵活性和便捷性,“决策树”是指算法所使用的弱分类器为CART决策树,该决策树具有简单直观、通俗易懂的特性。

GBDT模型对数据类型不做任何限制,既可以是连续的数值型,也可以是离散的字符型(但在Python的落地过程中需要将字符型变量做数值化处理或者哑变量处理)。相对于SVM模型来说,较少参数的GBDT具有更高的准确率和更少的运算时间,GBDT模型在面对异常数据时具有更强的稳定性。由于上面种种优点,GBDT常常被广大用户所采用。

最具代表的提升树算法为AdaBoost算法,即:

 

其中F(x)是由M棵基础决策树构成的最终提升树,F_(m-1) (x)表示经过m-1轮迭代后的提升树,α_m为第m棵基础决策树所对应的权重,f_m (x)为第m棵基础决策树。
AdaBoost算法在解决分类问题时,它的核心就是不停地改变样本点的权重,并将每一轮的基础决策树通过权重的方式进行线性组合。该算法在迭代过程中需要进行如下四个步骤:

在这里举一个简单的例子。如下表:

x

0

1

2

3

4

5

6

7

8

9

y

1

1

1

-1

-1

-1

1

1

1

-1

故第一轮迭代结果为:

x

0

1

2

3

4

5

6

7

8

9

y实际

1

1

1

-1

-1

-1

1

1

1

-1

预测得分

0.424

0.424

0.424

-0.424

-0.424

-0.424

-0.424

-0.424

-0.424

-0.424

y预测

1

1

1

-1

-1

-1

-1

-1

-1

-1

显然6、7、8三个点的预测结果是错的,所以它们对应的权重也是最大的,在进入第二轮时,模型会更加关注这三个点。

AdaBoost算法具体在Python上的实现方式为导入sklearn中的子模块ensemble,从中调用AdaBoostClassifier类。

在这里我再次使用Iris数据集进行测试,原码及效果为如下:

adaBoost = ensemble.AdaBoostClassifier()
adaBoost.fit(x_train,y_train)
predict = adaBoost.predict(x_test)
print('Accuracy: ',metrics.accuracy_score(y_test,predict))
print('Report :\n',metrics.classification_report(y_test,predict))

Accuracy: 0.7
Report :
precision recall f1-score support

0.0 1.00 0.92 0.96 12
1.0 0.62 0.67 0.64 12
2.0 0.33 0.33 0.33 6

micro avg 0.70 0.70 0.70 30
macro avg 0.65 0.64 0.64 30
weighted avg 0.71 0.70 0.71 30

posted @ 2019-05-19 17:40  国梁  阅读(2861)  评论(0编辑  收藏  举报