个人对决策树理论的理解:决策树就像是由不同层级的很多选择器的组合,这些选择器内部的criteria是通过对训练集中的数据学习得到的。之后有新的数据传入时,选择器就一层层的对输入数据做判断,最底层选择器给出最有可能的分类结果
tree_clf = DecisionTreeClassifier()
其中可设置的重要参数有:
输入”entropy“,使用信息熵(Entropy):信息熵是一种衡量数据混乱程度的指标,信息熵越小,则数据的“纯度”越高
输入”gini“,使用基尼系数(Gini Impurity): 基尼指数反映了从数据集 中随机抽取两个的类别标记不一致的概率
这两个分类标准越小,意味着选择器里的数据越接近,分类标准越大意味着数据分布很杂乱
树的最大深度,超过设定深度的树枝全部剪掉。这是用得最广泛的剪枝参数,在高维度低样本量时非常有效。决策树多生长一层,对样本量的需求会增加一倍,所以限制树深度能够有效地限制过拟合。
min_samples_leaf 限定,一个节点在分枝后的每个子节点都必须包含至少min_samples_leaf个训练样本,否则分枝就不会发生,或者,分枝会朝着满足每个子节点都包含min_samples_leaf个样本的方向去发生。一般搭配max_depth使用,在回归树中有神奇的效果,可以让模型变得更加平滑。这个参数的数量设置得太小会引起过拟合,设置得太大就会阻止模型学习数据。
在原代码上对于缺失值是用-1进行填充的,因此可以从上图中看出存在一个很不合理的数据点。Culmen Length怎么可能为-1?
因此这里改为用前向填充进行缺失值的填充
data = data.fillna(method = 'ffill')
处理后,可以从数据可视化图表中看出:整体数据更加清晰可信,有利于提高后续模型训练的准确度。
原代码上并没有对训练模型参数进行设置,都是用的默认值。模型表现表现如下:
决策树的分类能力很强,不加限制的话会将所有数据归类,很容易过拟合。在训练集上表现往往高于测试集不少,在这里高出4个百分点。
因此尝试调整参数min_sample_leaf, max_depth来抑制过拟合改善模型的表现。前者提高继续往下分类的门槛,后者强行减少分类的层数。
结果显示模型预测结果提高约两个百分点,而且两个准确度相差不大,有效抑制了过拟合。
总体来说决策树是一种较简单的非线性分类模型,而且很好理解。但是很容易过拟合,需要调整模型参数进行剪枝处理,而且决策树结构不稳定随着数据不同,波动很大。
最后附上调参后的树结构: