Driven to discover
  • 目录
  • 简介
  • 数学基础
    • 数学基础
      • 线性代数
      • 概率统计
        • 概率基础
        • 连续概率
        • 概率分布
        • 大数与中心极限
      • 时间序列
      • 信息理论
      • 参数估计
      • 优化降梯
        • 极大、极小和鞍点
        • 泰勒及Jacobian、Hessian
        • 连续可微
          • 无约束优化
          • 有约束优化
        • 非连续可微
      • 备查附录
  • 数据挖掘
    • 数据挖掘
      • 数据预分析
      • 数据预处理
        • 数据采样
        • 数据降维
        • 特征选择
      • 模式挖掘
        • 频繁项集
        • 多样项集
        • 基于约束的频繁项集
        • 高维及庞大项集
        • 序列模式
        • 图模式
      • 聚类分析
        • 划分聚类
        • 层次聚类
        • 密度/网格聚类
      • 文本挖掘
        • 短语挖掘与主题模型
        • 实体识别与类型标记
  • 机器学习
    • 机器学习
      • 模型评估与选择
      • 线性模型
      • 决策树模型
      • 支持向量机
      • 贝叶斯分类器
      • 集成学习
        • Bagging
        • Boosting
          • AdaBoost
          • GBDT
          • XGBoost
          • LightGBM
        • 结合策略
      • 概率图模型
        • 贝叶斯网络
        • 隐马尔可夫
        • 条件随机场
  • 网络图模型
    • 网络图模型
      • 大规模图处理
        • 社区检测与搜索
        • 中心度分析
        • 网络形成模型
        • 异构信息网络
      • 网络映射
        • 结构维持的网络映射
        • 性质维持的网络映射
        • 动态网络映射
      • Graph Neural Network
  • 深度学习
    • 深度学习
      • 深度前馈网络
        • 非线性的学习
        • 基于梯度的学习
        • 激活函数
        • 架构设计
        • 前向传播
        • 反向传播
      • 深度学习正则化
        • 参数范数惩罚
        • 作为约束的范数惩罚
        • 正则化和欠约束问题
        • 数据集增强
        • 噪声鲁棒性
        • 半监督学习
        • 多任务学习
        • 提前终止
        • 参数绑定和共享
        • 稀疏表示
        • Bagging和其他集成方法
        • Dropout
        • 对抗训练
        • 切面距离、正切传播和流形正切分类器
      • 深度学习优化
        • 学习和纯优化异同
        • 神经网络优化中的挑战
        • 优化算法
        • 参数初始化策略
        • 优化策略和元算法
      • 卷积网络
        • 卷积运算
        • 卷积动机
        • 池化
      • 循环和递归网络
        • 展开计算图
        • 循环神经网络
        • 长短期记忆
        • 注意力机制
      • 生成对抗网络
      • 多任务学习
      • 技术分析
        • Attention
        • Normalization
  • 增强学习
    • 增强学习
      • 增强学习的数学表达形式
      • 求解增强学习问题
        • 已知环境模型的问题
        • 未知环境模型的问题
  • 计算机视觉
    • 计算机视觉
      • 图像分类
        • LeNet-5
        • AlexNet
        • VGGNet
        • GoogLeNet
        • ResNet
        • DenseNet
      • 目标检测
        • 相关研究
          • 选择性搜索
          • OverFeat
        • 基于区域提名的方法
          • R-CNN
          • SPP-net
          • Fast R-CNN
          • Faster R-CNN
          • R-FCN
        • 端到端的方法
          • YOLO
          • SSD
      • 语义分割
        • 全卷积网络
          • FCN
          • DeconvNet
          • SegNet
          • DilatedConvNet
        • CRF/MRF的使用
          • DeepLab
          • CRFasRNN
          • DPN
        • 实例分割
          • Mask R-CNN
      • 图像检索的深度哈希编码
        • 传统哈希编码方法
        • CNNH
        • DSH
      • 光学字符识别
        • CTC解码
          • 前向后向
          • 目标函数
          • 基本原理
      • 人脸识别
      • 三维重建
  • 自然语言处理
    • 自然语言处理
      • 中文分词技术
      • 词性标注
        • 传统词性标注模型
        • 基于神经网络的词性标注模型
        • 基于Bi-LSTM的词性标注模型
      • 命名实体识别
      • 关键词提取
        • 词频与排序
        • 主题模型
      • 句法分析
        • 基于PCFG的句法分析
        • 基于最大间隔马尔可夫网络的句法分析
        • 基于条件随机场的句法分析
        • 基于移进-归约的句法分析
      • 文本向量化
        • Continuous Bag-of-Word
        • Skip-Gram
        • word2vec(Hierarchical Softmax与Negative Sampling)
        • GloVe
        • fastText
        • Bert
      • 情感分析
        • 文档维度情感分析
        • 句子维度情感分析
        • 方面维度情感分析
        • 其他情感分析任务
      • 机器翻译
        • 神经网络机器翻译基本模型
        • 基于Attention的神经网络机器翻译
        • 基于卷积的机器翻译
  • 搜索推荐广告
    • 搜索推荐广告
      • 搜索
        • 召回
        • 排序
          • 传统匹配模型
          • 深度学习匹配模型
            • Representation Learning
              • DNN-based
              • CNN-based
              • RNN-based
            • Matching Function Learning
              • Matching with word-level learning methods
              • Matching with attention model
            • Matching function learning&Representation learning
            • Query-Doc Relevance matching
              • Based on global distribution of matching strengths
              • Based on local context of matched terms
        • 重排
      • 推荐
        • 召回
        • 排序
          • 传统匹配模型
            • 协同过滤
            • 基于特征
          • 深度学习匹配模型
            • Representation learning
              • 协同过滤
              • 基于特征
            • Matching function learning
              • 协同过滤
              • 基于特征
        • 重排
      • 广告
        • 行业知识
        • 核心技术
          • 发展趋势
          • CTR/CVR
            • 浅层模型
            • 深度模型
          • 智能定向
          • 技术难点
        • 相关技术
  • 计算机基础
    • 计算机基础
      • 数据结构
        • 排序算法
      • 操作系统
      • 计算机网络
      • 计算机组成原理
      • python
        • pandas
      • Bash
      • Spark
      • SQL
      • Excel
  • 经验总结
    • 经验总结
      • 广告应用
        • 人群定向
        • 召回通路
      • 时序预测
        • 统计时序
        • 机器学习
        • 深度学习
      • 图谱探索
        • 标签传播
        • 图谱&网络
      • 策略评估
        • 激励策略
        • 均衡策略
Powered by GitBook
On this page

Last updated 6 years ago

Bagging是指的个体学习器间不存在强依赖关系、可同时生成的并行化方法。

Bagging基于自助采样法,给定包含 个样本的数据集,我们随机取出一个样本放入采样集中,再把该样本放回初始数据集,使得下次采样时该样本仍有可能被选中,这样,经过 次操作,我们得到含 个样本的采样集,初始训练集里有的样本在采样集里多次出现,有的则从未出现。由 可知初始训练集约有 的样本出现在采样集中, 未出现在采样集中。

照这样,我们可采集出 个含 个训练样本的训练集,然后基于每个采样集训练出一个基学习器,再将这些学习器进行结合。Bagging通常对分类任务使用简单投票法,对回归任务使用简单平均法。

值得一提的是,自助采样过程还给Bagging带来了另一个有点:由于每个基学习器只使用了初始训练集中约 的样本,剩下的样本可用作验证集来对泛化性能进行“包外估计”。

随机森林(Random Forest)

随机森林在以决策树为基学习器构建Bagging集成的基础上,进一步在决策树的训练过程中引入了随机属性选择。具体来说,在随机森林中,对基决策树的每个结点,先从该结点的属性集合中随机选择一个包含 个属性的子集,然后再从这个子集中选择一个最优属性用于划分。这里的参数 控制了随机性的引入程度:若 ,则基决策树的构建与传统决策树相同;若令 ,则是随机选择一个属性用于划分;一般情况下,推荐值 。

随机森林的训练效率常常优于纯Bagging思想的决策树群,因为在个体决策树的构建过程中,Bagging使用的是“确定型”决策树,在选择划分属性时要对结点的所有属性进行考察,而随即森林使用的“随机型”决策树则只考察一个属性子集。

可以看出,随机森林对Bagging只做了小改动,但是与Bagging中基学习器的“多样性”仅通过样本扰动(通过对初始训练样本采样)而来不同,随机森林中基学习器的多样性不仅来自样本扰动,还来自属性扰动,这就使得集成的泛化性能可通过个体学习器之间差异度的增加而进一步提升。

  1. 机器学习
  2. 机器学习
  3. 集成学习

Bagging

Previous集成学习NextBoosting
  • 随机森林(Random Forest)
  • Code实现
mmm
mmm
mmm
lim⁡m→∞(1−1m)m→1e≈0.368\lim\limits_{m\to\infty}(1-\frac{1}{m})^m\to\frac{1}{e}\approx0.368m→∞lim​(1−m1​)m→e1​≈0.368
63.2%63.2\%63.2%
36.8%36.8\%36.8%
TTT
mmm
63.2%63.2\%63.2%
kkk
kkk
k=dk = dk=d
k=1k = 1k=1
k=log⁡2dk = \log_2dk=log2​d
# -*- coding: UTF-8 -*-
import sys
import math
from DecisionTree import DecisionTreeClassifier

def mymode(X, n_tree, n_samples):
    predictions = []
    for i in range(n_samples):
        d = {}
        for j in range(n_tree):
            x = X[j][i]
            if x not in d:
                d[x] = 0
            d[x] += 1
        res = [ (x, d[x]) for x in d ]
        res = sorted(res, key=lambda x:x[1], reverse=True)
        predictions.append( res[0][0] )
    return predictions 

def load_data(file_name):
    X = []
    y = []
    with open(file_name, "r") as f:
        for l in f:
            sp = l.strip("\n").split(" ")
            label = int(sp[0])
            y.append(label)
            fea = []
            for i in range(1, len(sp)):
                fea.append( float( sp[i].split(":")[1] ) )
            X.append(fea)
    return (X), (y)

def shuffle_in_unison(a, b):
    import random
    random.seed(100)
    all = [ (a[i], b[i]) for i in range(len(a)) ]
    random.shuffle(all)
    na = [ x[0] for x in all ]
    nb = [ x[1] for x in all ]
    return na, nb

def gini(Y):
    distribution = Counter(Y)
    s = 0.0
    total = len(Y)
    for y, num_y in distribution.items():
        probability_y = float (num_y/total)
        s += (probability_y)*math.log(probability_y)
    return -s

def gini_gain(y, y_true, y_false):
    return gini(y) - (gini(y_true)*len(y_true) + gini(y_false)*len(y_false))/len(y)

class RandomForestClassifier(object):
    def __init__(self, n_estimators=32, max_features=lambda x: x, max_depth=20,
        min_samples_split=2, bootstrap=0.632):
        self.n_estimators = n_estimators
        self.max_features = max_features
        self.max_depth = max_depth
        self.min_samples_split = min_samples_split
        self.bootstrap = bootstrap
        self.forest = []

    def fit(self, X, y):
        self.forest = []
        n_samples = len(y)
        n_sub_samples = int(round(n_samples*self.bootstrap))
        for i in xrange(self.n_estimators):
            X, y = shuffle_in_unison(X, y)
            X_subset = [ X[i] for i in range(n_sub_samples) ]
            y_subset = [ y[i] for i in range(n_sub_samples) ]

            tree = DecisionTreeClassifier(self.max_features, self.max_depth,
                                            self.min_samples_split)
            tree.fit(X_subset, y_subset)
            self.forest.append(tree)

    def predict(self, X):
        n_samples = len(X)
        n_trees = len(self.forest)
        predictions = [ [ 0 for i in range(n_samples) ] for j in range(n_trees) ]
        for i in xrange(n_trees):
            predictions[i] = self.forest[i].predict(X)
        return mymode(predictions, n_trees, n_samples)

    def score(self, X, y):
        y_predict = self.predict(X)
        n_samples = len(y)
        correct = 0
        for i in xrange(n_samples):
            if y_predict[i] == y[i]:
                correct = correct + 1
        accuracy = correct/float(n_samples)
        return accuracy
    
if __name__ == "__main__":
    train_file = sys.argv[1]
    test_file = sys.argv[2]
    train_x, train_y = load_data( train_file )
    test_x, test_y = load_data(test_file)
    # print "Load data finish..."
    rf = RandomForestClassifier(n_estimators=32, max_depth=20)
    rf.fit(train_x, train_y)
    # print "test acc:", rf.score(test_x, test_y) 
    preds = rf.predict(test_x)

    # print "confusion matrix:"
    class_num = 0
    class_map = {}
    class_index = 0
    for i in train_y:
        if i not in class_map:
            class_map[i] = class_index
            class_index += 1
            class_num += 1
    for i in preds:
        if i not in class_map:
            class_map[i] = class_index
            class_index += 1
            class_num += 1
    matrix = [ [ 0 for i in range(class_num) ] for j in range( class_num ) ]
    for i in range( len(test_y) ):
        actual = test_y[i]
        pred = preds[i]
        matrix[ class_map[ actual ] ] [ class_map[pred] ] += 1
    for i in matrix:
        print " ".join( [ str(x) for x in i ] )
Code实现