1.Aadboost算法
boosting思想算法
boosting算法是将弱学习器提升为强学习器的算法,其思想是用几个仅比随机猜测好的傻子学习器反复进行学习,每次学习时候都更关注上次分类错误的样本,过程如下:
- 从初始训练集训练一个基学习器:从训练集D中以无放回抽样方式随机抽取一个训练子集d1,用于弱学习机C1的训练。
- 根据基学习器的表现对样本进行调整,使先前分类错误的样本在下一次训练时得到更多的关注。
- 基于调整后的样本分布来训练下一个学习器。
- 重复进行,直到基学习器数目达到指定值T,将这T个学习器进行投票,组成多个弱学习器。
adaboost算法模型
Adaboost与原始的boosting过程不同,它使用整个训练集来训练弱学习机,其中训练样本在每次迭代中都会被重新赋予一个权重,在上一弱学习机错误的基础上进行学习,进而构建一个更加强大的分类器。
adaboost提高过程
-
训练过程:
-对于每一个新的学习器,AdaBoost改变训练数据的权值,也就是样本的概率分布,其思想是将关注点放在被错误分类的样本上,减小上一轮被正确分类的样本权值,提高那些被错误分类的样本权值。然后,再根据所采用的一些基本机器学习算法进行学习。 -
集成过程
-AdaBoost采用加权多数表决的方法,加大分类误差率小的弱分类器的权重,减小分类误差率大的弱分类器的权重。使正确率更高的分类器有更大的发言权
adaboost集成过程
- 在训练集中,给所有样本赋予相同的权重。比如训练集有m个样本,那么每
个样本的权重都是1/m。 - 根据给定的迭代次数n,进行n次循环,其中第j次做如下操作:
- 训练一个加权的弱学习机:Cj = train(X, y, W)。W表示所有样本的权重矩阵。
- 用这个加权的弱学习机预测样本类标y’ = predict(Cj, X)。
- 计算权重错误率:
ε= W(Y’ != Y)= w1(y1’ != y1) + w2(y2’ != y2) +…+ wn(yn’ != yn) ,
Y’表示预测结果矩阵,Y表示真实类别矩阵。
如果弱分类器预测错误,(yj’ != yj) == 1;
如果弱分类器预测正确,(yj’ != yj) == 0。
如果权重错误率ε= 0,则跳出循环,不用继续迭代了。 - 计算相关系数:αj =0.5*ln((1 – ε) / ε)。错误率越低,相关系数αj越大,这相当于给分类效果好的分类器在最后的投票中赋予更大的权重。
- 更新权重:
W = Wexp(-αj * Y’ * Y),*
如果某个样本预测错了,则:
yj’ * yj == -1,-αj * yj’ * yj > 0,exp(-αj * yj’ * yj) > 1
(exp(x)是计算e的x次方的指数函数),wj * exp(-αj * yj’ * yj) > wj。
在更新权重这一步,实现了对误分类的样本赋予更高的权重。 - 归一化权重,使其和为1。(3)~(8)为一个迭代。
- 完成最终的预测:Y’ = sign() ,大于0为1,小于0为-1。
实验过程
导入模块
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
from matplotlib.font_manager import FontProperties
from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import AdaBoostClassifier
%matplotlib inline
font = FontProperties(fname='/Library/Fonts/Heiti.ttc')
导入数据
实验数据为鸢尾花
X = iris_data.data[:, [2, 3]]
y = iris_data.target
label_list = ['山鸢尾', '杂色鸢尾', '维吉尼亚鸢尾']
构造决策边界
def plot_decision_regions(X, y, classifier=None):
marker_list = ['o', 'x', 's']
color_list = ['r', 'b', 'g']
cmap = ListedColormap(color_list[:len(np.unique(y))])
x1_min, x1_max = X[:, 0].min()-1, X[:, 0].max()+1
x2_min, x2_max = X[:, 1].min()-1, X[:, 1].max()+1
t1 = np.linspace(x1_min, x1_max, 666)
t2 = np.linspace(x2_min, x2_max, 666)
x1, x2 = np.meshgrid(t1, t2)
y_hat = classifier.predict(np.array([x1.ravel(), x2.ravel()]).T)
y_hat = y_hat.reshape(x1.shape)
plt.contourf(x1, x2, y_hat, alpha=0.2, cmap=cmap)
plt.xlim(x1_min, x1_max)
plt.ylim(x2_min, x2_max)
for ind, clas in enumerate(np.unique(y)):
plt.scatter(X[y == clas, 0], X[y == clas, 1], alpha=0.8, s=50,
c=color_list[ind], marker=marker_list[ind], label=label_list[clas])
训练模型
adbt = AdaBoostClassifier(DecisionTreeClassifier(max_depth=2, min_samples_split=20, min_samples_leaf=5),
algorithm="SAMME", n_estimators=10, learning_rate=0.8)
adbt.fit(X, y)
实验结果
sklearn中的adaboost分类器默认为决策树,其各项参数如下:
base_estimator:基分类器,默认是决策树,在该分类器基础上进行boosting,理论上可以是任意一个分类器,但是如果是其他分类器时需要指明样本权重。
n_estimators:基分类器提升(循环)次数,默认是50次,这个值过大,模型容易过拟合;值过小,模型容易欠拟合。
learning_rate:学习率,表示梯度收敛速度,默认为1,如果过大,容易错过最优值,如果过小,则收敛速度会很慢;该值需要和n_estimators进行一个权衡,当分类器迭代次数较少时,学习率可以小一些,当迭代次数较多时,学习率可以适当放大。
algorithm:boosting算法,也就是模型提升准则,有两种方式SAMME, 和SAMME.R两种,默认是SAMME.R,两者的区别主要是弱学习器权重的度量,前者是对样本集预测错误的概率进行划分的,后者是对样本集的预测错误的比例,即错分率进行划分的,默认是用SAMME.R。
random_state:随机种子设置。
- 首先设置基分类器迭代次数为10,学习率为0.8,分类器准确率为:0.9866666666666667,得到决策面如下:
2. 增大基分类器迭代次数到300,保持学习率不变,准确率为:0.9933333333333333。可以发现步长相同的情况下,学习器个数越多效果越好。
3. 继续增大到600,
可以看到,随着基础学习器迭代次数增加,准确率不再发生变化,说明在300时算法已经收敛 了。