最近在学习Pyspark的过程中,了解到了决策树算法(DecisionTree)和随机森林(RandomForest),在学习过程中,为了加深了解以及避免遗忘,做随笔记录如下。
决策树思想,实际上就是寻找最纯净的划分方法,这个最纯净在数学上叫纯度,另一种理解是分类误差率的衡量。实际决策树算法往往用到的是不纯度,不纯度的选取有多种方法,每种方法也就形成了不同的决策树方法,比如ID3算法使用信息增益作为不纯度,C4.5算法使用信息增益率作为不纯度,CART算法使用基尼系数作为不纯度。
决策树参数
参数 | 中文名称 | 备注 |
---|---|---|
max_features | 最大特征数 | 可以使用很多类型的值,默认是'None',意味着划分时考虑所有的特征数;如果是'log2'意味着划分时最多考虑 个特征;如果是'sqrt'或者'auto'意味着划分时最多考虑 个特征。如果是整数,代表考虑的特征绝对数。如果是浮点数,代表考虑特征百分比,即考虑(百分比*N)取整后的特征数。其中N为样本的总特征数。一般来说,如果样本的特征数不多,默认用'None'即可,如果特征数非常多,我们可以灵活使用刚才描述的其它取值来控制划分时考虑的最大特征数,以控制决策树的生成时间 |
max_depth | 决策树最大深度 | 默认可以不输入,如果不输入的话,决策树在建立子树的时候不会限制子树的深度。一般来说,数据少或者特征少的时候可以不管这个值。如果模型样本量多,特征也多的情况下,推荐限制这个最大深度,具体的取值取决于数据的分布。常用的可以取值10-100之间 |
min_samples_split | 内部节点再划分所需最小样本数 | 这个值限制了子树继续划分的条件,如果某节点的样本数少于min_samples_split,则不会继续再尝试选择最优特征来进行划分。默认是2,如果样本量不大,不需要更改,如果样本量数量级特别大,推荐增大这个值 |
min_samples_leaf | 叶子节点最少样本数 | 这个值限制叶子节点最少的样本数,如果某叶子节点数目小于样本数,则会和兄弟节点一起被剪枝。默认是1,可以输入最少的样本数的整数,或者最少样本数占样本总数的百分比。如果样本量不大,不需要管这个值,如果样本量数量级特别大,推荐增大这个值 |
min_weight_fraction_leaf | 叶子节点最小的样本权重 | 这个值限制了叶子节点所有样本权重和最小值,如果小于这个值,则会和兄弟节点一起被剪枝。默认是0,也就是不考虑权重的问题。一般来说,如果样本有较多的缺失值,或者分类数样本的分布类别差别很大,就会引入样本权重 |
max_leaf_nodes | 最大叶子节点数 | 通过限制最大叶子节点数,可以防止过拟合,默认是'None',即不限制最大叶子节点数。如果加了限制,算法会建立在最大叶子节点数内最优的决策树。如果特征不多,可以不考虑这个值,如果特征分成多的话,可以加以限制,具体的值可以通过交叉验证得到 |
min_impurity_split | 节点划分最小不纯度 | 这个值限制了决策树的增长,如果某节点的不纯度(基尼系数,信息增益,均方差,绝对差)小于这个阈值,则该节点不再生成子节点,即为叶子节点 |
class_weight | 类别权重 | 指定样本各类别的的权重,主要是为了防止训练集某些类别的样本过多,导致训练的决策树过于偏向这些类别。这里可以自己指定各个样本的权重,或者用“balanced”,如果使用“balanced”,则算法会自己计算权重,样本量少的类别所对应的样本权重会高。当然,如果你的样本类别分布没有明显的偏倚,则可以不管这个参数,选择默认的"None"。这个参数不适用与回归树 |
除了这些参数要注意以外,其他在调参时的注意点有:
1. 当样本少数量但是样本特征非常多的时候,决策树很容易过拟合,一般来说,样本数比特征数多一些会比较容易建立健壮的模型
2. 如果样本数量少但是样本特征非常多,在拟合决策树模型前,推荐先做维度规约,比如主成分分析(PCA),特征选择(Losso)或者独立成分分析(ICA)。这样特征的维度会大大减小。再来拟合决策树模型效果会好。
3. 推荐多用决策树的可视化(下节会讲),同时先限制决策树的深度(比如最多3层),这样可以先观察下生成的决策树里数据的初步拟合情况,然后再决定是否要增加深度。
4. 在训练模型先,注意观察样本的类别情况(主要指分类树),如果类别分布非常不均匀,就要考虑用class_weight来限制模型过于偏向样本多的类别。
5. 决策树的数组使用的是numpy的float32类型,如果训练数据不是这样的格式,算法会先做copy再运行。
6. 如果输入的样本矩阵是稀疏的,推荐在拟合前调用csc_matrix稀疏化,在预测前调用csr_matrix稀疏化。
- 随机森林是通过集成学习的思想将多颗树集成的一种算法,它的基本单元是决策树。随机森林中每颗树的生成规则如下:
- 如果训练集的大小为N,对于每颗树而言,随机且有放回的从训练集中抽取N个训练样本(这种采样方式称为bootstrap sample方法)作为该树的训练集。
a. 为什么要随机抽样训练集?
如果不进行随机抽样,每颗树的训练集都一样,那么最终训练出的树分类结果也是完全一样的
b. 为什么要有放回的抽样?
如果不是有放回的抽样,那么每棵树的训练样本都是不同的,都是没有交集的,这样每棵树都是"有偏的",都是绝对"片面的"(当然这样说可能不对),也就是说每棵树训练出来都是有很大的差异的;而随机森林最后分类取决于多棵树(弱分类器)的投票表决,这种表决应该是"求同",因此使用完全不同的训练集来训练每棵树这样对最终分类结果是没有帮助的,这样无异于是"盲人摸象"。 - 如果每个样本的特征维度为M,指定一个常数m<<M,随机地从M个特征中选取m个特征子集,每次树进行分裂时,从这m个特征中选择最优的;
- 每棵树都尽最大程度的生长,并且没有剪枝过程。
- 如果训练集的大小为N,对于每颗树而言,随机且有放回的从训练集中抽取N个训练样本(这种采样方式称为bootstrap sample方法)作为该树的训练集。
一开始我们提到的随机森林中的“随机”就是指的这里的两个随机性。两个随机性的引入对随机森林的分类性能至关重要。由于它们的引入,使得随机森林不容易陷入过拟合,并且具有很好得抗噪能力(比如:对缺省值不敏感)。
随机森林分类效果(错误率)与两个因素有关:
- 森林中任意两棵树的相关性:相关性越大,错误率越大;
- 森林中每棵树的分类能力:每棵树的分类能力越强,整个森林的错误率越低。
减小特征选择个数m,树的相关性和分类能力也会相应的降低;增大m,两者也会随之增大。所以关键问题是如何选择最优的m(或者是范围),这也是随机森林唯一的一个参数。