决策树简单介绍(二) 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