【机器学习】决策树 随机森林
1. 决策树是什么决策树就是一个**“连环追问”**的流程图帮你一步步做出决定。核心结构像一棵倒长的树有根节点第一个问题、内部节点后续问题、分支问题的答案和叶节点最终结论。生活例子妈妈要给你介绍对象决策过程可能是问题1长得帅吗 → 是问题2有房吗 → 是结论嫁叶节点2. 决策树是怎么构建的具体步骤构建的核心原则是每次提问都要让剩下的“不确定性”减少得最多也就是让数据分得最开。具体构建步骤以分类树为例把所有数据放在根节点。寻找最佳分裂点遍历所有特征比如“颜值”、“收入”计算如果按这个特征划分数据混乱程度熵降低多少。降低最多的那个特征就是当前节点的分裂依据。分裂成子节点根据该特征的不同取值如“帅/不帅”把数据分成几堆。递归重复对每一个子节点重复步骤2和3继续分裂。停止生长直到节点里的数据全是同一类全嫁或全不嫁或者没有特征可用或者树已经达到预设的最大深度就停止形成叶节点。节点的选择构建决策树的核心就是在当前节点的所有数据中找到一个特征和一个分裂阈值使得分裂后子节点里的数据尽可能“纯”即尽量属于同一类。怎么衡量“纯不纯”常用三大指标三选一信息增益基于熵看混乱度下降了多少。下降越多越好。基尼系数Gini看随机抽两个样本它们不是同一类的概率。这个概率越小越好最常用因为计算快。方差减少MSE用于回归树看分裂后误差减小了多少。为了让你秒懂我们重点拿“基尼系数”因为sklearn默认用它。基尼系数节点不纯度计算设数据集为DDD共有KKK个类别pkp_kpk为第kkk类样本占比Gini(D)1−∑k1Kpk2 Gini(D) 1 - \sum_{k1}^{K} p_k^2Gini(D)1−k1∑Kpk2特征分裂后的加权基尼指数若特征AAA将DDD分成VVV个子集DvD_vDvGinisplit(D,A)∑v1V∣Dv∣∣D∣⋅Gini(Dv) Gini_{split}(D, A) \sum_{v1}^{V} \frac{|D_v|}{|D|} \cdot Gini(D_v)Ginisplit(D,A)v1∑V∣D∣∣Dv∣⋅Gini(Dv)二分类简化形式当K2K2K2时设正类比例为pppGini(D)2p(1−p) Gini(D) 2p(1-p)Gini(D)2p(1−p)分裂准则在CART分类与回归树算法中选择使得Ginisplit(D,A)Gini_{split}(D, A)Ginisplit(D,A)最小的特征AAA进行分裂。正式分裂——选出本节点的“最优解”刚才我们分别计算了“有无房产”基尼下降 0.23“年收入”的最佳切分点假设在20万处基尼下降 0.35决策树的逻辑基尼下降最大的那个特征 对应的切分条件就是当前节点的最优选择。如果“年收入”胜出那么当前节点就写“年收入 ≤ 20万”左边走“≤20万”右边走“20万”。3. 随机森林是什么一句话概括随机森林就是把很多棵“弱弱”的决策树集合在一起通过投票来做决策。核心思想“三个臭皮匠顶个诸葛亮”。单棵树容易“死记硬背”过拟合但几百棵树一起投票准确率更高也更稳定。生活例子不是问一个媒人“这人行不行”而是请100个媒人每人的标准略有不同分别看这个人最后统计哪个结论嫁/不嫁票数多就听谁的。4. 随机森林的“森林”是怎么构建的构建森林的核心原则是“双重随机”。这保证了每棵树都是独一无二的。具体构建步骤假设要建100棵树随机挑选数据行抽样从原始数据集中有放回地随机抽取同样数量的样本这叫Bagging。这意味着有些样本会被抽到多次有些一次也没抽到这些叫OOB数据用来做内部验证。每棵树用的数据集都不一样。随机挑选特征列抽样传统决策树会考虑所有特征去找最佳分裂点但随机森林不这样。在每一棵树的每一个节点准备分裂时只随机从所有特征中选出一小部分比如总共100个特征只随机选10个。强制这棵树只能从这10个特征里选最好的那个来分裂。分别生长基于以上“双重随机”选出的数据和特征让每一棵树按照正常的决策树构建方式但不剪枝让它尽量长深自由生长。合成森林把生成的100棵完全不同的树组合在一起就构成了随机森林。