• 机器学习-随机森林


    随机森林

    • 集成算法时时下非常流行的机器学习算法,它本身不死一个单独的及其学习算法, 而是通过在数据上构建多个模型, 集成所有模型的建模结果, 基本上所有的机器学习领域都可以看到集成学习的身影, 在心事中集成学习也有相当大的作用, 它可以用来做市场营销模拟的建模, 统计客户来源, 保留和流式, 也可用来预测疾病的非那根想爱你和患病的易感性, 在现在的各种算法中 随机森林, 梯度提升树 xgboost等集成算法的身影也随处可见,
    • 集成算法的目标: 集成算法会考虑多个评估器的建模结果, 汇总之后得到一个综合的结果, 一次来获取比单个模型更好的回归或分类表现
    • 多个模型集成称为的模型叫做集成评估器, 组成集成[ing骨气的每个模型都叫做基评估器, 通常来说, 有三类算法: 装袋法, 提升法, 和stacking
      • 袋装法: 袋装法的核心思想时建立多个相互独立的评估器, 然后对其预测进行平均或多数表决原则, 来决定集成评估器的结果, 袋装法的代表模型就是随机森林
      • 提升法: 基评估器时相关的, 时按顺序一一构建的 其核心思想时结合弱评估器的力量一次次难以评估的样本进行预测, 从而构成一个强评估器, 提升法的代表模型有adaboost和梯度提升树
    • 分类随机森林
      • 控制基评估器参数
    参数 含义
    criterion 不纯度的衡量指标, 有基尼系数和信息熵两种选择
    max_depth 树的最大深度,超过最大深度的树枝都会被剪掉
    min_samples_leaf 一个节点在分枝后的每个子几诶但都必须包含至少min_samples_leaf个训练样本, 否则分枝就不发生
    min_samples_split 一个节点必须包含至少min_samples_split个训练样本, 这个节点菜允许被分枝, 否则分枝就不会发生
    max_features max_features限制分枝时考虑的特征个数, 超过限制个数的特征都会被舍弃, 默认值为总特征个数开平方取整
    min_impority_decrease 限制信息增益的大小, 信息增益小于设定数值的分枝不会发生
      • 随机森林特有参数:
        • n_estimators: 这个时森林中数目的数量, 即评估器的数量, 这个参数对随机森林模型的精确性影响时单调的, n_estimators越大, 模型的效果往往越好. 
      • random_state: 随机森林的本质是一种装袋集成算法, 装袋集成算法是对基评估器的预测结果进行平均或用多数表决原则来决定集成评估器的结果, 当我们找到最佳的n_estimators的值, 对于一个样本而言, 当且仅当有确定的n_estimators最佳参数以上判断错误时, 随机森林才会判断错误, 假设一棵树判断错误的概率为ε, 最佳的n_estimators为n则n/2颗树以上判断错误的概率:
          • e = Σi=(n//2)nCniεi(1-ε)n-i
          • 当随机森林random_state固定时, 森林中的每一棵树的random_state都不一样, 这是因为决策树的随机挑选特征进行分枝的方法得到的属性, 当这种随机性越大的时候, 袋装法的效果越好, 用袋装法集成, 基分类器应当时相互独立的, 基分类器应当是相互独立的, 是不相同的.
        • bootstrap: 当需要建的树很多的时候, 特征又没有那么多的时候, 我们通常采用划分不同的训练集,来进行训练.而袋装法就是通过有放回的随机抽样技术来形成不同的训练数据, bootstrap就是用来控制抽样技术的参数.
          • 1-[1-(1/n)]n每个样本至少有一次没抽中到自助集中的概率. 当n越大的时候, 这个概率收敛于1-(1/e), 约等于0.632, 约有37%的数据会被浪费掉, 没有参与建模, 这些数据被称为袋外数据(out of bag  data, 简写为oob), 也就是说, 在使用随机森林时, 我们可以不划分测试集和训练集, 只需要用袋外数据来测试我们的模型即可.
    • 回归随机森林
      • criterion: 和决策树中的回归树一样
      • 填补缺失值: 任何回归都是从特征矩阵中学习, 然后求解连续型标签y的过程, 之所以能够实现这个过程, 是因为回归算法中认为, 特征矩阵和标签存在这某种联系, 实际上, 标签和特征是可以互换的, 比如在一个用"地区, 环境, 附近学校数量"来预测房价的问题中, 我们即可以用"地区, 环境, 附近学校数量"来预测房价,  也可以翻过来用"环境, 附近学校数量, 和房价"来预测地区, 而回归森林填补缺失值 正式利用了这种思想

    机器学习中的调参的基本思路:

    • 首先,我们要找准目标, 我们的目标是什么, 目的是什么,一般来说是提升模型的准确率, 模型的评估指标
    • 齐次, 考虑模型在未知数据的准确率受什么的影响,在机器学习中,衡量模型在未知数据上的准确的指标, 叫做泛化误差

    泛化误差原理(简化版本):

    • 模型太复杂或者太简单,都会让泛化误差高, 我们追求的是卫浴中间的平衡点
    • 模型太复杂就会过拟合, 模型太简单就会欠拟合
    • 对树模型和树的集成模型来说, 树的深度越深, 枝叶越多, 模型越复杂
    • 树模型和树的集成模型的目标, 都是减少模型复杂度, 把模型往图像的左边移动

    偏差 vs 方差(选读):

    • 一个集成模型(f)在未知数据集(D)上的泛化误差E(f:D),由方差(var),偏差(bais)和噪声(ξ) 共同决定
      • E(f:D) = bias2(x) + var(x) + ξ2
    • 偏差: 模型的预测值与真实值之间的差异, 即每一个红点到蓝线的距离.在集成算法中, 每个基评估器都会有自己的偏差, 集成评估器的偏差是所有基评估器偏差的均值, 模型越精确, 偏差越低
    • 方差: 反映的是模型每一次输出结果于模型预测值的平均水平之间的误差, 即每一个红点到红色虚线的距离, 衡量模型的稳定性, 模型越稳定, 方差越低
    • 方差和偏差是此消彼长的
      • 模型的复杂度越高, 方差高, 总泛化误差高
      • 模型的复杂读低, 偏差高, 总泛化误差高
    • 随机森林为代表的袋装法在训练过程中, 旨在降低方差, 降低模型的复杂度, 随意随机森林参数的默认设定都是假设模型本身在泛化误差最低点的右侧

     Bagging vs Boosting

      袋装法(Bagging) 提升法(Boosting)
    评估器 相互独立 相互关联, 按顺序依次构建, 后建的模型会在先建模型预测失败的样本上有更多的权重
    抽样数集 有抽样放回 有抽样放回, 但会确认数据的权重, 每次抽样都会给容易预测失败的样本更多的权重
    决定集成的结果 平均或少数服从多数原则 加权平均, 在训练集上表现更好的模型会有更大的权重
    目标 降低方差, 提高模型整体的稳定性 降低偏差, 提高模型整体的精确度
    单个评估器存在过拟合问题的时候 能够移动那个程度上解决过拟合问题 可能会加剧过拟合问题
    单个评估器的效力比较弱的时候 不是非常有帮助 很可能会提升模型的表现
    代表算法 随机森林 梯度提升树, Adaboost,xgboost

    RFC的参数列表:

    n_estimators

    整数, 可不填, 默认是10, 随机森林中树模型的数量, 注意在:0.22版本中, n_estimators的默认值

    即将被改为100, ,在0.20版本中依旧为10

    criterion

    字符型, 可不填, 默认是None, 用来很亮衡量分枝质量的指标, 即衡量不纯度的指标, 输入'gini'使用基尼系数,

    或输入'entropy'使用信息增益

    max_depth

    整数点或浮点数, 可不填, 默认是None, 树的最大深度, 如果是None, 树会持续生长直到所有叶子节点的不纯度为0,

    或者直到每个叶子节点所含有的样本量都小于参数min_samples_split中输入的数字

    min_samples_split

    整点或浮点数, 可不填, 默认=2, 一个中间节点要分枝所需要的最小样本量, 如果一个节点包含的样本量小于, min_samples_Split中

    填写的数字, 这个节点的分枝就不会发生, 也就是说, 这个节点一定会成为一个叶子节点

    1>如果输入整数, 则认为输入的数字是分枝所需要最小样本量

    2>如果输入浮点数, 则认为输入的浮点数就是比例, 输入的浮点数*输入模型的数据集的样本量(n_samples)是分枝所需的最小样本量

    min_sample_leaf

    整数, 或浮点数, 可不填, 默认是1, 一个叶节点要存在所需的最小样本量, 一个节点在分枝后的每个子节点中, 必须要包含至少

    min_sample_leaf个训练样本, 否则分枝就不会发生, 这个参数可能那个就会有着使模型更平滑的效果, 尤其在回归中

    1>如果输入的是整数, 则认为输入的数字是叶子节点存在所需的最小样本量

    2>如果输入浮点数, 则认为输入的浮点数是比例, 输入的浮点数*输入模型的数据集的样本量是叶子节点存在所需的最小样本量

    min_weight_fraction_leaf

    整数, 或浮点数, 可不填, 默认=0

    一个叶子节点要存在所需要的权重占输入模型的数据集的总权重的比例, 总权重由fit接口中的sample_weight参数确定, 当sample_weight

    是None时, 默认所有样本的权重相同

    max_features

    整数, 浮点数, 字符型或None, 可不填, 默认是None

    在做最佳分枝的时候, 考虑的特征个数

    1>输入整数, 则每一次分枝都考虑max_features个特征

    2>输入浮点数, 则认为输入的浮点数就是比例, 每次分枝考虑的特征数目是max_features输入模型的数据集的特征个数

    3>输入"auto", 采用n_features的平方根作为分枝时考虑的特征数目

    4>输入"sqrt",采用n_features的平方根作为分枝是考虑的特征数目

    5>输入"log2",采用log2(n_features)作为分枝时, 考虑的特征数目

    6>输入"None", n_features就是分枝时考虑的张特征数目

    注意: 如果在限制的max_features中, 决策树无法找到节点样本上至少一个有效的分枝, 那对分枝的搜索不会停止, 决策树将会检查比限制max_features数目更多的特征

    max_leaf_nodes

    整数或None, 可不填, 默认时None

    最大叶节点数量, 在最佳分枝方式下, 以max_leaf_nodes围限制来生长树, 如果是None, 则没有叶节点数量的限制

    min_impurity_decrease

    浮点数, 可以不填, 默认是=0

    当一个节点的分枝后引起的不纯度的降低大于或等于min_impurity_decrease中输入额数值, 则这个分枝就不会被保留, 不会被剪枝, 带权重的不纯度下降可以表示围:

    (Nt/N)*(不纯度-(Ntr/Nt)*右侧树枝的不纯度-(Ntl/Nt)*左侧数值的不纯度)中N是样本总量, N_t是节点t中的样本量, N_t_l是左侧子节点的样本量, N_t_r是右侧子节点

    的样本量

    注意: 如果sample_weight在fit接口中有值, 则N, N_t, N_t_r, N_t_l都是指样本量的权重, 而非单纯的样本数量

    min_impurity_split 浮点数, 防止树生长的阈值之一, 如果一个节点的不纯度高于min_impurity_split, 这个节点就会被分枝, 否则的话这个节点就只能是叶子节点
    boostrp 布尔值, 可不填, 默认是True, 在建树过程中, 是否适用于自举样本抽样的方式
    oob_score 布尔值, 默认是False, 在建树过程中, 是否适用袋外样本来预测模型的泛化精确性
    n_jobs

    整数或None, 可不填, 默认是None

    训练(fit)和预测(predict)并行运行的作业数, None表示1, 除非None是标注在参数joblib.parallel_backend context中, -1表示使用整个处理器来运行

    random_state

    整数, sklearn中设定好的RandomState实例, 或None, 可不填, 默认是None

    1>输入整数, random_state是由随机数生成器生成的随机数种子

    2>输入RandomState实例, 则random_state是一个随机数生成器

    3>输入None, 随机数生成器会是np.random模块中的一个RandomState实例

    verbose

    整数, 可不填, 默认是0, 在拟合和预测是控制的复杂度

    warm_start 布尔值,可不填, 默认是False, 是设置为True, 使用上一次实例化中得到的树模型来fit并以此想整体添加更多估算器, 否则, 重新建立一棵树来训练
    class_weight

    字典, 字典的列表, "balanced", "balanced_subsample", 或者"None", 默认是None, 与标签相关联的权重, 表现方式是{标签的值: 权重}如果为None, 则默认所有的标签

    持有相同的权重, 对于多输出问题, 字典中权重的顺序徐亚与各个y在标签数据集中的排列顺序相同, 

    注意: 对于多输出问题(包括多标签问题), 定义的权重必须具体到每个标签的每个类, 其中类是字典键值对的建, 权重是键值对中的值, 比如说: 对于四个标签,且每个标签是二分类

    (0和1)的分类问题而言, 权重应该被表示为:

    [{0:1,1:1}, {0:1,1:5}, {0:1, 1:1}, {0:1,1:1}]而不是[{1:1}, {2:5}, {3:!}, {4:1}]

    如果使用balanced模式, 将会使用y的值自动调整与输入数据中的类频率成反比的权重, balanced_sbsample模式与把;amnced相同, 只是基于每个生长的树的随机放回

    抽样样本计算权重, 对于多输出问题, 每一列的权重将被相乘

  • 相关阅读:
    day23-json、pickle、configparser、hashlib、suprocess模块
    day22-时间模块、random模块、os模块、sys模块
    day21-py文件作用,导包、模块搜索路径
    day20-python-二分、面向过程思想、函数式、模块
    day19-python-叠加装饰器分析、yield、三元、生成式、递归
    day18-python-装饰器、迭代器、生成器
    day17-python-装饰器
    day16-python-函数对象、函数嵌套、闭包函数
    搭建yum本地源_阿里云CentOS服务器初始化设置
    ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/var mysql 启动不了
  • 原文地址:https://www.cnblogs.com/ljc-0923/p/15189664.html
Copyright © 2020-2023  润新知