机器学习实战之adaboost(附python3代码)

本节代码存放在github网址上,环境:python3
利用AdaBoost元算法提高分类性能

元算法(meta-algorithm)或者集成方法(ensemble method)是对其他算法进行组合的一种方式
AdaBoost算法
优点:范化错误率低,易编码,可以应用在大部分分类器上,无参数调整
缺点:对离群点敏感
适用数据类型: 数值型和标称型数据

bagging和boosting所使用的多个分类器类型都是一致的!

bagging: 基于数据随机抽样的分类器构建方法

放回取样得到S个数据集,将某个学习算法分别作用于每个数据集就得到了S个分类器,要对新数据进行分类时,可以应用这S个分类器进行分类,
选取分类器投票结果中最多的类别作为最后的分类结果。分类器的权重是相等的。

random forest 也是bagging方法的一种

boosting:通过集中关注被已有分类器错分的那些数据来获得新的分类器

不同的分类器是通过串行训练获得的,每个新的分类器都根据已训练出的分类器的性能来训练。
其分类结果是基于所有分类器的加权求和结果的,分类器权重并不相等,每个权重代表的是其对应分类器在上一轮迭代中的成功度。

AdaBoost一般流程

  1. 收集数据:可以使用任何方法
  2. 准备数据:依赖于所使用的弱分类器类型,本章使用的是单层决策树,这种分类器可以处理任何数据类型。当然也可以使用任意分类器作为弱分类器,KNN, 决策树,朴素贝叶斯,Logistic回归,SVM中任一分类器都可以充当弱分类器。作为弱分类器,简单分类器的效果最好。 确保类别标签是+1和-1,而非1和0.
  3. 分析数据:可以使用任一方法分析数据:可以使用任一方法
  4. 训练算法:AdaBoost的大部分时间都用在训练上, 分类器将多次在同一数据集上训练弱分类器。
  5. 测试算法:计算分类的错误率测试算法:计算分类的错误率
  6. 使用算法:同SVM同,AdaBoost预测两个类别中的一个。若想把它应用到多分类的场合,需要像多类SVM中的做法一样对AdaBoost进行修改。使用算法:同SVM同,AdaBoost预测两个类别中的一个。若想把它应用到多分类的场合,需要像多类SVM中的做法一样对AdaBoost进行修改。

AdaBoost运行过程

训练数据中的每个样本,并赋予其一个权重,这些权重构成了向量D. 一开始,这些权重都初始化成相等值。首先在训练集上训练出一个弱分类器,并计算该分类器的错误率,然后在同一数据集上再次训练弱分类器。在分类器的第二次训练中会调整每个样本的权重,其中第一次分对的的样本中的权重将会降低,而第一次分错的样本中的权重将会提高。为了从所有弱分类器中得到最终的分类结果,AdaBoost为每个弱分类器都分配了一个权重值alpha,这些alpha是基于每个弱分类器的错误率进行计算的。
错误率ε定义为

在这里插入图片描述

alpha定义为:

在这里插入图片描述

计算出alpha后,可以对权重D进行更新,以使那些正确分类的样本权重降低而错分样本的权重提高。D的计算方法如下:
若某个样本被正确分类,该样本权重更改为:
在这里插入图片描述

若某个样本被错分,该样本权重更改为:

在这里插入图片描述

基于单层决策树构建弱分类器

伪代码如下:

将最小错误率minError设为+inf
对数据集中每个特征(第一层循环):
	对每个步长(第二层循环):
		对每个不等号(第三层循环):
			建立一棵单层决策树并利用加权数据集对它进行测试
			如果错误率低于minError,则将当前单层决策树设为最佳单层决策树
返回最佳单层决策树

python代码如下:

# -*- coding: utf-8 -*-

__author__ = 'WF'
# import warnings
import numpy as np
# warnings.simplefilter(action='ignore', category=FutureWarning)

# 加载简单数据集
def loadSimpleData():
    dataMat = np.matrix([[1.,  2.1],
                         [2.,  1.1],
                         [1.3,  1.],
                         [1.,  1.],
                         [2.,  1.]])
    classLabel = [1.0, 1.0, -1.0, -1.0, 1.0]
    return dataMat, classLabel

# 图形化展示数据
def plot_simpledata():
    import matplotlib.pyplot as plt
    x, y = loadSimpleData()
    y = np.array(y)
    x = np.array(x)
    # print(y)
    # x1 = x[np.nonzero(y)[0]]
    x1 = x[np.where(y == 1.0)[0]]
    # print(np.nonzer
  • 5
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
可以通过以下代码实现不使用机器学习包的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算法,以获得更好的性能和更广泛的应用场景。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值