基于决策树和随机森林的鸢尾花种类预测
- sklearn中与决策树分类有关的函数是DecisionTreeClassifier函数,本次实验主要使用DecisionTreeClassifier,集成学习由RandomForestRegressor函数指定若干棵决策树。使用这两种函数默认参数。
- 指定决策树算法。使用criterion="entropy"(信息熵)、criterion=”gini”(CART算法),同时修改max_depth的值分选择2和5进行实验。以及使用20棵和50棵决策树的随机森林进行实验。
3. 使用标准化后的数据进行模型的训练,比较模型的性能。
4. 画图查看决策树深度和错误率之间的关系,观察是否存在过拟合现象:
5.尝试不同的剪枝参数训练模型,对结果进行比较,画出准确率随深度的变化图:
(剪枝参数:max_depth:限制树的最多分层,适用于高维低量样本,分一层需要的样本就多一倍,一般从3开始试。与这个参数类似的还有:
min_samples_leaf: 一个节点分支后的子节点上至少包含多少的训练样本数量。
min_samples_split :一个节点上至少包含多少训练样本数量。)
6.打印预测值和真实值之间的图像(一张图即可)。
7.使用graphviz进行决策树的可视化(gini和entropy各一张)
- 结果分析
根据上述实验结果对比不同的函数,不同剪枝方法,不同类型的决策树方法和随机森林的实验结果,可以根据网格搜索得出最佳结果。
使用标准化后的数据进行模型的训练,比较模型的性能,并画图查看决策树深度和错误率之间的关系,观察是否存在过拟合现象。
代码1构建决策树随机森林结果:
代码2使用不同决策方式、深度、森林数量的模型结果如下:
代码3标准化后模型结果如下:
代码4查看深度与错误率的关系结果如下:
代码5查看不同剪枝策略对决策树模型结果准确率的影响结果:
代码6查看max_depth剪枝后预测值和真实值的差异结果:
代码7使用graphviz可视化决策树预测过程(分别使用entropy和gini)结果如下:
结果分析
从代码1的运行结果中我们就可以看到决策树和随机森林即使使用默认参数,对鸢尾花数据集的预测结果也很好。
通过调整模型参数,我们可以得到不同的分类结果,具体看到代码2的结果,不管是使用信息增益还是gini指数来评估决策树分类结果,对于鸢尾花数据,决策树深度为5的时候的模型结果都会优于深度为3的时候的准确率。而对于随机森林来说,森林里树木数量为20和50的结果都是100%的预测准确率,可见随机森林的分类效果较优,参数的调整对分类结果的影响不大,甚至可能导致过拟合。
对比代码3运行结果,可以看到标准化后模型的准确率没有明显变化,因为它们是基于特征值而非其缩放来拆分数据,它们可以在没有标准化的情况下良好运行,标准化通常对依赖距离度量的算法更有益,比如 k-最近邻或支持向量机。
通过代码4的运行结果我们可以看到,不管是训练集还是测试集,在depth=2以前该参数对模型准确率的影响都是比较大的,当depth>2时影响变小,而当训练集的决策树深度达到6的时候,模型的准确率就已经来到了100%,当测试集决策树深度达到3时,模型的准确率就已经来到了100%。
通过代码5的运行结果可以看出,min_samples_leaf和min_samples_split两种剪枝策略在当前数据集的决策树模型下作用较大,让模型在depth=1的时候就已经达到了100%的准确率,而调整max_depth参数至3的时候模型才达到100%的准确率。
从代码6运行结果我们可以看出,当max_depth=2的时候,决策树并不能全部预测正确,比如第五个数据他就把类别1的样本预测为类别2了。
通过代码7的运行结果,我们可以很清晰的看出决策树使用entorpy和gini两种方式进行鸢尾花数据分类的决策过程。其中petal_length是该分支的花瓣长度,第二行gini/entropy是决策方法, samples是数据集大小,value是对数据特征属于各个类别的概率数量比例,class表示该节点的预测结果。
提高决策树、随机森林模型准确率的可能方法。
1.调整超参数
比如调整决策树的深度,这里决策树采用depth=5的效果就比depth=2的效果好,同理调整随机森林中树的数量也有助于提高模型性能,超参数的调整可以引入网格搜索来选择模型的最佳值。
2.特征工程
做好数据提取工作和数据预处理工作,比如缺失值处理、分层采样等。也可以对数据进行标准化归一化把数据变为更适合该算法的数据。使用PCA降维或者随机森林的 feature_importances_ 属性,识别哪些特征对模型的性能影响最大,减少其他权重较小的特征的影响。也可以使用预剪枝和后剪枝策略调整决策树分支,防止过拟合
3.集成学习
调整随机森林参数: 考虑调整随机森林的其他参数,如每棵树的最大深度、每个节点的最小样本拆分数量等,以优化性能。
尝试其他集成模型: 除了随机森林,还可以尝试其他集成学习方法,如梯度提升树(Gradient Boosting)等。
4.损失验证
使用交叉熵损失函数或者均方误差来评估模型。防止过拟合,并获得对模型泛化能力的更好估计