基于单层决策树的adaboost算法Python实现

概括来说,adaboost是一个提升方法框架,基学习器可以换成任意的可以引入样本权重或重采样样本来训练的弱学习器
adaboost主要有两点:

  1. 每一轮改变训练数据的权值或者概率分布, Wmi
  2. 弱分类器的训练出来后也有一个权重alpha,采用加权多数表决

算法流程明细

下面给出加了注释的基于单层决策树的adaboost算法实现

"""基于单层决策树的adaboost,这个单层决策树跟平时用的单层决策树不同,
这里只是考察某个特征的某个值,根据与这个值比较结果的大小不同分类,
而非普通决策树中的投票法确定类别。"""

import numpy as np

def stump_classify(data_mat, dimen, thresh, thresh_ineq):
    """将数据第dimen维特征与thresh比较,根据大小以及thresh_ineq来判定样本分到哪个类
    thresh_ineq用于设置是大于thresh为负样本还是小于thresh为负样本"""
    res = np.ones((shape(data_mat)[0], 1))
    if thresh_ineq == 'lt':
        res[data_mat[:, dimen] <= thresh] = -1.0
    else:
        res[data_mat[:, dimen] > thresh] = -1.0
    return res

def build_stump(data_arr, class_labels, D):
    """构建单层决策树,D为权重向量,输入数据和权重,返回最优特征和分割点等信息"""
    data_mat = np.mat(data_arr)
    label_mat = np.mat(class_labels).T
    m, n = shape(data_mat)
    
    num_steps = 10.0    #对每个特征有十个候选thresh
    best_stump = {}    #记录最优特征和最优分割点等信息
    min_error = np.inf
    
    for i in range(n):  #对每个特征
        min_val, max_val = data_mat[:, i].min(), data_mat[:,i].max()
        step_size = (max_val - min_val) / num_steps
        for j in range(-1, int(num_steps) + 1):  #对每个候选值,这里从-1开始意义不大,因为如果当选,则全部样本归为一类
            for inequal in ['lt', 'gt']:  #对每个方向
                thresh = min_val + j * step_size
                predict_res = stump_classify(data_mat, i, thresh, inequal)  #得到预测结果
                
                error_arr = np.mat(np.ones(m, 1))
                error_arr[predict_res == label_mat] = 0  #计算错误率
                weighted_error = D.T * error_arr  #加权后的错误率
                
                if weighted_error < min_error:
                    min_error = weighted_error
                    best_stump['dim'] = i
                    best_stump['thresh'] = thresh
                    best_stump['ineq'] = inequal
                    best_stump['predict_res'] = predict_res.copy()
    return best_stump, min_error

def adaBoost_train(data_arr, class_labels, n_iter):
    """构建adaboost算法,在构建的时候会考虑权重,训练出来的基学习器在预测的时候是不会对样本加权的"""
    weak_class_arr = []  #弱分类器
    m = shape(data_arr)[0]
    weights = np.mat(np.ones(m, 1)) / m  #初始化样本权重,均匀分布
    agg_class_est = np.mat(np.zeros((m, 1)))  # f(x)在训练集上的结果
    
    for i in range(n_iter):
        best_stump, error = build_stump(data_arr, class_labels, weights)  #基分类器
        alpha = 0.5 * np.log((1-error) / max(error, 1e-16))  #防止error为0
        
        best_stump['alpha'] = alpha
        weak_class_arr.append(best_stump)  #记录学习结果
        
        expon = np.multiply(-1 * alpha * np.mat(class_labels).T, best_stump['predict_res'])  # shape: m * 1
        weights = np.multiply(weights, np.exp(expon))  # shape: m * 1
        weights /= weights.sum()  #得到下一轮的权重
        
        agg_class_est += alpha * best_stump['predict_res']
        agg_error = np.multiply(np.sign(agg_class_est) != np.mat(class_labels).T, np.ones((m,1)))  #累计错误率,前者是判断,得到的是true,false,乘以1可以得到数字1,0
        error_rate = agg_error.sum() / m  #平均错误率
        if error_rate == 0:
            break
    return weak_class_arr
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,193评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,306评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,130评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,110评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,118评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,085评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,007评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,844评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,283评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,508评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,667评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,395评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,985评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,630评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,797评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,653评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,553评论 2 352