Python实现决策树的预剪枝与后剪枝(中)

上一篇 / 下一篇  2022-10-20 14:49:55

  软件测试课程快来领取呀!点击下方链接参与测试行业问卷调查,价值398的课程马上领,还能参与抽奖活动,别错过!链接:http://vote.51testing.com/

  决策树的过拟合问题
  决策树学习采用"一一击破"的策略,执行贪心搜索 (greedy search) 来识别决策树内的最佳分割点。然后以自上而下的回归方式重复此拆分过程,直到所有或者大多数记录都标记为特定的类别标签。是否将所有数据点归为同类子集在很大程度上取决于决策树的复杂性。较小的决策树更容易获得无法分裂的叶节点,即单个类别中的数据点。然而,决策树的体量越来越大,就会越来越难保持这种纯度,并且通常会导致落在给定子树内的数据过少。这种情况被称为数据碎片,通常会引起数据过拟合。
  因此通常选择小型决策树,这与奥卡姆剃刀原理的"简单有效原理"相符,即"如无必要,勿增实体"。换句话说,我们应该只在必要时增加决策树的复杂性,因为最简单的往往是最好的。为了降低复杂性并防止过拟合,通常采用剪枝算法;这一过程会删除不太重要的特征的分支。然后,通过交叉验证评估模型的拟合。另一种保持决策树准确性的方法是使用随机森林算法形成一个集合;这种分类法可以得到更加准确的预测结果,特别是在决策树分支彼此不相关的情况下。
  决策树的剪枝
  决策树的剪枝有两种思路:
  预剪枝(Pre-Pruning)
  预剪枝就是在构造决策树的过程中,先对每个结点在划分前进行估计,如果当前结点的划分不能带来决策树模型泛化性能的提升,则不对当前结点进行划分并且将当前结点标记为叶结点。
  所有决策树的构建方法,都是在无法进一步降低熵的情况下才会停止创建分支的过程,为了避免过拟合,可以设定一个阈值,熵减小的数量小于这个阈值,即使还可以继续降低熵,也停止继续创建分支。但是这种方法实际中的效果并不好。
  决策树模型的剪枝操作主要会用到DecisionTreeClassifier()函数中的
  ·max_depth:指定了决策树的最大深度
  · max_leaf_nodes:指定了模型的叶子节点的最大数目
  · min_sample_split:指定了模型的节点允许分割的最小样本数
  · min_samples_leaf:指定了模型的一个叶节点上所需的最小样本数
  这里使用参数网格搜索的方式,对该模型中的四个参数进行搜索,并通过该在验证集上的预测精度为准测,获取较合适的模型参数组合。
  params = {'max_depth': np.arange(2,12,2),
            'max_leaf_nodes': np.arange(10,30,2),
            'min_samples_split': [2,3,4],
            'min_samples_leaf': [1,2]}
  clf = DecisionTreeClassifier(random_state=1)
  gcv = GridSearchCV(estimator=clf,param_grid=params)
  gcv.fit(X_train,y_train)
  model = gcv.best_estimator_
  model.fit(X_train,y_train)
  ## 可视化决策树经过剪剪枝后的树结构
  dot_data = StringIO()
  export_graphviz(model, out_file=dot_data,
                  feature_names=X_train.columns,
                  filled=True, 
                  rounded=True,
                  special_characters=True)
  graph = pydotplus.graph_from_dot_data(dot_data.getvalue()) 
  Image(graph.create_png())
预剪枝后决策树
  从剪枝后决策树模型中可以发现:该模型和未剪枝的模型相比已经大大的简化了。模型在训练集上有95个错误样本,但在测试集上只存在47个错误样本。
训练数据集混淆矩阵
测试数据集混淆矩阵

TAG: 软件开发 Python

 

评分:0

我来说两句

Open Toolbar