机器学习之决策树

在这里,我想以更直观的方式帮助各位理解、掌握并且运用【注意:是运用 】决策树,从而为机器学习作铺垫。
PS:但还是希望大家稍微知道决策树大概是什么样子。

一、简单概念

1.根结点(root node):没有入边,但有零条或多条出边
2.内部结点(internal node):恰有一条入边和 两条或多条出边
3.叶结点(leaf node): 恰有一条入边,无出边
4.熵(entropy):这个不太容易解释。首先,一条信息的信息量大小和它的不确定性有直接的关系,要搞清楚一件非常非常不确定的事,需要了解大量信息。所以,信息量的度量就等于不确定性的多少。而不确定性越大,则熵也就越大。
熵的计算公式为:(后面会很重要
这里写图片描述
这里:P表示概率。后面会以计算的形式来阐述怎么使用。

二、选择属性判断结点

决策树是由一个一个结点组成的,结点其实就是判断条件。但条件众多,选择哪个条件为根结点,哪些条件为内部结点,需要根据信息获取量(Info Gain)来计算。
公式:Gain(A) = Info(D) - Info_A[D];通过A作为结点分类获取了多少信息。
D:数据集。
先看一组数据:
这里写图片描述
14个样本,9个buy。4个不buy。可以得到整个数据集的熵。
然后计算以age为根结点的熵。其中5个youth,4个mid,5个senior。根据公式计算熵。
然后计算Info Gain。
这里写图片描述
计算完后,分别以其他属性为根节点的熵。最终确定age为根结点。然后不考虑age,在下个结点中用同样方法选取。

只要结点设置好了,其实决策树就差不多完成了。

三、代码实现决策树算法

# -*- coding: utf-8 -*-
'''
@author: mckee
'''
import csv
from sklearn.feature_extraction import DictVectorizer
from sklearn import tree

if __name__ == '__main__':
    attributeList = []
    labelList = []
    #首先上面表中信息存储与csv文件中,所以需要读取出来
    handle = csv.reader(open('data.csv'))
    n = 0
    for line in handle:
        if n == 0:
            attribute = line #第一行就是属性名称
        else:
            if line[-1] == 'yes':
                labelList.append(1)
            else:
                labelList.append(0)#然后确定分类label,买就是1,不买就是0
            feature = {}
            feature[attribute[1]] = line[1]
            feature[attribute[2]] = line[2]
            feature[attribute[3]] = line[3]
            feature[attribute[4]] = line[4]
            attributeList.append(feature)#之后,将每行信息以dict形式保存与list中
        n = n+1
    vec = DictVectorizer()
    feature_Matrix = vec.fit_transform(attributeList).toarray()#因为属性中的值都是string,所以需要转化为0,1.例:一个年轻人:老中青的value就是[0 0 1].
    describe = ['middle_aged','senior','youth','excellent','fair','high','low','medium','no','yes']#这是对上面生成的矩阵每列含义进行描述,便于理解
    print feature_Matrix
    print describe
    print labelList
    classifier = tree.DecisionTreeClassifier(criterion='entropy')
    print classifier #分类器的默认参数
    classifier = classifier.fit(feature_Matrix,labelList)

    handle1 = open('decisionTREE.txt','w')
    handle1 =  tree.export_graphviz(classifier,feature_names = vec.get_feature_names(),out_file=handle1)#将生成的决策树输出

#决策树建立好,就可以对第三方测试集进行测试。
    test = feature_Matrix[2]
    predict = classifier.predict(test)
    print predict

生成的决策树为:
这里写图片描述
为了更直观理解,我动手画了一下。
这里写图片描述

四、决策树优缺点

1.优点:直观、便于理解,小规模数据集有效
2.缺点:(1)处理连续变量不好,比如income,需要设置阈值进行离散化eg:>10K , <20K,>20K
(2)类别较多时,错误增加比较快
(3) 可规模性一般

五、附

上传一下自己的笔记,以后自己回顾也更方便
这里写图片描述
这里写图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值