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

上一篇 / 下一篇  2022-10-20 13:25:35

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

  决策树是一种用于分类和回归任务的非参数监督学习算法。它是一种分层树形结构,由根节点、分支、内部节点和叶节点组成。
  从上图中可以看出,决策树从根节点开始,根节点没有任何传入分支。然后,根节点的传出分支为内部节点(也称为决策节点)提供信息。两种节点都基于可用功能执行评估以形成同类子集,这些子集由叶节点或终端节点表示。叶节点表示数据集内所有可能的结果。
  决策树的类型
  Hunt 算法于 20 世纪 60 年代提出,起初用于模拟心理学中的人类学习,为许多常用的决策树算法奠定了基础,例如:
  ID3:该算法的开发归功于 Ross Quinlan,全称为"迭代二叉树 3 代" ("Iterative Dichotomiser 3")。该算法利用信息熵与信息增益作为评估候选拆分的指标。
  C4.5:该算法是 ID3 的后期扩展,同样由 Quinlan 开发。它可以使用信息增益或增益率来评估决策树中的切分点。
  CART:术语 "CART" 的全称是"分类和回归",提出者是 Leo Breiman。该算法通常利用"基尼不纯度"来确定要拆分的理想属性。基尼不纯度衡量随机选择的属性被错误分类的频率。使用该评估方法时,基尼不纯度越小越理想。
  决策树的构建
  详细的构建过程可以参考:决策树的构建原理
  案例数据集准备
  泰坦尼克号数据集
数据处理后的数据集
幸存者统计
  决策树构建及可视化
  # 定于预测目标变量名
  Target = ["Survived"]
  ## 定义模型的自变量名
  train_x = ["Pclass", "Sex", "SibSp", "Parch",
             "Embarked", "Age_band","re"]
  ##将训练集切分为训练集和验证集
  X_train, X_val, y_train, y_val = train_test_split(
      data[train_x], data[Target],
      test_size = 0.25,random_state = 1)
  ## 先使用默认的参数建立一个决策树模型
  dtc1 = DecisionTreeClassifier(random_state=1)
  ## 使用训练数据进行训练
  dtc1 = dtc1.fit(X_train, y_train)
  ## 输出其在训练数据和验证数据集上的预测精度
  dtc1_lab = dtc1.predict(X_train)
  dtc1_pre = dtc1.predict(X_val)
  ## 将获得的决策树结构可视化
  dot_data = StringIO()
  export_graphviz(dtc1, 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())
  未剪枝决策树
  观察上图所示的模型结构可以发现,该模型是非常复杂的决策树模型,而且决策树的层数远远超过了10层,从而使用该决策树获得的规则会非常的复杂。通过模型的可视化进一步证明了获得的决策树模型具有严重的过拟合问题,需要对模型进行剪枝,精简模型。
  模型在训练集上有74个错误样本,而在测试集上存在50个错误样本。
训练数据集混淆矩阵
测试数据集混淆矩阵
  观察图1所示的模型结构可以发现,该模型是非常复杂的决策树模型,而且决策树的层数远远超过了10层,从而使用该决策树获得的规则会非常的复杂。通过模型的可视化进一步证明了获得的决策树模型具有严重的过拟合问题,需要对模型进行剪枝,精简模型。

TAG: 软件开发 Python

 

评分:0

我来说两句

Open Toolbar