决策树算法

决策树算法简介

1 概念

决策树思想的来源非常朴素,程序设计中的条件分支结构就是if-else结构,最早的决策树就是利用这类结构分割数据的一种分类学习方法。

决策树:

怎么理解这句话?通过一个对话例子:

“闺女,我又给你找了个合适的对象,今天要不要见一面?”
“多大? ” “26岁。”
“长得帅吗? ” “还可以,不算太帅。”
“工资高么? ” “略高于平均水平。”
“会写代码吗? ” “人家是程序员,代码写得棒着呢!”
“好,那把他联系方式发来吧,我抽空见一面。”

上述图右侧部分,女儿最多通过四次判断,就可以得到答案,这时称我们的决策树的depth(深度)为3

概念:

  • 是一种树形结构,本质是一颗由多个判断节点组成的树
  • 其中每个内部节点表示一个属性上的判断,
  • 每个分支代表一个判断结果的输出,
  • 最后每个叶节点代表一种分类结果

2 通过sklearn实现决策树分类并进一步认识决策树

  • 基于鸢尾花数据绘制图像

    import numpy as np
    import matplotlib.pyplot as plt
    from sklearn.datasets import load_iris
    
    # 加载数据集
    iris = load_iris()
    
    # 获取特征值和目标值
    X = iris.data[:,2:]
    y = iris.target
    
    # 绘制图形展示效果,一共三种类别
    plt.scatter(X[y==0,0],X[y==0,1])
    plt.scatter(X[y==1,0],X[y==1,1])
    plt.scatter(X[y==2,0],X[y==2,1])
    plt.show()
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bMFqa560-1633692938055)(./images/1.png)]

  • 训练决策树模型

    from sklearn.tree import DecisionTreeClassifier
    
    # 实例化分类器
    tree = DecisionTreeClassifier(max_depth=2,criterion="gini")
    # 训练模型
    tree.fit(X,y)
    
    """
    DecisionTreeClassifier(ccp_alpha=0.0, class_weight=None, criterion='entropy',
                           max_depth=2, max_features=None, max_leaf_nodes=None,
                           min_impurity_decrease=0.0, min_impurity_split=None,
                           min_samples_leaf=1, min_samples_split=2,
                           min_weight_fraction_leaf=0.0, presort='deprecated',
                           random_state=None, splitter='best')
    """
    
  • 依据模型绘制决策树的决策边界

    #找到模型的决策边界,并绘制图像(此方法所用到的api不需要掌握,能够调用就行)
    def plot_decision_boundary(model,axis):
        x0,x1 = np.meshgrid(
            np.linspace(axis[0],axis[1],int((axis[1]-axis[0])*100)).reshape(-1,1),
            np.linspace(axis[2],axis[3],int((axis[3]-axis[2])*100)).reshape(-1,1)
        )
        X_new = np.c_[x0.ravel(),x1.ravel()]
        y_predict = model.predict(X_new)
        zz = y_predict.reshape(x0.shape)
        
        from matplotlib.colors import ListedColormap
        custom_map = ListedColormap(["#EF9A9A","#FFF59D","#90CAF9"])
        
        plt.contourf(x0,x1,zz,linewidth=5,cmap=custom_map)
        
    plot_decision_boundary(tree,axis=[0.5,7.5,0,3])
    plt.scatter(X[y==0,0],X[y==0,1])
    plt.scatter(X[y==1,0],X[y==1,1])
    plt.scatter(X[y==2,0],X[y==2,1])
    plt.show()
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qBmJp7PM-1633692938056)(./images/13.png)]

通过上述分析可知:

  • 决策树是非参数学习算法
  • 决策树可以解决分类问题
  • 决策树天然可以解决多分类问题
  • 决策树可以解决回归问题:落在叶子节点(对应图中的A、B、C三点)的数据的平均值作为回归的结果
  • 决策树可以应用于信用卡评级的案例中,生成相应的分类规则。

4.2 特征选择

学习目标

  • 知道如何选择特征构建决策树
  • 知道信息熵、信息增益、信息增益比

1 特征选择问题

特征选择在于选取对于训练数据具有分类能力的特征,这样可以提高决策树学习的效率。如果使用一个特征进行分类的结果与随机分类的结果没有很大差别,则该特征没有分类能力。扔掉这个特征对决策树学习的精度影响不大。特征选择就是决定用哪个特征来对数据集进行划分。

2 熵

  • 定义

    • 熵在信息论中代表随机变量不确定度的度量。
    • 熵越大,数据的不确定性度越高
    • 熵越小,数据的不确定性越低
  • 公式
    H = − ∑ i = 1 k p i log ⁡ ( p i ) \large H = -\sum_{i=1}^{k}p_i\log(p_i) H=i=1kpilog(pi)

    • 例子1:假如有三个类别,分别占比为:{1/3,1/3,1/3},信息熵计算结果为:

      H = − 1 3 log ⁡ ( 1 3 ) − 1 3 log ⁡ ( 1 3 ) − 1 3 log ⁡ ( 1 3 ) = 1.0986 H=-\frac{1}{3}\log(\frac{1}{3})-\frac{1}{3}\log(\frac{1}{3})-\frac{1}{3}\log(\frac{1}{3})=1.0986 H=31log(31)31log(31)31log(31)=1.0986

    • 例子2:假如有三个类别,分别占比为:{1/10,2/10,7/10},信息熵计算结果为:

      H = − 1 10 log ⁡ ( 1 10 ) − 2 10 log ⁡ ( 2 10 ) − 7 10 log ⁡ ( 7 10 ) = 0.8018 H=-\frac{1}{10}\log(\frac{1}{10})-\frac{2}{10}\log(\frac{2}{10})-\frac{7}{10}\log(\frac{7}{10})=0.8018 H=101log(101)102log(102)107log(107)=0.8018

      熵越大,表示整个系统不确定性越大,越随机,反之确定性越强。

    • 例子3:假如有三个类别,分别占比为:{1,0,0},信息熵计算结果为:

      H = − 1 log ⁡ ( 1 ) = 0 H=-1\log(1)=0 H=1log(1)=0

  • 公式的转换

    当数据类别只有两类的情况下,公式可以做如下转换
    KaTeX parse error: No such environment: align at position 8: \begin{̲a̲l̲i̲g̲n̲}̲\large H &= -\s…

    • 代码角度理解信息熵的概念

      import numpy as np
      import matplotlib.pyplot as plt
      
      def entropy(p):
          return -p*np.log(p)-(1-p)*np.log(1-p)
          
      x = np.linspace(0.01,0.99,200)
      plt.plot(x,entropy(x))
      plt.show()
      

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zdZrzare-1633692938058)(./images/6.png)]

      观察上图可以得出,当我们的系统每一个类别是等概率的时候(x轴值等于0.5),系统的信息熵最高,当系统偏向于某一列,相当于系统有了一定程度的确定性,直到系统整体百分之百的都到某一类中,此时信息熵就达到了最低值,即为0。上述结论也可以拓展到多类别的情况。

3 信息增益

  • 定义

    特征 A A A对训练数据集D的信息增益 g ( D , A ) g(D,A) g(D,A),定义为集合 D D D的经验熵 H ( D ) H(D) H(D)与特征A给定条件下D的经验熵 H ( D ∣ A ) H(D|A) H(DA)之差。即
    g ( D , A ) = H ( D ) − H ( D ∣ A ) \large g(D,A)=H(D)-H(D|A) g(D,A)=H(D)H(DA)

  • 根据信息增益选择特征方法是:对训练数据集D,计算其每个特征的信息增益,并比较它们的大小,并选择信息增益最大的特征进行划分。表示由于特征 A A A而使得对数据D的分类不确定性减少的程度。

  • 算法:

    设训练数据集为D, ∣ D ∣ \mid D\mid D表示其样本个数。设有 K K K个类 C k C_k Ck k = 1 , 2 , ⋯   , K k=1,2,\cdots,K k=1,2,,K ∣ C k ∣ \mid C_k\mid Ck为属于类 C k C_k Ck的样本个数, ∑ k = 1 K = ∣ D ∣ \sum\limits_{k=1}^{K}=\mid{D}\mid k=1K=

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值