决策树

决策树内容简介

决策树是一种基本的分类方法,当然也可以用于回归。我们一般只讨论用于分类的决策树。决策树模型呈树形结构。在分类问题中,表示基于特征对实例进行分类的过程,它可以认为是if-then规则的集合。在决策树的结构中,每一个实例都被一条路径或者一条规则所覆盖。通常决策树学习包括三个步骤:特征选择决策树的生成决策树的修剪

优点:计算复杂度不高,输出结果易于理解,对中间值的缺失不敏感,可以处理逻辑回归等不能解决的非线性特征数据
缺点:可能产生过度匹配问题
适用数据类型:数值型和标称型

  • 1、认识决策树
  • 2、信息论基础-银行贷款分析
  • 3、决策树的生成

1、认识决策树

决策树思想的来源非常朴素,程序设计中的条件分支结构就是if-then结构,最早的决策树就是利用这类结构分割数据的一种分类学习方法
相亲样例
比如:你母亲要给你介绍男朋友,是这么来对话的:
女儿:多大年纪了?
母亲:26。
女儿:长的帅不帅?
母亲:挺帅的。
女儿:收入高不?
母亲:不算很高,中等情况。
女儿:是公务员不?
母亲:是,在税务局上班呢。
女儿:那好,我去见见。
在这里插入图片描述

2、银行贷款分析

特征选择在于选取对训练数据具有分类能力的特征。这样可以提高决策树学习的效率,如果利用一个特征进行分类的结果与随机分类的结果没有很大差别,则称这个特征是没有分类能力的。经验上扔掉这样的特征对决策树学习的京都影响不大。通常特征选择的准则是信息增益,这是个数学概念。通过一个例子来了解特征选择的过程。
在这里插入图片描述
我们希望通过所给的训练数据学习一个贷款申请的决策树,用以对文莱的贷款申请进行分类,即当新的客户提出贷款申请是,根据申请人的特征利用决策树决定是否批准贷款申请。特征选择其实是决定用那个特征来划分特征空间。下图中分别是按照年龄,还有是否有工作来划分得到不同的子节点
你如何去划分是否能得到贷款?
在这里插入图片描述在这里插入图片描述
问题是究竟选择哪个特征更好些呢?那么直观上,如果一个特征具有更好的分类能力,是的各个自己在当前的条件下有最好的分类,那么就更应该选择这个特征。信息增益就能很好的表示这一直观的准则。这样得到的一棵决策树只用了两个特征就进行了判断:
决策树的实际划分
在这里插入图片描述
通过信息增益生成的决策树结构,更加明显、快速的划分类别
信息的度量和作用
猜谁是冠军?假设有32支球队

每猜一次给一块钱,告诉我是否猜对了,那么我需要掏多少钱才能知道谁是冠军?我可以把球编上号,从1到32,然后提问:冠 军在1-16号吗?依次询问,只需要五次,就可以知道结果。

信息论的创始人,香农是密歇根大学学士,麻省理工学院博士。
1948年,香农发表了划时代的论文——通信的数学原理,奠定了现代信息论的基础
信息的单位:比特

32支球队,log32=5比特
64支球队,log64=6比特

信息熵

“谁是世界杯冠军”的信息量应该比5比特少。香农指出,它的准确信息量应该是:

H = -(p1logp1 + p2logp2 + … + p32logp32)

  • H的专业术语称之为信息熵,单位为比特。
  • 公式: H ( X ) = ∑ x ∈ X P ( X ) l o g P ( x ) H(X)=\sum _{x \in X }P(X)logP(x) H(X)=xXP(X)logP(x)

当这32支球队夺冠的几率相同时,对应的信息熵等于5比特
信息和消除不确定性是相联系的!!!

决策树的划分依据之一信息增益
特征A对训练数据集D的信息增益g(D,A),定义为集合D的信息熵H(D)与特征A给定条件下D的信息条件熵H(D|A)之差,即公式为 g ( D , A ) = H ( D ) − H ( D ∣ A ) g(D,A)=H(D)-H(D|A) g(D,A)=H(D)H(DA)

 H(D)是初始信息熵大小,H(D|A)是因为条件加入后带来的确定性增加
 注:信息增益表示得知特征X的信息而使得类Y的信息的不确定性减少的程度

信息增益的计算

结合前面的贷款数据来看我们的公式:

  • 信息熵的计算
    H ( D ) = − ∑ k = 1 K ∣ C k ∣ ∣ D ∣ l o g ∣ C k ∣ ∣ D ∣ H(D)=-\sum_{k=1}^K \frac{|C_k|}{|D|}log\frac{|C_k|}{|D|} H(D)=k=1KDCklogDCk
  • 条件熵的计算:
    H ( D ∣ A ) = ∑ i = 1 n ∣ D i ∣ ∣ D ∣ H ( D i ) = − ∑ i = 1 n ∣ D i ∣ ∣ D ∣ ∑ k = 1 k ∣ D i k ∣ ∣ D i ∣ l o g ∣ D i k ∣ D i H(D|A)=\sum_{i=1}^n\frac{|D_i|}{|D|}H(D_i)=-\sum_{i=1}^n\frac{|D_i|}{|D|}\sum_{k=1}^k\frac{|D_{ik}|}{|D_i|}log\frac{|D_{ik}|}{D_i} H(DA)=i=1nDDiH(Di)=i=1nDDik=1kDiDiklogDiDik
    注: C k C_k Ck表示属于某个类别的样本数,
    在这里插入图片描述
    同理其他的也可以计算出来,g(D,A2)=0.324,g(D,A3)=0.420,g(D,A4)=0.363,相比较来说其中特征A3(有自己的房子)的信息增益最大,所以我们选择特征A3为最有特征

sklearn.tree.DecisionTreeClassifier

sklearn.tree.DecisionTreeClassifier是一个能对数据集进行多分类的类

class sklearn.tree.DecisionTreeClassifier(criterion='gini', splitter='best', max_depth=None, min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features=None, random_state=None, max_leaf_nodes=None, min_impurity_split=1e-07, class_weight=None, presort=False)
  """
  :param max_depth:int或None,可选(默认=无)树的最大深度。如果没有,那么节点将被扩展,直到所有的叶子都是纯类,或者直到所有的叶子都包含少于min_samples_split样本

  :param random_state:random_state是随机数生成器使用的种子
  """

首先我们导入类,以及数据集,还有将数据分成训练数据集和测试数据集两部分

from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
iris = load_iris()
X = iris.data
y = iris.target
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)
estimator = DecisionTreeClassifier(max_leaf_nodes=3, random_state=0)
estimator.fit(X_train, y_train)

method
apply 返回每个样本被预测的叶子的索引

estimator.apply(X)

array([ 1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
        1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
        1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  5,
        5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
        5,  5, 15,  5,  5,  5,  5,  5,  5, 10,  5,  5,  5,  5,  5, 10,  5,
        5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5, 16, 16,
       16, 16, 16, 16,  6, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
        8, 16, 16, 16, 16, 16, 16, 14, 16, 16, 11, 16, 16, 16,  8,  8, 16,
       16, 16, 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16])

decision_path返回树中的决策路径

dp = estimator.decision_path(X_test)

fit_transform(X,y=None,fit_params) 输入数据,然后转换

predict(X) 预测输入数据的类型,完整代码

estimator.predict(X_test)
array([2, 1, 0, 2, 0, 2, 0, 1, 1, 1, 2, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0,
       0, 1, 0, 0, 1, 1, 0, 2, 1, 0, 1, 2, 1, 0, 2])

print y_test

array([2, 1, 0, 2, 0, 2, 0, 1, 1, 1, 2, 1, 1, 1, 1, 0, 1, 1, 0, 0, 2, 1, 0,
       0, 2, 0, 0, 1, 1, 0, 2, 1, 0, 2, 2, 1, 0, 1])

score(X,y,sample_weight=None) 返回给定测试数据的准确精度

estimator.score(X_test,y_test)

0.89473684210526316

常见决策树使用的算法

  • ID3(刚才演示的)
  • 信息增益 最大的准则

从极限角度来理解:加入某个特征只有一个类别,那么信息增益为零,我们会删除这个特征

两个特征,某个特征的熵很大,乘以的是1/2,而三个特征,某个特征的熵很大,乘1/3,所以增益就大

  • C4.5
  • 信息增益比 最大的准则
  • CART
  • 回归树: 平方误差 最小
  • 分类树: 基尼系数 最小的准则 在sklearn中可以选择划分的默认原则
  • 基尼系数:划分更加仔细
sklearn决策树API
  • class sklearn.tree.DecisionTreeClassifier(criterion=’gini’, max_depth=None,random_state=None)
    • 决策树分类器
    • criterion:默认是’gini’系数,也可以选择信息增益的熵’entropy’
    • max_depth:树的深度大小
    • random_state:随机数种子
    • min_samples_split int或float,默认为2
    • 拆分内部节点所需的最少样本数:
    • method:
    • decision_path:返回决策树的路径
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值