欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

MachineLearning—AdaBoost算法代码应用实现

程序员文章站 2022-06-18 10:58:50
...

AdaBoost包含分类和回归两类,即AdaBoostClassifier和AdaBoostRegressor,其中分类使用了两种算法即SAMME和SAMME.R,在对AdaBoost算法进行调参时,主要包括两个部分。第一个是AdaBoost框架调参,另一个是对我们选择的弱分类器进行调参。下面以分类算法为例讲解。

 

base_estimator:弱学习器,默认一般是CART分类回归树,即DecisionTreeClassifier、DecisionTreeRegressor

algorithm:只AdaBoost分类算法有,其中SAMME使用样本集分类效果作为弱学习器权重,SAMME.R使用样本集分类的预测概率大小作为弱学习器权重。SAMME.R使用了概率度量的连续值,迭代一般比SAMME快,因此AdaBoostClassifier的默认算法algorithm的值也是SAMME.R。

loss:AdaBoost回归算法中用到,默认线性损失函数。线性误差、均方误差、指数误差。

n_estimators:弱学习的个数,默认50

learning_rate:取值范围0到1,代表的是弱学习器的权重衰减系数。

 

上面介绍的是框架的参数,下面介绍的是弱学习器参数。

max_features:默认分割时考虑所有特征,当特征很多时可以考虑按部分特征进行分割。

max_depth:决策树最大深度

min_samples_split:当某个叶节点样本数小于这个值时,则停止继续划分子树

min_samples_leaf:当某个叶节点样本数小于这个值时,则跟兄弟节点一起被剪枝

max_leaf_nodes:通过限制最大叶子节点数,可以防止过拟合

 

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
from sklearn.ensemble import AdaBoostClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import make_gaussian_quantiles

#生成2维正态分布,生成的数据按分位数分为两组,500个样本,2个样本特征,协方差系数为2
X1, y1 = make_gaussian_quantiles(cov=2.0,n_samples=500, n_features=2,n_classes=2, random_state=1)  #X1包含xy坐标,y1包含分组标签

#生成2维正态分布,生成的数据按分位数分为两组,400个样本,2个样本特征均值都为3,协方差系数为2
X2, y2 = make_gaussian_quantiles(mean=(3, 3), cov=1.5,n_samples=400, n_features=2, n_classes=2, random_state=1)

X = np.concatenate((X1, X2))
y = np.concatenate((y1, - y2 + 1))  #y2与y1标签正好相反
plt.scatter(X[:, 0], X[:, 1], marker='o', c=y)

MachineLearning—AdaBoost算法代码应用实现

bdt = AdaBoostClassifier(DecisionTreeClassifier(max_depth=2, min_samples_split=20, min_samples_leaf=5),
                         algorithm="SAMME",
                         n_estimators=200, learning_rate=0.8) #最大深度为2,叶节点中样本数小于20时不再分割,叶节点中样本点数小于5的剪枝
bdt.fit(X, y)
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.02),
                     np.arange(y_min, y_max, 0.02))

Z = bdt.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
cs = plt.contourf(xx, yy, Z, cmap=plt.cm.Paired)
plt.scatter(X[:, 0], X[:, 1], marker='o', c=y)
plt.show()

print("Score:", bdt.score(X,y))
Score: 0.913333333333

MachineLearning—AdaBoost算法代码应用实现

bdt = AdaBoostClassifier(DecisionTreeClassifier(max_depth=2, min_samples_split=20, min_samples_leaf=5),
                         algorithm="SAMME",
                         n_estimators=200, learning_rate=0.5)
bdt.fit(X, y)
print("Score:", bdt.score(X,y))
Score: 0.895555555556