机器学习面试知识点之决策树相关

决策树面试知识点最全总结(一)

目前的想法是决策树需要掌握以下知识:
1:ID3 C4.5与CART决策树的基本知识点(特征选择,剪枝,损失函数等,学习策略,连续值与缺失值处理),以及各自的优缺点和区别
2:随机森林的相关知识
3:GBDT的相关知识以及与随机森林进行比较分析
4:决策树与其他机器学习算法进行比较,应用场景分析
5:常见的决策树的面试题总结分析
一:首先明确以下几个基本问题:
1.决策树是干什么用的?
一种最基本的分类与回归方法,因为实际应用中基本上全是用来分类,所以重点讨论分类决策树。
2.决策树优缺点:
优点:
1)模型具有可读性,分类速度快
2)适合处理有缺失属性的样本,对缺失值不敏感(后面会讲)
缺点:
1)容易发生过拟合(剪枝 随机森林)
2)分类过程中每一步都依据单一特征,忽视了数据之间的关联性,在处理 特征关联性强的数据时表现不好
3)对于样本不均衡的数据集,表现不好。在特征选择时ID3算法偏好于选取可取值数目较多的属性,C4.5算法偏向选取可取值数目较少的属性(实际中是在算法中采用启发式原则,先从候选属性中选出信息增益高于平均水平的属性,再从中选择增益率最高的属性)
3.学习策略
根据损失函数最小化原则建立决策树模型
4.决策树学习步骤
决策树学习通常包括3个步骤:特征选择、决策树生产和决策树的修剪
二 决策树模型与学习
定义:分类决策树模型是一种描述对实例进行分类的树形结构。
其本质就是一颗树,由结点(node)和有向边(directed edge)组成,结点分为内部结点和叶子结点,内部结点表示一个特征(其实是一个集合,该集合中的样本在该结点的父节点上的属性取值相同,有点绕),叶子结点表示一个类。
决策树进行分类的过程如下:
用决策树进行分类,从根节点开始,对实例的某个特征进行测试(每个结点都会内部维护一个特征的字段),根据测试结果,将实例分配到其子节点;此时,每一个子节点对应着该特征的一个取值,如此递归的对实例进行测试并分配,直到到达叶子结点,最后将实例分到叶子结点代表的类中。
先思考一个问题:前面说了决策树的学习策略是损失函数最小,那么为啥所有的决策树学习算法都不是这样做的呢?没有定义出损失函数没有求其最小值?
因为从所有可能的决策树中选取最优决策树,这是一个NP完全问题,很难在多项式时间内求解(或者根本不存在这样的解)
所以现实中决策树学习算法采用启发式方法,近似求解这一最优化问题。所谓的启发式方法就是递归的选择最优特征,并根据该特征对训练数据进行分割。

特征选择:
特征选择是决定用哪个特征来划分特征空间
通常训练数据集的样本会有多个特征,feature1、feature2……feature n,在每一步划分的过程中,各个特征的分类能力是不同的,在划分的时候一般选取分类能力强的特征进行划分训练集。
信息增益:可以很好的判断各个特征划分数据集的能力。
首先介绍两个概念 :熵和条件熵
熵:是信息论中的一个概念,主要用来表示随机变量的不确定性
其数学上的定义如下:设 X是一个取有限个值得离散随机变量,
其概率分布为p(x=xi)=pi i=1,2……n
则随机变量X的熵定义为 H(X)= - i=1npilogpi ∑ i = 1 n p i l o g p i
熵只依赖X的分布,而与X的具体取值不同
熵越大,随机变量的不确定就越大。
条件熵:设有随机变量(X,Y),其联合概率分布为:
p(X= xi x i ,Y= yi y i )= pij p i j i=1,2,3……n j =1,2,3……m
条件熵H(Y|X)定义为已知随机变量X的条件下随机变量Y的不确定性。
H(Y|X)定义为:X给定条件下Y的条件概率分布的熵对X的数学期望
H(Y|X)= i=1npiH(Y|X=xi) ∑ i = 1 n p i H ( Y | X = x i ) 其中 pi=p(X=xi) p i = p ( X = x i )
信息增益:表示得知特征X的信息而使得类Y的信息的不确定性减少的程度。
定义如下:
特征A对训练数据集D的信息增益g(D,A),定义为集合D的经验熵H(D)与特征A给定条件下D的经验条件熵H(D/A)之差,即 g(D,A)=H(D)-H(D|A)
信息增益的算法:
输入:数据集D,特征A
输出:特征A对训练数据集D的信息增益
说明:数据集D,其样本个数为|D|,其中样本类别为K类,具体每个类别的样本个数为| Ck C k |,设特征A的特征值为{ a1,a2,an a 1 , a 2 , … a n },根据特征A的取值,将训练集D分割成n个子集,记作 D1,D2,Dn D 1 , D 2 , … D n ,| Di D i |是 Di D i 的样本个数,子集 Di D i 中输于类 Ck C k 的样本集合记作 Dik D i k ,样本个数为|D_{ik}|
1)计算数据集D的经验熵
H(D)=- k=1K|Ck||D|log|Ck||D|2 ∑ k = 1 K | C k | | D | l o g 2 | C k | | D |
2)计算特征A对数据集D的经验条件熵H(D|A)
H(D|A)= i=1n|Di||D| ∑ i = 1 n | D i | | D | H( Di D i )
= i=1n|Di||D|k=1K|Dik||Di|log|Dik||Di|2 ∑ i = 1 n | D i | | D | ∑ k = 1 K | D i k | | D i | l o g 2 | D i k | | D i |

python代码实现信息增益计算:

#coding utf-8
#计算熵
from math import log
def calcShannonEnt(dataSet):
    numEntries = len(dataSet)
    labelCounts={}
    #计算数据集D中每一个类Ck的个数
    for featVec in dataSet:
        currentLabel = featVec[-1]
        if currentLabel not in labelCounts.keys():
            labelCounts[currentLabel] =0
        labelCounts[currentLabel]+=1
    shannonEnt=0.0
    #利用熵的计算公式计算熵
    for key in labelCounts:
        prob = float(labelCounts[key])/numEntries
        shannonEnt -= prob *log(prob,2)
    return shannonEnt
 #针对各个特征的特征值对数据集进行划分,返回的是在该特征上取值一样的样本
def splitDataSet(dataSet,axis,value):
    retDataSet=[]
    for featVec in dataSet:
        if featVec[axis]==value:
           reducedFeatVec=featVec[:axis]
           reducedFeatVec.extend(featVec[axis+1:])
           retDataSet.append(reducedFeatVec)
    return retDataSet
    #选择信息增益最大的特征 
def chooseBestFeatureToSplit(dataSet):
    numFeature=len(dataSet[0])-1
    baseEntropy=calcShannonEnt(dataSet)
    bestInfoGain = 0.0
    bestFeature=-1
    for i in range(numFeature):#对每一个特征,得到其所有的特征值
        featList=[example[i] for example in dataSet]
        uniqueVals=set(featList) # 创建唯一的分类特征值集合
        newEntropy=0.0
        for value in uniqueVals:
            subDataSet=splitDataSet(dataSet,i,value)
            prob = len(subDataSet)/float(len(dataSet))
            newEntropy += prob*calcShannonEnt(subDataSet)
        infoGain = baseEntropy - newEntropy
        if(infoGain > bestInfoGain):
            bestInfoGain = infoGain
            bestFeature = i
    return bestFeature,bestInfoGain 

以信息增益原则进行特征选择时(ID3算法),存在如下不足:偏向于选择取值较多的特征。说白了就是如果一个特征在所有的特征里面,它的取值最多,那么它被选出来的概率偏大,这样对于训练集中样本不均衡时学习出模型可能存在问题。
后来C4.5算法为了弥补ID3的不足,提出了依据信息增益比进行特征选择的方法
信息增益比:特征A对训练数据集D的信息增益比 gR(D,A) g R ( D , A ) 定义为其信息增益g(D,A)与训练数据集D关于特征A的值的熵 HA(D) H A ( D ) 之比
gR(D,A)=g(D,A)HA(D) g R ( D , A ) = g ( D , A ) H A ( D )
其中 HA(D)=i=1n|Di||D|log|Di||D|2 H A ( D ) = − ∑ i = 1 n | D i | | D | l o g 2 | D i | | D |
但是信息增益比也不是完美的,它趋向于选取特征取值个数较少的特征。(因为 HA(D) H A ( D ) 越 小 当 特 征 取 值 较 少 时
利用信息增益比进行最好特征选择的python代码如下:基本上与信息增益一样,区别在(2)和(3)

# 根据信息增益比选择最佳分割特征
def chooseBestFeatureByInfoGainRotio(dataSet):
    numFeature = len(dataSet[0]) - 1
    baseEntropy = calcShannonEnt(dataSet)
    bestInfoGain = 0.0
    bestFeature = -1
    for i in range(numFeature):  # 对每一个特征,得到其所有的特征值
        featList = [example[i] for example in dataSet]
        uniqueVals = set(featList)  # 创建唯一的分类特征值集合
        newEntropy = 0.0
        newSubEntropy=0.0
        for value in uniqueVals:
            subDataSet = splitDataSet(dataSet, i, value)
            prob = len(subDataSet) / float(len(dataSet))
            newEntropy += prob * calcShannonEnt(subDataSet)
            newSubEntropy -= prob*log(prob,2)               #(2)
        infoGain = (baseEntropy - newEntropy)/newSubEntropy #(3)
        if (infoGain > bestInfoGain):
            bestInfoGain = infoGain
            bestFeature = i
    return bestFeature

第一次写博客,主要是为了总结学习,写的有点乱加上水平有限,有错误的地方欢迎留言,共同学习进步,谢谢。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值