
✨ 个人主页:在线OJ的阿川
💖文章专栏:机器学习应用入门到进阶
🌏代码仓库:GitHub平台
写在开头
现在您看到的是我的结论或想法,但在这背后凝结了大量的思考、经验和讨论
本文大致思维框架简图:
目录
- 1.相关库
- 2.决策树
- 3.详讲类及参数
- 4.百闻不如一见
1.相关库
相关库:Numpy、Pandas、Scipy、Scikit-learn(sklearn)、graphviz
- 其中Scikit-learn库
是主流的机器学习库,包含市面上主流的机器学习算法,即分类、回归、聚类、降维、模型选择、数据预处理。
2.决策树
决策树是一种非参数的有监督学习方法,能够从一系列有特征和标签的数据中总结出决策规则,并用树状图的结构来呈现这些规则,以解决分类和回归问题。
- 算法核心:
1.如何从数据表中找出最佳节点和最佳分支
2.如何让决策树停止生长,防止过拟合 - 应用模块:
决策树中的类都在tree这个模块之下,该模块包含5个类分别为:
1.tree.DecisionTreeClassifier
2.tree.DecisionTreeRegreessor
3.tree.export_graphviz
4.tree.ExtraTreeClassifier
5.tree.ExtraTreeRegressor
- 应用步骤:
1.实例化,建立评估模型对象
2.通过模型接口训练模型
3.通过模型接口提炼需要的信息
3.详讲类及参数
3.1.DecisionTreeClassifier类
-
其中criterion参数为不纯度的计算方法
不纯度越低,决策树对训练集的拟合越好(子节点不纯度一定低于父节点)。
区别:比起基尼系数,信息熵对不纯度更加敏感,对不纯度的惩罚最强,所以信息熵方法,会使决策树的生长更加精细,当决策树的拟合程度不够的时候,使用信息熵方法。但计算时间比基尼系数方法缓慢一些。而数据维度很大,噪声很大的时候使用基尼系数。 -
其中random_state参数为控制随机性
数可以随便,控制了之后,生成树也就固定了。但在高纬度时,随机性会表现更明显,低纬度的数据随机性几乎不会显现。
随机性控制必要性:无论决策树模型如何进化,在分支上的本质都还是追求某个不纯度相关的指标的优化,而不纯度是基于节点来计算的,也就是说决策树在建树的时候是靠优化节点来追求一棵优化的树,但最优化的节点不能够保证最优化的树,而集成算法能有效的解决该问题,既然一棵树不能保证最优,那就建立更多的不同的树,然后从中选取最好的。在每一次分支时,不使用全部特征,而是随机选取一部分特征,从中选取不纯度相关指标最优的作为分支用的节点,这样每一次生成的树也就不同了。 -
其中splitter参数也是用来控制决策树中的随机选项的
best参数值:决策树在分枝时虽然随机,但是还是会优先选择更重要的特征进行分支(本质上是根据属性feature _importances查看)
random参数值:决策树在分支时会更加随机,树会更深,对于训练集的拟合将会降低,可以有效地防止过拟合。 -
其中max_depth参数为限制树的最大深度
超过设定深度的树枝全部剪掉,这是最广泛的剪枝参数,在高纬度低样本量中是非常有效 ,因为决策树多生长一层,对样本量的需求会增加一倍,所以限制树深度能够有效地限制过拟合。(实际使用中建议从=3开始尝试看看拟合的效果,再决定是否增加设定深度)。 -
其中min_sample_leaf&min_sample_split参数
min_sample_leaf限定一个节点在分枝之后的每个子节点都必须包含至少min_sample_leaf个训练样本,否则分支就不会发生,或者分支会朝着满足每个子节点都包含min_sample_leaf样本的方向去发生。其中这个参数的数量设置太小,会引起过拟合,设置太大会阻止模型学习数据,一般来说建议从=5开始使用。如果叶节点中含有的样本量变化很大,建议输入浮点数作为样本量的百分比来使用。同时这个参数可以保证每个叶子的最小尺寸,可以在回归问题中避免低方差,导致过拟合的叶子结点出现。但对于类别不多的分类问题,=1通常就是最佳的选择。
min_sample_split可以限定每一个节点,必须要包含至少min_sample_split个训练样本,这个节点才允许被分支,否则分支就不会发生。 -
其中max_feature&min_impurity_decrease参数
max_feature限制分枝时考虑的特征个数,超过限制个数的特征都会被舍弃。它是用来限制高维度数据的过拟和的剪枝参数,但其方法比较暴力,是直接限制可以使用的特征数量而强行使决策树停下的参数。在不指导决策树的各个特征的重要性的情况下,强行设定这个参数可能会导致模型学习不足。
min_impurity_decrease是限制信息增益的大小,信息增益小于设定数值的分支就不会产生。 -
其中class_weight&min_weight_fraction_leaf参数
这两个参数是调整样本标签平衡的参数。因为在有些数据集中(例如一个办了银行卡的人是否会违约,是和否的概率分别为(1%、99%)),样本标签不平衡,在这种分类状况下,即使模型什么也不做,全把结果预测为否,正确率也有99%
因此要class_weight对样本标签进行一定的均衡,给少量的标签更多的权重,让模型更偏向少数类方向建模。但有了权重之后,样本量就不再是单纯的记录数目,而是受输入的权重影响了,因此剪枝就需要搭配min_weight_fraction_leaf这基于权重的剪枝参数来使用,可以更容易优化树结构,确保叶节点至少包含样本权重总和的一小部分。 -
重要属性和接口
属性是在模型训练之后,能够调用查看模型的各种性质。最重要属性的是 future_important能够查看各个特征对模型的重要性。
接口是指对模型进行交互的操作。 常见的有fit和score这两个接口分别是训练和得分,而apply和predict接口分别是返回测试集当中的索引和标签。
注意:所有接口中要求输入X_train和X_test的部分,输入的特征矩阵必须至少是一个二维矩阵,所有接口不接受任何一维矩阵作为特征矩阵,被输入的矩阵若真的只有一个特征则需要用reshape(-1,1)来给数据增维。 -
注意事项
1.因为在不加限制的情况下,一颗决策树会生长到衡量不纯度的指标最优,或者没有更多的特征可用为止。但是往往会导致过拟合,也就是说它会在训练集上表现很好,在测试集上却表示糟糕,为了让决策树有更好的泛化性,我们要对决策树进行剪枝,剪枝策略对决策树的影响巨大,正确的剪枝策略是优化决策树算法的核心。 -
确定最优的剪枝参数
1.使用确定超参数的曲线来进行判断每个参数填写什么值为最优。超参数的取值为横坐标,模型的度量指标为纵坐标的曲线,它是用来衡量不同超参数取值之下模型表现的线。
2.为了提高效率,网格搜索GridSearch(本质是枚举技术,实现了fit、score、交叉验证三个功能,缺点是耗时长)能够帮助我们同时调整多个参数,best_params_接口返回最佳参数组合,best_score_接口返回最佳精确性,但可能最佳精确性反而比原先更低,这是因为参数取值范围有些不合适,但它没法删除,只能强制去寻找最佳组合,这时候只能根据思考去判断哪些参数舍弃。 -
总结一下
3.2.DecisionTreeRegressor类
- criterion参数为回归树衡量分支质量的指标
mse属性值为使用均方误差,即使父节点和叶子节点之间的均方误差的差额作为特征选择的标准,这种方法通过使用叶子结点的均值来最小化L2损失。
friedman_mse属性值为费尔德曼均方误差,可以使用费尔德曼针对潜在分支中的问题改进后的均方误差
mae属性值为绝对平均误差,可以使用叶结点的中值来最小化L1损失。
注意:
1.在回归树中,mse不只是分枝质量衡量指标,也是最常用的衡量回归质量的指标。当我们在进行交叉验证或者使用其他方式获取回归树的结果时,往往选择均方误差作为我们的评估,mse值越小越好。但回归树的接口score返回的是R平方,并不是mse。而R平方最小可以为负无穷,最大为1(若模型的残差平方和远远大于模型的总平方和,则模型非常糟糕,R的平方就会为负)
2.虽然均方误差永远为正,但是sklearn当中使用均方误差作为评判标准时,却是计算"负均方误差"。因为均分误差本身是一种误差,被sklearn划分为模型的一种损失,所以都以负数表示。
3.3.export_graphviz类
- 参数feature_names为特征的名字
- 参数class_names为标签的名字
- 参数filled为是否用颜色进行区分
- 参数rounded是否边框有圆边
3.4.交叉验证(cross_val_score)
交叉验证(cross_val_score)是用来观察模型稳定性的一种方法,我们将数据划分成n份,依次使用其中一份作为测试集,其他n-1份作为训练集,多次计算模型的精确性来评估模型的平均准确程度。
- cv参数为交叉验证次数(一般选为5)
- scoring参数为评估结果的方法
4.百闻不如一见
- 1.我已经将相关的练习决策树代码放入了GitHub和csdn资源中,有需要自取哈。
- 2.相关练习代码主要包括分类实例、回归实例的练习以及用决策树方法处理kaggle竞赛中的泰坦尼克号数据。
5. 夹带私货
若你能看到看到这篇文章且能看到这,则说明你我有缘,留个关注吧,后面还会接着计算机408、底层原理、开源项目、以及数据、后端研发相关、实习、笔试/面试、秋招/春招、各种竞赛相关、简历相关、考研、学术相关……,祝你我变得更强
好的,到此为止啦,祝您变得更强
道阻且长 行则将至 |
---|
个人主页:在线OJ的阿川![]() ![]() |