仲裁树简单介绍(二) Accord.Net中决策树的实现与行使

决定树介绍

决定树介绍

     
决策树是一模一样类机器上算法,可以兑现对数据集的归类、预测相当。具体求阅读我其他一样篇博客(http://www.cnblogs.com/twocold/p/5424517.html)。

     
决策树是同近乎机器上算法,可以实现对数据集的归类、预测等。具体求阅读我任何一样首博客(http://www.cnblogs.com/twocold/p/5424517.html)。

Accord.Net

Accord.Net

     
Accord.Net(http://accord-framework.net/)是一个开源之.Net环境下促成的机器上到底法库。并且还连了电脑视觉、图像处理、数据解析等等许多算法,并且多都是为此C#编的,对于.Net程序员十分谈得来。代码在Github托管,并且现在按照当护被。(https://github.com/accord-net/framework)。此处不再具体介绍,有趣味之可以去官网或Github下充斥文档和代码深入了解。此处就简单介绍决策树有的兑现同运办法。

     
Accord.Net(http://accord-framework.net/)是一个开源之.Net环境下实现的机上到底法库。并且还连了计算机视觉、图像处理、数据解析等等许多算法,并且多都是因此C#编纂的,对于.Net程序员十分友好。代码在Github托管,并且现在以以保障着。(https://github.com/accord-net/framework)。此处不再具体介绍,有趣味的得去官网或Github下充斥文档和代码深入摸底。此处就简单介绍决策树有的兑现与动方法。

决定树结构

核定树结构

      决策树、顾名思义,肯定是一个和培养结构,作为最基础之数据结构之一,我们获悉树结构的油滑。那么Accord.Net是怎么贯彻这种组织的啊?看类图

      决策树、顾名思义,肯定是一个以及塑造结构,作为最基础之数据结构之一,我们意识到树结构的油滑。那么Accord.Net是如何落实这种组织的啊?看类图

    图片 1

    图片 2

        首先观察树结构中最好要的一个组织,Node类的类图如下:

        首先观察树结构中极着重之一个组织,Node类的类图如下:

图片 3

图片 4

      简单介绍下主要性能方法。

      简单介绍下第一性能方法。

 

 

属性

含义

IsLeaf

是否为叶子节点

IsRoot

是否为根节点

Output

指示结点的类别信息(叶子节点可用)

Value

为非根节点时,表示其父节点分割特征的值

Branches

为非叶子节点时,表示其子结点的集合

属性

含义

IsLeaf

是否为叶子节点

IsRoot

是否为根节点

Output

指示结点的类别信息(叶子节点可用)

Value

为非根节点时,表示其父节点分割特征的值

Branches

为非叶子节点时,表示其子结点的集合

 

 

 

 

      还有树结构:

      还有树结构:

    图片 5

    图片 6

 

 

属性、方法

含义

Root

根节点

Attributes

标识各个特征的信息(连续、离散、范围)

InputCount

特征个数

OutputClasses

输出类别种数

Compute()

计算出某一样本的类别信息

Load(),Save()

将决策树存储到文件或者读出

ToAssembly()

存储到dll程序集中

属性、方法

含义

Root

根节点

Attributes

标识各个特征的信息(连续、离散、范围)

InputCount

特征个数

OutputClasses

输出类别种数

Compute()

计算出某一样本的类别信息

Load(),Save()

将决策树存储到文件或者读出

ToAssembly()

存储到dll程序集中

 

 

      还出外因项就不再逐一介绍了,Accord的官方文档里都发出进一步清晰的任课。

      还发出另外因项就不再逐一介绍了,Accord的官方文档里还出更进一步清晰的教授。

     
主要想如果说的凡ID3Learning和C45Learning两只类似。这是Accord.Net实现的一定量独裁定树学(训练)算法,ID3算法和C4.5算法(ID为Iterative
Dichotomiser的缩写,迭代二分器;C是Classifier的缩写,即第4.5替代分类器)。后面会介绍两者的分别。

     
主要想使说的凡ID3Learning和C45Learning两个像样。这是Accord.Net实现之蝇头单裁定树学(训练)算法,ID3算法和C4.5算法(ID为Iterative
Dichotomiser的缩写,迭代二分器;C是Classifier的缩写,即第4.5替分类器)。后面会介绍两者的区分。

决策树学算法:

决定树学算法:

     
这里以一个经典的于网球的例证,介绍ID3算法的念过程。要解下面的代码可能需要针对决策树的习过程有个基本的摸底,可以参照开头为出之链接学习下决策树的基本概念。

     
这里为一个经的由网球的例证,介绍ID3算法的就学过程。要明白下面的代码可能需要对决策树的读过程有只中心的问询,可以参见开头为来之链接学习下决策树的基本概念。

     

     

Mitchell’s Tennis Example

Mitchell’s Tennis Example

Day

Day

Outlook

Outlook

Temperature

Temperature

Humidity

Humidity

Wind

Wind

PlayTennis

PlayTennis

D1

D1

Sunny

Sunny

Hot

Hot

High

High

Weak

Weak

No

No

D2

D2

Sunny

Sunny

Hot

Hot

High

High

Strong

Strong

No

No

D3

D3

Overcast

Overcast

Hot

Hot

High

High

Weak

Weak

Yes

Yes

D4

D4

Rain

Rain

Mild

Mild

High

High

Weak

Weak

Yes

Yes

D5

D5

Rain

Rain

Cool

Cool

Normal

Normal

Weak

Weak

Yes

Yes

D6

D6

Rain

Rain

Cool

Cool

Normal

Normal

Strong

Strong

No

No

D7

D7

Overcast

Overcast

Cool

Cool

Normal

Normal

Strong

Strong

Yes

Yes

D8

D8

Sunny

Sunny

Mild

Mild

High

High

Weak

Weak

No

No

D9

D9

Sunny

Sunny

Cool

Cool

Normal

Normal

Weak

Weak

Yes

Yes

D10

D10

Rain

Rain

Mild

Mild

Normal

Normal

Weak

Weak

Yes

Yes

D11

D11

Sunny

Sunny

Mild

Mild

Normal

Normal

Strong

Strong

Yes

Yes

D12

D12

Overcast

Overcast

Mild

Mild

High

High

Strong

Strong

Yes

Yes

D13

D13

Overcast

Overcast

Hot

Hot

Normal

Normal

Weak

Weak

Yes

Yes

D14

D14

Rain

Rain

Mild

Mild

High

High

Strong

Strong

No

No

      

      

      首先,为了后面更组织决策树,我们用拿点的数据简化一下,以字符串存储和开展比较会消耗大量底内存空间,并且降低效率。考虑到具有特征都也离散特征,可以一直用极简易的整型表示即执行,只要保存下数字与字符串的对应关系就尽。Accord.Net用了CodeBook来促成,这里呢尽管不现实介绍了。然后用对树的片特性进行初始化,比如特征的个数(InputCount),类别数(OutputClasses)。还有每个特征可能的取值个数。接下来就是可以行使点codebook转义过之样本数量进行结构了。

      首先,为了后面更是组织决策树,我们要将地方的多寡简化一下,以字符串存储和进行比会损耗大量之内存空间,并且降低效率。考虑到持有特征都也离散特征,可以直接用最为简单易行的整型表示虽推行,只要保存下数字和字符串的应和关系就是实施。Accord.Net用了CodeBook来贯彻,这里也即未现实介绍了。然后用对树的一部分特性进行初始化,比如特征的个数(InputCount),类别数(OutputClasses)。还有每个特征可能的取值个数。接下来就是足以用点codebook转义过的样书数量开展结构了。

     
下面贴有ID3毕竟法被递归方法的伪代码,大致讲解下其促成逻辑(注:此代码删去了广大细节,因此无法运转,只约了解该实现逻辑。)。

     
下面贴发ID3算是法中递归方法的伪代码,大致讲解下其实现逻辑(注:此代码删去了过多细节,因此无法运转,只盖了解该促成逻辑。)。

 

 

 

 

        /// <summary>
        /// 决策树学习的分割构造递归方法
        /// </summary>
        /// <param name="root">当前递归结点</param>
        /// <param name="input">输入样本特征</param>
        /// <param name="output">样本对应类别</param>
        /// <param name="height">当前结点层数</param>
        private void split(DecisionNode root, int[][] input, int[] output, int height)
        {
            //递归return条件

            //1.如果output[]都相等,就是说当前所有样本类别相同,则递归结束。结点标记为叶子节点,output值标识为样本类别值           

            double entropy = Statistics.Tools.Entropy(output, outputClasses);

            if (entropy == 0)
            {
                if (output.Length > 0)
                    root.Output = output[0];
                return;
            }

            //2.如果当前路径上所有特征都用过一次了,也就是说现在所有样本在所有特征上取值相同,也就没法划分了;递归结束。结点标记为叶子节点,output值标识为样本类别值最多的那个

            //这个变量存储的是还未使用的特征个数
            int candidateCount = attributeUsageCount.Count(x => x < 1);

            if (candidateCount == 0)
            {
                root.Output = Statistics.Tools.Mode(output);
                return;
            }


            // 如果需要继续分裂,则首先寻找最优分裂特征,
            // 存储剩余所有可以特征的信息增益大小
            double[] scores = new double[candidateCount];
            // 循环计算每个特征分裂时的信息增益存储到scores里

            Parallel.For(0, scores.Length, i =>

            {
                scores[i] = computeGainRatio(input, output, candidates[i],
                    entropy, out partitions[i], out outputSubs[i]);
            }

            // 获取到最大信息增益对应的特征
            int maxGainIndex = scores.Max();
            // 接下来 需要按照特征的值分割当前的dataset,然后传递给子节点 递归
            DecisionNode[] children = new DecisionNode[maxGainPartition.Length];

            for (int i = 0; i < children.Length; i++)
            {
                int[][] inputSubset = input.Submatrix(maxGainPartition[i]);

                split(children[i], inputSubset, outputSubset, height + 1); // 递归每个子节点

            }

            root.Branches.AddRange(children);

        }
        /// <summary>
        /// 决策树学习的分割构造递归方法
        /// </summary>
        /// <param name="root">当前递归结点</param>
        /// <param name="input">输入样本特征</param>
        /// <param name="output">样本对应类别</param>
        /// <param name="height">当前结点层数</param>
        private void split(DecisionNode root, int[][] input, int[] output, int height)
        {
            //递归return条件

            //1.如果output[]都相等,就是说当前所有样本类别相同,则递归结束。结点标记为叶子节点,output值标识为样本类别值           

            double entropy = Statistics.Tools.Entropy(output, outputClasses);

            if (entropy == 0)
            {
                if (output.Length > 0)
                    root.Output = output[0];
                return;
            }

            //2.如果当前路径上所有特征都用过一次了,也就是说现在所有样本在所有特征上取值相同,也就没法划分了;递归结束。结点标记为叶子节点,output值标识为样本类别值最多的那个

            //这个变量存储的是还未使用的特征个数
            int candidateCount = attributeUsageCount.Count(x => x < 1);

            if (candidateCount == 0)
            {
                root.Output = Statistics.Tools.Mode(output);
                return;
            }


            // 如果需要继续分裂,则首先寻找最优分裂特征,
            // 存储剩余所有可以特征的信息增益大小
            double[] scores = new double[candidateCount];
            // 循环计算每个特征分裂时的信息增益存储到scores里

            Parallel.For(0, scores.Length, i =>

            {
                scores[i] = computeGainRatio(input, output, candidates[i],
                    entropy, out partitions[i], out outputSubs[i]);
            }

            // 获取到最大信息增益对应的特征
            int maxGainIndex = scores.Max();
            // 接下来 需要按照特征的值分割当前的dataset,然后传递给子节点 递归
            DecisionNode[] children = new DecisionNode[maxGainPartition.Length];

            for (int i = 0; i < children.Length; i++)
            {
                int[][] inputSubset = input.Submatrix(maxGainPartition[i]);

                split(children[i], inputSubset, outputSubset, height + 1); // 递归每个子节点

            }

            root.Branches.AddRange(children);

        }

 

 

 

 

     
此代码仅为便宜了解,具体落实细节要自行下载Accord源代码阅读,相信您见面来无数沾。

     
此代码仅为便利了解,具体贯彻细节要自行下载Accord源代码阅读,相信你见面发生很多获得。

      C4.5的实现同ID3到底法流程基本相同,有几只不同之处

      C4.5之落实同ID3算法流程基本相同,有几只不同之处

      1)
在挑最好优分割特征时,ID3算法采用的凡信息增益,C4.5使用的是增益率。

      1)
在选取最优分割特征时,ID3算法采用的是信增益,C4.5运用的凡增益率。

      2)
C4.5支持连续型特征,因此,在递归进行前,要利用二分效仿计算出n-1独候选划分点,将这些划分点当做离散变量处理便跟ID3过程同样了。同样是坐连续型变量,这样平等长条路子下连续型特征可以屡屡用来划分,而离散型特征每个只能用同不行。

      2)
C4.5支撑连续型特征,因此,在递归进行事先,要使用二私分法计算出n-1只候选划分点,将这些划分点当做离散变量处理就跟ID3历程一样了。同样是因连续型变量,这样同样漫长路径下连续型特征可以数之所以来划分,而离散型特征每个只能用同一软。

      3) C4.5支撑缺失值的处理,遗憾之凡Accord中连没有加入这无异于表征。

      3) C4.5支持缺失值的处理,遗憾之是Accord中连没参加这同一特色。

     Accord.Net中还被有了简要的剪枝算法,有趣味可以自动阅读。

     Accord.Net中尚为起了简便易行的剪枝算法,有趣味可以自动阅读。

      

      

   
 以地方的于网球例子,这里给出Accord.Net中结构和训练决策树的代码示例。

   
 以地方的由网球例子,这里为出Accord.Net中结构与教练决策树的代码示例。

           //数据输入 存储为DataTable
             DataTable data = new DataTable("Mitchell's Tennis Example");
            data.Columns.Add("Day");
            data.Columns.Add("Outlook");
            data.Columns.Add("Temperature");
            data.Columns.Add("Humidity");
            data.Columns.Add("Wind");
            data.Columns.Add("PlayTennis");

            data.Rows.Add("D1", "Sunny", "Hot", "High", "Weak", "No");
            data.Rows.Add("D2", "Sunny", "Hot", "High", "Strong", "No");
            data.Rows.Add("D3", "Overcast", "Hot", "High", "Weak", "Yes");
            data.Rows.Add("D4", "Rain", "Mild", "High", "Weak", "Yes");
            data.Rows.Add("D5", "Rain", "Cool", "Normal", "Weak", "Yes");
            data.Rows.Add("D6", "Rain", "Cool", "Normal", "Strong", "No");
            data.Rows.Add("D7", "Overcast", "Cool", "Normal", "Strong", "Yes");
            data.Rows.Add("D8", "Sunny", "Mild", "High", "Weak", "No");
            data.Rows.Add("D9", "Sunny", "Cool", "Normal", "Weak", "Yes");
            data.Rows.Add("D10", "Rain", "Mild", "Normal", "Weak", "Yes");
            data.Rows.Add("D11", "Sunny", "Mild", "Normal", "Strong", "Yes");
            data.Rows.Add("D12", "Overcast", "Mild", "High", "Strong", "Yes");
            data.Rows.Add("D13", "Overcast", "Hot", "Normal", "Weak", "Yes");
            data.Rows.Add("D14", "Rain", "Mild", "High", "Strong", "No");
            // 创建一个CodeBook对象,用于将data中的字符串“翻译”成整型
            Codification codebook = new Codification(data,
              "Outlook", "Temperature", "Humidity", "Wind", "PlayTennis");
            // 将data中的样本特征数据部分和类别信息分别转换成数组
            DataTable symbols = codebook.Apply(data);
            int[][] inputs = Matrix.ToArray<double>(symbols, "Outlook", "Temperature", "Humidity", "Wind");
            int[] outputs = Matrix.ToArray<int>(symbols, "PlayTennis");
            //分析得出每个特征的信息,如,每个特征的可取值个数。
           DecisionVariable[] attributes = DecisionVariable.FromCodebook(codebook, "Outlook", "Temperature", "Humidity", "Wind");

           int classCount = 2; //两种可能的输出,打网球和不打

            //根据参数初始化一个树结构
            DecisionTree tree = new DecisionTree(attributes, classCount);

            // 创建一个ID3训练方法
            ID3Learning id3learning = new ID3Learning(tree);

            // 训练该决策树
            id3learning.Run(inputs, outputs);

            //现在即可使用训练完成的决策树预测一个样本,并借助codebook“翻译”回来
            string answer = codebook.Translate("PlayTennis",tree.Compute(codebook.Translate("Sunny", "Hot", "High", "Strong")));
           //数据输入 存储为DataTable
             DataTable data = new DataTable("Mitchell's Tennis Example");
            data.Columns.Add("Day");
            data.Columns.Add("Outlook");
            data.Columns.Add("Temperature");
            data.Columns.Add("Humidity");
            data.Columns.Add("Wind");
            data.Columns.Add("PlayTennis");

            data.Rows.Add("D1", "Sunny", "Hot", "High", "Weak", "No");
            data.Rows.Add("D2", "Sunny", "Hot", "High", "Strong", "No");
            data.Rows.Add("D3", "Overcast", "Hot", "High", "Weak", "Yes");
            data.Rows.Add("D4", "Rain", "Mild", "High", "Weak", "Yes");
            data.Rows.Add("D5", "Rain", "Cool", "Normal", "Weak", "Yes");
            data.Rows.Add("D6", "Rain", "Cool", "Normal", "Strong", "No");
            data.Rows.Add("D7", "Overcast", "Cool", "Normal", "Strong", "Yes");
            data.Rows.Add("D8", "Sunny", "Mild", "High", "Weak", "No");
            data.Rows.Add("D9", "Sunny", "Cool", "Normal", "Weak", "Yes");
            data.Rows.Add("D10", "Rain", "Mild", "Normal", "Weak", "Yes");
            data.Rows.Add("D11", "Sunny", "Mild", "Normal", "Strong", "Yes");
            data.Rows.Add("D12", "Overcast", "Mild", "High", "Strong", "Yes");
            data.Rows.Add("D13", "Overcast", "Hot", "Normal", "Weak", "Yes");
            data.Rows.Add("D14", "Rain", "Mild", "High", "Strong", "No");
            // 创建一个CodeBook对象,用于将data中的字符串“翻译”成整型
            Codification codebook = new Codification(data,
              "Outlook", "Temperature", "Humidity", "Wind", "PlayTennis");
            // 将data中的样本特征数据部分和类别信息分别转换成数组
            DataTable symbols = codebook.Apply(data);
            int[][] inputs = Matrix.ToArray<double>(symbols, "Outlook", "Temperature", "Humidity", "Wind");
            int[] outputs = Matrix.ToArray<int>(symbols, "PlayTennis");
            //分析得出每个特征的信息,如,每个特征的可取值个数。
           DecisionVariable[] attributes = DecisionVariable.FromCodebook(codebook, "Outlook", "Temperature", "Humidity", "Wind");

           int classCount = 2; //两种可能的输出,打网球和不打

            //根据参数初始化一个树结构
            DecisionTree tree = new DecisionTree(attributes, classCount);

            // 创建一个ID3训练方法
            ID3Learning id3learning = new ID3Learning(tree);

            // 训练该决策树
            id3learning.Run(inputs, outputs);

            //现在即可使用训练完成的决策树预测一个样本,并借助codebook“翻译”回来
            string answer = codebook.Translate("PlayTennis",tree.Compute(codebook.Translate("Sunny", "Hot", "High", "Strong")));

    贴平布置用决策树做的小例子。

    贴平摆采用决策树做的小例子。

图片 7

图片 8