【机器学习算法】之决策树

一.决策树算法简介

《统计学习方法》书中提到:统计学习=模型+策略+算法。接下来对于每个机器学习的算法,我都尝试从模型,策略,算法三个角度进行归纳。针对决策树算法:
1.模型
决策树算法实质上是从训练数据集中归纳出一组分类规则,也可以理解为对特征空间(超平面)的一种线性划分。决策树算法并没有一个参数化的模型,但是拥有条件概率的解释。如下图所示:
这里写图片描述
2.策略
由于决策树模型并没有一个参数化的模型,那么在初始时候也就无法写出显示的损失函数表达式。在现实中决策树模型采取的策略是启发式的学习:即先直接针对训练数据,利用相应的算法得到一组分类规则,然后再写出损失函数,并进行剪枝。假定依据某种算法,我们得到了一组规则,也得到了一颗决策树,那么这时候我们就可以写出参数化的损失函数:
这里写图片描述

3.算法
决策树模型采用的算法有两部分:生成决策树的算法和剪枝的算法。
生成决策树的算法:算法的思想是每次选择具有最好分类能力的特征来进行分类,利用该特征将数据集分割成子集,每个子集再递归进行分类。详见ID3,C4.5,CART算法。这种算法思想有些像贪心的策略:我的目的是对训练数据进行分类,现在训练数据有n个特征,那么依据贪心的策略,我每次都是选取分类效果最好的特征进行分类。至于如何评价一个特征分类效果的好坏,而需要信息增益相关的知识,可参考《统计学习方法》。
剪枝的算法:从叶子节点自下而上进行剪枝,可视为利用了DP的思想。

二.python实现

《机器学习实战》中实现的是ID3算法,没有进行剪枝的操作,创建决策树的函数程序如下:

def createTree(dataSet,labels):
    classList = [example[-1] for example in dataSet]//取数据集中类别标签,生成一个list
    if classList.count(classList[0]) == len(classList): 
        return classList[0]#stop splitting when all of the classes are equal
    if len(dataSet[0]) == 1: #stop splitting when there are no more features in dataSet
        return majorityCnt(classList)
    bestFeat = chooseBestFeatureToSplit(dataSet)//利用信息增益最大化的准则选取当前进行划分的特征
    bestFeatLabel = labels[bestFeat]
    myTree = {bestFeatLabel:{}}//建立字典,bestFeatLabel的含义是最佳分类特征的实际名称
    del(labels[bestFeat])
    featValues = [example[bestFeat] for example in dataSet]//取当前最佳分类特征的取值向量
    uniqueVals = set(featValues)
    for value in uniqueVals://对当前最佳分类特征的每个取值,递归构建子树
        subLabels = labels[:]       #copy all of labels, so trees don't mess up existing labels
        myTree[bestFeatLabel][value] = createTree(splitDataSet(dataSet, bestFeat, value),subLabels)
    return myTree                 

三.C++实现

shark2.4.5库中没有决策树,因此找了其他博主写的博客http://blog.youkuaiyun.com/yangliuy/article/details/7322015

程序如下:

#include <iostream>
#include <string>
#include <vector>
#include <map>
#include <algorithm>
#include <cmath>
using namespace std;
#define MAXLEN 6//输入每行的数据个数

//多叉树的实现 
//1 广义表
//2 父指针表示法,适于经常找父结点的应用
//3 子女链表示法,适于经常找子结点的应用
//4 左长子,右兄弟表示法,实现比较麻烦
//5 每个结点的所有孩子用vector保存
//教训:数据结构的设计很重要,本算法采用5比较合适,同时
//注意维护剩余样例和剩余属性信息,建树时横向遍历考循环属性的值,
//纵向遍历靠递归调用

vector <vector <string> > state;//实例集
vector <string> item(MAXLEN);//对应一行实例集
vector <string> attribute_row;//保存首行即属性行数据
string end("end");//输入结束
string yes("yes");
string no("no");
string blank("");
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值