当前位置:   article > 正文

weka分类器-C4.5决策树_c4.5构造决策树分类器是什么

c4.5构造决策树分类器是什么

1.     算法概述

 C4.5,是机器学习算法中的另一个分类决策树算法,它是决策树(决策树也就是做决策的节点间的组织方式像一棵树,其实是一个倒树)核心算法,是相对于ID3算法的改进,主要改进点有:

1.      用信息增益率来选择属性。C4.5克服了ID3用信息增益选择属性时偏向选择取值多的属性的不足。

2.      在树构造过程中进行剪枝。

3.      对非离散数据也能处理。

4.      能够对不完整数据进行处理。

 

2.     算法过程

统计好样本集S,属性集A,分别求出属性集中每个属性的信息增益率,选中增益率最大的属性P,假设P总有n种情况的取值(连续变量要离散化),那么分别统计好第i种情况时样本集Si和除去P的属性集Pi,递归生成相对应的子树。

2.1 主要步骤

1  读取文件信息,统计数目

2  建立决策树

如果样本集为空,则生成一个信息数目都为0的树节点返回

如果样本均为同一类别,则生成一个叶子节点返回

计算节点正负样本的数目

如果属性值只有那个类别的属性,则生成一个叶子节点,并赋值类型索引

如果以上都不是,则选择一个增益率最大的属性(连续属性要用增益率离散化),按那个属性的取值情况从新定义样本集和属性集,建造相关子树

3  事后剪枝(采用悲观错误率估算)

4  输出决策树

5  移除决策时

 

3.     算法实现分析

3.1 训练分类器

public voidbuildClassifier(Instances instances) throws Exception {

 

      ModelSelectionmodSelection;

 

      if (m_binarySplits)

         modSelection= newBinC45ModelSelection(m_minNumObj, instances, m_useMDLcorrection);

      else

         modSelection= newC45ModelSelection(m_minNumObj, instances, m_useMDLcorrection);

      if (!m_reducedErrorPruning)

         m_root = newC45PruneableClassifierTree(modSelection, !m_unpruned,

                m_CF, m_subtreeRaising, !m_noCleanup, m_collapseTree);

      else

         m_root = newPruneableClassifierTree(modSelection, !m_unpruned,

                m_numFolds, !m_noCleanup, m_Seed);

      m_root.buildClassifier(instances);

   }

第一个if判断是否对nominal属性进行二分裂,第二个if是判断是否对tree进行剪枝。

modSelection后面会被用于选择足有的分裂模型。

m_root是该树的根节点。

上面比较重要的是最后一句m_root.buildClassifier(instances);用于在各节点中构建分类器。下面我们看看其代码:

(C45PruneableClassifierTree.java)

public voidbuildClassifier(Instances data) throws Exception {

 

……

      buildTree(data,m_subtreeRaising);

      if (m_collapseTheTree){

         collapse();

      }

      if (m_pruneTheTree) {

         prune();

      }

      if (m_cleanup) {

         cleanup(new Instances(data, 0));

      }

   }

过程为:首选见创建树然后根据需要对数进行节点折叠、剪枝、清理内存空间等。下面我们依次分析:

3.1.1 创建树buildTree (ClassifierTree.java)

public voidbuildTree(Instances data, boolean keepData) throwsException {

   

   Instances [] localInstances;

 

   if(keepData) {

     m_train= data;

   }

   m_test= null;

   m_isLeaf= false;

   m_isEmpty= false;

   m_sons= null;

   m_localModel = m_toSelectModel.selectModel(data); //选择最优的分裂模型

   if(m_localModel.numSubsets()> 1) {

     localInstances = m_localModel.split(data);  //对训练数据进行分组

     data = null;

     m_sons= newClassifierTree [m_localModel.numSubsets()]; //分配子树

     for(inti = 0; i <

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/398774
推荐阅读
相关标签
  

闽ICP备14008679号