【人工智能】决策树与随机森林方式的泰坦尼克号幸存者预测报告
编译器:Pycharm2019+Anaconda虚拟环境
Python版本:3.7
所需Python模块:


一、 对决策树及问题本身的认识
在正式运用随机森林算法之前,必须用普通的决策树对解决泰坦尼克号幸存者预测进行实验验证,找到针对该问题的模型优化的可行性方法。
决策树 是一种基本的分类与回归方法,学习通常包含三个步骤:特征选择、决策树的生成和决策树的剪枝。决策树实际上就是寻找最纯净的划分方法,向着让特征“混乱度”(熵)降低最快的方向划分,当划分到一定纯度则停止分类,生成决策树,学习这个过程生成我们需要的智能模型;而过度追求纯度会忽视类别的本质,造成过拟合现象,这时就需要“剪枝”,剔除掉多余的影响。
根据决策树的实现步骤——
① 首先做的是读取、标记数据、丢弃一定的无关数据。这里所用的方法同教材(《scikit-learn机器学习:常用算法原理及编程实战》)中的相同,就不单独列出了,需要对决策树有初步了解的还可以 参考文章末尾 给出的链接。


② 随后以适应大数据量计算的简单交叉验证方法,需调用train_test_split函数将从train.csv中读取的891个样本分为训练数据集(tr)和交叉验证数据集(cv)。

数据处理完毕后,可以先进行决策树的生成观察结果进行有指向性的优化工作。第一次初始化生成树的效果(两数据集的验证准确率)如下:

可以直观看到训练数据集准确率极高,存在过拟合风险,多次运行验证数据集的结果的确相差较大。用安装的graphviz生成该决策树的树状图:

得到的模型十分复杂,准备从着手进行改进,先从判断信息混乱程度的标准(用informationentropy还是Gini impurity)与对应的结束阀值(min_impurity_decrease)入手。

上图中定义的im_threshold函数显示的是以基尼不纯度(Gini impurity)为指标的最佳阀值寻找过程,同样,生成的决策树和一次交叉验证结果如下:


不仅拟合的曲线效果不错,决策树也被简化了很多,交叉验证数据集的准确率也比较可观。不过准确率虽然有时能达到很高的值,稳定性有所欠缺,作另外两次检测不改变参数分别得到的结果:


在此基础上试着去衡量其他指标共同限制下模型的拟合情况设置criterion(标准)、min_impurity_decrease(阀值)、max_depth(深度)、min_samples_split(节点划分后的样本数)。如下图通过自己定义的函数im_multiply构建所需的字典param_grid,调用GridSearchCV来实现,找到的最佳参数组合以及调整后再次拟合绘制的决策树模型,示例图:


可以看到两个验证数据的验证结果十分接近,过拟合问题得到一定解决,而且决策树较之前者更为简化,预测时的效率进一步提高,稳定性也提高了。但因为限制过多影响了机器学习的敏锐性,预测的准确率没有前者来得高,而且在寻找最优参数时因为组合增多导致的计算量变大,使算法 运行时间过长 ,虽然寻找最优参数只需运行一次,但性价比相对还是不高。

二、随机森林方式的模型优化
随机森林 便是在决策树基础上的一种集成学习(Ensemble Learning)方法,在结构上同普通的决策树相一致,起到了避免对某一关联性较大发特征作出“倾向性”决策的危险,而为了衡量分析这个优化过程的好坏我们可以首先通过定义的函数plot_learning_curve简单绘制其本身的学习曲线:


可以看到训练数据集一直保持着极高的准确率,同交叉验证数据集的差距很明显,存在 过拟合 现象,必须进行参数的优化,方法同普通决策树中的优化思路(建立所需的字典,依次检验找到最佳)一致,其中一个重要的参数就是随机森林的 决策树生成数量n_estimators 。和普通决策树的方案一样,自行定义im_RandomForest函数来找到最优的参数组合,如图得到结果:

增添参数后二次进行拟合,并画出优化过后的模型学习曲线,且对test.csv中的数据进行预测。

由于随机森林生成了多条决策树进行选择,整个集成学习是较为抽象的(树和森林的解释虽然比较形象),为了直观一点看到决策树的结果,且不嫌麻烦的话,我们可以全部已图像来生成,全部列出是一件难以实现的工作,在这里只给出其中一条:

根据最优参数配置运行完毕,观察学习曲线,可以看到曲线拟合较为成功,解决了过拟合的问题。为了再比较两种标准对拟合模型的影响,又用gini作为标准进行了一次拟合与预测,结果二者的区别并不明显,最终运行结果、决策树模型、学习曲线效果如下:




参考文章:
https://blog.csdn.net/alionsss/article/details/88173945
https://www.cnblogs.com/bonelee/p/8036024.html
https://www.cnblogs.com/baby-lily/p/10646226.html
https://blog.csdn.net/submarineas/article/details/85727804
https://blog.csdn.net/guolindonggld/article/details/101135001
《scikit-learn机器学习:常用算法原理及编程实战》_黄永昌
本文所用代码(注意读取文档运行时的相对路径是否正确)、文件文档(包括训练集测试集)、图片压缩包:
链接:https://pan.baidu.com/s/1YzGX48luWolJsNkEg9pZ4A
提取码:sh8s
