机器学习-决策树

分类树: 

  • 决策树是一种非参数的有监督学习方法, 他能够从一系列有特征合标签的数据中总结处决策规则, 并用树状图结构来呈现这些规则,以解决分类和回归问题
  • 根节点: 没有进边,有出边, 包含最初的,针对特征的提问
  • 中间节点: 既有进边, 也有出边, 进边只有一条, 出边可以有很多条, 都是针对特征的提问
  • 叶子节点: 有进边, 没有出边, 每个叶子几点都是一个类别标签
  • 子节点和父节点: 在两个相连的节点中, 更接近根节点的是父节点, 另一个是子节点
  • 重要参数:
    • 衡量最佳的节点和最佳的分枝方法叫做不纯度, 不纯度越低, 决策树对训练集的拟合越好, 不纯度基于节点来计算, 树中的每个节点都会有一个不纯度, 并且子节点的不纯度一定低于父节点, 也就是说,在同一颗决策树上, 叶子节点的不纯度一定是最低的
    • criterion: 这个参数正是用来决定不纯度计算方法, 
      • entropy: 信息熵
        • Entropy(t) = -Σi=0c-1p(i|t)log2p(i|t)
      • gini: 基尼系数
        • Gini(t): = 1-Σi=0c-1p(i|t)2
      • 两种方法的特点:
        • 比起基尼系数, 信息熵对不纯度更加敏感, 对不纯度的惩罚最强
        • 信息熵的计算要比基尼系数缓慢一些, 因为基尼系数的计算不涉及对数
        • 对于高维数据或者噪音数据, 信息熵很容易过拟合, 基尼系数这种情况较好, 当你和成都不足时(即当模型在训练集和测试集上都表现不太好)使用信息熵
参数 criterion
如何影响模型 确定不纯度的计算方法, 帮忙找出最佳节点和最佳分枝, 不纯度越低,决策树对训练集的拟合越好
可能输入有哪些 不填默认是基尼系数, 填写gini使用基尼系数, 填写entropy使用信息增益
怎样选取参数?

通常就是用基尼系数

数据维度很大, 噪音很大时使用基尼系数

维度低,数据比较清晰的时候, 信息熵和基尼系数没区别

当决策树的拟合程度不够的时候,使用信息熵

两个都试试, 不好就换另外一个

    • random_state和splitter
      • random_state: 是用来设置随机模式的参数, 在高纬度时随机性表现更明显, 低维度的数据急乎乎不明显
      • splitter: 用来控制决策树中随机选项的, 2中选项: best和random
        • best: 决策树在分枝选择贡献度大的特征来进行分枝
        • random: 决策树在分枝时会更加随机, 树会因为更多的不必要的信息, 而更深大, 因此,这样在训练模型的时候, 也不会过拟合,也会死防止过拟合的一种方式 
  • 剪枝参数: 为了让决策树有更好的泛化性, 我们要对决策树进行剪枝, 剪枝策略对决策树影响巨大, 正确的剪枝策略时优化决策树的算法核心, 
    • max_depth: 限制树的最大深度, 超过设定深度的树枝全部剪掉, 一般时从3开始.在集成算法中也非常实用
    • min_samples_leaf: 限定一个节点在分枝后的每个子节点都必须包含至少min_samples_leaf个训练样本, 否则就不会发生分枝.一般从5开始
    • min_samples_split: 限定一个节点必须包含至少min_samples_split个训练样本, 这个节点才允许被分枝, 否则就不会分枝
    • max_features: 限制分枝时考虑的特征个数, 超过限制个数的特征都会被舍弃, 一般是用来限制高维度数据的过拟合的剪枝参数.
    • min_impurity_decrease: 限制信息增益的大小, 信息增益小于设定数值的分枝不会发生
  • 用超参数确定剪枝参数
    • 学习曲线来确定每一个参数
      • 缺点: 如果参数很多, 将话费大量时间
      • 优点: 可以准确的每一个参数
  • 目标权重参数:
    • class_weight: 完成样本标签平衡的参数, 样本不平衡是指在一组数据集中, 标签的一类天生占有很大比例
    • weight_fraction_leaf: 这个时基于权重的剪枝参数来使用
  • 重要属性和接口
    • fit: 模型训练划分的测试集数据
    • score: 训练好的模型对划分好的测试集数据进行测试
    • apply: 输入测试集返回每个测试集样本所在的叶子节点的索引
    • predict: 输入测试集返回每个测试样本的标签
  • 八个参数:
    • criterion, random_state, splitter, max_ddepth, min_samples_split, min_samples_leaf, max_feature, min_impurity_decrease
  • 一个属性: 
    • feature_importances_
    四个接口:
    • fit, score, apply, predict

回归树: 

  • 回归树分枝质量的指标有三种
    • mes: 使用均方误差, 父节点和叶子节点之间的均方误差的差额将被用来作为特征选择的标准, 这种方法通过使用叶子节点的均值来最小化L2损失
      • MSE = (1/N)Σi=1N(fi - yi)
      • 其中N时样本的数量, i是每一个数据样本, fi是模型回归出来的数值, yi时样本点i实际的数值标签, 所以MSE的本质其实就是样本真是数据与回归数据的差异, 在回归树中 MSE不只是我们分枝质量衡量的指标, 也是我们嘴常用的衡量回归树质量的指标, 当我们使用交叉验证的时候, 我们往往选择均方误差作为我们的对模型评估指标, 因此MSE越小越好
      • 虽然均方误差为正, 但是sklearn中使用均方误差作为评判标准时, 却是计算"负均方误差"(neg_mean_squared_error), 这是因为sklearn在计算模型评估指标的时候, 会考虑指标本身的性质, 均方误差本身是一种误差, 所以sklearn划分为模型的一种损失,因此在sklearn中, 都已负数表示.
      • 回归树接口返回的是R2, 并不是MSE, R平方定义如下:
        • R2 = 1 - μ/v
        • μ = Σi=1N(fi - yi)2
        • v = Σi=1N(yi - y')2
    • fried_man: 使用菲尔德慢均方误差, 这种指标使用菲尔德慢针对在分枝中的问题改进后的均方误差
    • mae: 使用绝对平均误差, 这种指标使用叶子几诶但的中值来最小化L1损失.
  • 交叉验证: 是用来观察模型稳定性的一种方法

决策树的特点:

  • 优点: 
    • 易于理解和解释, 因为树木可以画出来被看见
    • 需要很少的数据准备, 其他很多算法通常都需要数据规范化, 需要创建虚拟变量并删除空值等, 但请注意, sklearn中的决策树模块不支持对缺失值的处理
    • 使用树的成本(比如说, 在预测数据的时候)是用于训练树的数据点的数量的对数, 相比于其他算法, 这是一个很低的成本
    • 能够同时处理数字和分类数据, 即可以做回归又来可以做分类, 其他技术通常专门用于分析仅有一种变量类型的数据集
    • 能够处理多输出问题,既含有多个标签的问题,注意一个标签中含有多重标签分类的问题区别开
    • 是一个白盒模型, 结果很容易能够被解释, 如果在模型中可以观察到给定的情况, 则可以通过布尔逻辑轻松解释条件, 相反, 在黑盒模型中(eg:人工神经网络)结果可能更难以解释
    • 可以使用统计测试验证模型, 这让我们可以考虑模型的可靠性
    • 即使其假设在某种程度上违反了生成数据的真是模型, 也能够表现良好
  • 缺点:
    • 决策树学习者可能通过创建过于复杂的树, 这些树不能很好的推广数据, 这称为过度拟合, 修剪, 设置叶子节点所需最小样本数或设置树的最大深度等极值是避免此问题所必需, 而这些参数的整合和调整对初学者来说会比较晦涩
    • 决策树可能不稳定, 数据中微笑的变化没可能导致生成完全不同的树, 这个问题需要通过集成算法解决
    • 决策树的学习是基于贪婪算法, 她考优化局部最优(每个节点的最优)来试图达到整体的最优, 但这种做法不能保证返回全局最优决策树, 这个问题也可以由集成算法来解决, 在随机森林中, 特征和样本会在分枝过程中被随机采样
    • 有些概念很难学习, 因为决策树不容易表达它们, 例如: XOR, 奇偶校验或多路复用器问题
    • 如果标签中的某些类占主导地位, 决策树学习这会创建偏向主导类的树,因此 建议在拟合决策树执勤啊的平衡数据集

参数及解释:

参数 注释
criterion

字符型, 可不填, 默认是("gini"), 用来衡量分枝质量的指标, 即衡量不纯度的指标, 输入"gini"使用基尼系数,或输入"entropy"

使用信息增益

splitter 字符型, 可不填, 默认最佳分枝("best"), 确定每个节点的分枝策略, 输入"best"使用最佳分枝, 或输入"random"使用最佳随机分枝
nmax_depth

整数或None, 可不填, 默认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> 如果输入浮点数, 则认为输入的浮点数是比例, 输入的浮点数"输模型数据集的样本量(n_sample)是叶节点存在所需的最小样本量"

min_weight_fraction_leaf

浮点数, 可不填, 默认=0, 一个也节点要存在所需要的全中占输入模型的数据集的总权重的比例, 总权重由fit接口中的sample_weight参数确定

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

max_features

整数, 浮点数, 字符型或None, 可不填, 默认None, 在做最佳分枝的时候, 考虑的特征个数

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

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

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

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

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

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

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

数目更多的特征

 random_state

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

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

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

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

 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_R, N_t_L都是样本量的权重, 而非单纯的样本数量

 min_impurity_split

浮点数, 

防止树生长的阈值之一, 如果一个节点的不纯度高于min_impurity_split, 这个节点就会被分枝, 否则的话这个节点就只能时叶子节点 

 class_weight

 字典,字典的列表, "balanced"或者"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:1}, {4:1}]

如果使用"balanced"模式, 将会使用y的值自动调整与输入数据中的类频率成反比的权重, 比如 nsamples/[nclasses*np.bincount(y)]

对于多输出问题, 每一列y的权重将被相乘

注意: 如果指定了sample_weight, 这些权重讲通过fit接口与sample_weight相乘

 presort

 布尔值, 可不填, 默认是False

是否预先分配数据以加快拟合中最佳分枝的发现, 在大型数据集上使用默认设置决策树时, 将这个参数设置为true可能会延长训练过程, 降低训练速度, 当使用较小的数据集

或限制树的深度时, 设置这个参数为true可能会加快训练速度.

分类树属性:

classs_ 输出一个数组(array)或者一个数组的列表(list),结构为标签的数目(n_classes)输出所有的标签
feature_importances_

输出一个数组, 结构为特征的数目(n_features)

返回每个特征的重要性, 一般是这个特征在多次分枝中差生的信息增益的综合, 也被称为"基尼重要性"

max_features_

输出整数

参数max_features的推断值

n_classes_

输出整数或列表

标签类别的数据

n_features_

在训练模型(fit)时使用的特征的个数

n_outputs_ 在训练模型(fit)时输出结果的个数
tree_

输出一个可以导出建好的树结构的端口, 通过这个端口, 可以访问树的结构和低级属性, 包括但步仅于查看:

1> 二叉树的结构

2> 每个节点的深度以及它是否时叶子

3> 是哦那个decision_path方法的示例到达的节点

4> 用apply这个接口取样出的叶子

5> 用于预测样本的规则

6> 一组样本共享的决策路径

分类树接口:

apply(X[check_input]) 输入测试集或样本点, 返回每个样本被分到叶节点的索引, check_input时接口apply的参数, 输入布尔值, 默认时True, 通常不同

decision_path[sample_weight,

check_input,...]

训练模型的接口, 其中X代表训练样本的特征,y代表目标搜数据, 即标签, X和y都必须时类数组结构,, 一般我们都使用ndarray来导入

sample_weight时fit的参数, 用来为样本标签设置权重, 输入的格式是一个和测试集样本来那个一致长度的数字数组, 数组中所带有的

数字表示每个样本量所占的权重, 数组中数字综合代表整个测试集的群众总数, 返回训练完毕的模型

get_params([deep])

布尔值, 获取这个模型评估对象的参数, 接口本身的参数deep, 默认为True, 表示返回次估计器的参数并包含作为估计起的子对象

返回模型评估对象在实例化时的参数设置

predict(x[,check_input])

预测所提供的测试集x中样本点的标签, 这里的测试集x必须和fit中提供的训练集结构一致

返回模型预测的测试样本的标签或回归

predict_log_proba(x) 预测所提供的测试集x中样本点归属于各个标签的对数概率
predict_proba(x,[check_input])

预测所提供的测试集x中样本点归属于各个标签的概率

返回测试集中每个样本点对应的每个标签的概率, 各个标签按词典顺序排序, 预测的类概率时叶中相同的样本的分数

scire(X, y[sample_weight])

用给定测试数据和标签的平均准确度作为模型的评分标准, 分钟数越高模型越好, 其中X时测试集, y时测试集的真是标签,

sample_weight时score的参数, 用法于fit的参数一致

返回给定树数据和标签的平均准确度, 在多标签分类中, 这个指标时子集精度

set_params(**params) 可以为已经建立的评估器重设参数, 返回重新设置的评估起本身
   
posted @ 2021-08-23 11:36  帅爆太阳的男人  阅读(106)  评论(0编辑  收藏  举报