【机器学习入门二】集成学习及AdaBoost算法的python实现

本文主要基于周志华老师的《机器学习》第八章内容

个体与集成

集成学习通过构建并结合多个学习器来完成学习任务。集成学习的一般结构如图所示:
这里写图片描述
先产生一组个体学习器,在用某种策略把它们结合在一起。个体学习器通常有一个现有的学习算法从训练数据产生,如决策树桩和BP神经网络。个体学习器可以使相同类型的也可以是不同类型的,比如全是神经网络或者同事含有神经网络和决策树桩。
集成学习通过将多个学习器进行结合,通常可以获得比单一学习器显著优越的泛化性能,尤其是弱学习器(即泛化性能略优于随机猜测的学习器,比如在二分类问题上精度略高于50%的分类器)。从理论上来说,使用弱学习器集成就足以获得好的性能。
如何提高集成学习的性能?这要求个体学习器应该“好而不同”。书上的例子很好且简单易懂,这里直接拿来。
在二分类任务中,假定三个分类器在三个测试样本上的表现分别如下面的三个表所示,
其中对号表示分类正确,叉号表示分类错误,集成策略选择投票法。在(a)中,每个分类器都只有66.6%的精度,但是集成学习后达到了100%,(b)中,三个分类器完全一样,集成后没有区别,(c)中,每个分类器的精度都只有33.3%,集成后结果更差。这个例子直观的解释了为什么应该好而不同,即个体学习器要比较准确,并且各个个体学习器之间还要有一定的差异性。
这里写图片描述
集成学习根据个体学习器的生成方式可以分为2大类,如果个体学习器存在强依赖关系、必须串行生成的序列化方法,典型代表是Boosting。第二种是个体学习器之间不存在强依赖关系,可以同时生成的并行化方法,如Bagging和随机森林(Random Forest)。

Boosting

Boosting是一族可将弱学习器提升为强学习器的算法。算法的流程为:先从初始训练集训练出一个个体学习器,再根据该学习器的表现对训练样本的分布进行调整,使得先前学习器做错的训练样本在后续受到更多关注,然后基于调整后的样本分布来训练下一个个体学习器,如此反复进行,直到个体学习器的数量达到事先指定的值T或者集成的误差已经小于阈值,最终将这些个体学习器进行加权结合。

算法流程

Boosting算法族中最著名的是AdaBoost算法。下面是算法的过程:


输入:训练集 D={ (x1,y1),.....,(xm,ym)} D = { ( x 1 , y 1 ) , . . . . . , ( x m , y m ) } ,基学习算法 ξ ξ ,训练次数T
过程:
1. D1(x)=1/m. D 1 ( x ) = 1 / m . (表示第一轮时每个样本的权重是相等的)
2. fort=1,2,3,...,Tdo: f o r t = 1 , 2 , 3 , . . . , T d o :
3. ht=ξ(D,Dt); h t = ξ ( D , D t ) ;
4. εt=PxDt(ht(x)f(x)); ε t = P x − D t ( h t ( x ) ≠ f ( x ) ) ; ( f(x) f ( x ) 是 真 实 函 数 )
5. ifεt>0.5thenbreak i f ε t > 0.5 t h e n b r e a k
6. αt=12ln(1εt

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以通过以下代码实现不使用机器学习包的Adaboost算法Python实现: ``` import numpy as np # 生成训练数据 def getData(): X = np.array([ [-1, -1], [-1, 1], [1, -1], [1, 1] ]) y = np.array([1, 1, -1, -1]) return X, y # 实现Adaboost算法 def Adaboost(X, y, T): n_samples, n_features = X.shape w = np.ones(n_samples) / n_samples models = [] for t in range(T): # 训练弱分类器 model = {'feature': None, 'threshold': None, 'alpha': None} min_error = float('inf') for f in range(n_features): feature_vals = np.unique(X[:, f]) for threshold in feature_vals: predicted = np.ones(n_samples) predicted[X[:, f] < threshold] = -1 error = np.sum(w[y != predicted]) if error < min_error: min_error = error model['feature'] = f model['threshold'] = threshold model['alpha'] = 0.5 * np.log((1 - min_error) / min_error) # 更新权重和模型 predicted = np.ones(n_samples) predicted[X[:, model['feature']] < model['threshold']] = -1 w *= np.exp(-model['alpha'] * y * predicted) w /= np.sum(w) models.append(model) return models # 对测试数据进行预测 def predict(X_test, models): n_samples = X_test.shape[0] y_pred = np.zeros(n_samples) for model in models: predicted = np.ones(n_samples) predicted[X_test[:, model['feature']] < model['threshold']] = -1 y_pred += model['alpha'] * predicted y_pred = np.sign(y_pred) return y_pred # 测试 X_train, y_train = getData() models = Adaboost(X_train, y_train, T=3) X_test = np.array([[-1, -1], [-1, 1], [1, -1], [1, 1]]) y_pred = predict(X_test, models) print(y_pred) ``` 注意,这只是一个简单的Adaboost实现,仅供参考。在实际应用中,我们通常会使用机器学习包中已经实现好的Adaboost算法,以获得更好的性能和更广泛的应用场景。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值