决策树

吃可爱长大的小学妹 提交于 2019-11-30 09:04:12

决策树算法:

分类算法:
​ 目标值
​ 离散型

特征值:
离散型[如这里的字符串类型的特征值] 将特征值为离散型的数值转化为数值型
‘1st’
‘2nd’
‘3rd’
在pandas里面数据离散化采用:
one-hot编码

####决策树算法去关心的两个问题:
1 结果(目标值)纯度问题
2 如何选择最优划分指标 --> 让我们结果尽可能的简单纯粹

纯度 :
{1,1,1,1,1,1,1}
{0,0,0,0,0,0,0,0,0}
不纯的情况:
{0,1,0,1,0,1,0,1,0,1}
{1,1,1,0,0,0,1,1,1,0}

####决策树分类原理

信息熵:
n pi = 1/n
当信息熵最不纯的时候,每种发生的概率值是相等的
-sum[pi*log(pi)]

  • sum pi * log(pi)
    最不纯的情况:
    log(n)

最纯的情况:
p1 = 1 p2, p3, pn = 0

  • 1 * log(1) = 0

信息熵的单位是 bit
log(32) = 5 bit
所以对咱们的32支球队的获胜的预测概率求解,假设如果是等概率的情况,那么需要使用5位可以预测最后的获胜球队
11111 bit

决策树的划分依据一----信息增益
H(D)
咱们的信息熵的计算始终是针对结果(目标值的划分而来的)
大数据集:D      |D|
划分条件:A    即按照某个特征对大数据集进行划分
假设划分为一个具有两类结果的问题:
da1 da2  -->  |da1|   |da2|

条件熵
H(da1)* |da1|/|D| +  H(da2)*|da2|/|D|

信息增益:gain   即信息增益的值越大,则以该条件划分之后的结果越纯
g(D, A) = H(D) - 条件熵
决策树的划分依据二----信息增益率

​ 信息增益率 = 信息增益/划分指标的信息熵 【注意:这里并没有使用咱们的目标值的信息熵】

按照性别作为指标的信息熵:-[7/15*log(7/15) + 8/15 *log(8/15)]


信息增益当作划分标准的缺点:优先选择取值比较多的特征(比较贪心)
     由于信息增益的这种缺点,因此,咱们让其除以自己的信息熵(越大越混乱)
决策树的划分依据三——基尼值和基尼指数

基尼值Gini(D):
gini(D): sum(pi * (1 - pi)) = 1 - sum(pi^2)

最纯:
只含有一个类别 p1 = 1
gini = 0

最不纯:
含有n个类别 1/n
gini(D) = 1 - n * (1/n)^2 = 1 - 1/n

信息熵与基尼值是用来判断咱们的样本目标值纯不纯的方法

构建决策树的两个标准:度量纯度,最优的划分指标

信息熵的范围: (0,log(n))
基尼值得范围: (0, 1 - 1/n)

基尼指数 gini_index(D):

    大数据集:D      |D|
    划分条件:A

    da1 da2    |da1|    |da2|
    gini_index(D,A) = gini(da1)* |da1|/|D| +    gini(d2)* |da2|/|D|

ID3: 信息熵 信息增益

C4.5: 信息熵 信息增益率

CART: 基尼值 基尼系数

回归:
目标值: 连续型

咱们的决策树其实也是可以做回归问题的,包括咱们的KNN也是去可以做回归问题的,咱们去找K个最邻近的样本点,这K个样本的平均值我们当做目标值
连续型怎么度量纯度?
    用方差去度量咱们的纯度

5.1 ID3 算法
信息增益的缺点
是倾向于选择取值较多的属性,在有些情况下这类属性可能不会提供太多有价值的信息.

    离散型属性的数据集构造决策树

5.2 C4.5算法
用信息增益率来选择属性
可以处理连续数值型属性(相当于做了一些离散化的处理)
采用了一种后剪枝方法
对于缺失值的处理

C4.5算法的优缺点
    产生的分类规则易于理解,准确率较高


    缺点:
         在构造树的过程中,需要对数据集进行多次的顺序扫描和排序,因而导致算法的低效。

5.3 CART算法
基尼值
基尼指数

二叉树



分类决策不应该是由某一个特征决定的,而是应该由一组特征决定的。这样决策得到的决策树更加准确。这个决策树叫做多变量决策树(multi-variate decision tree)


如果样本发生一点点的改动,就会导致树结构的剧烈改变
避免过拟合:
    剪枝
    随机森林

cart剪枝

​ 1 为什么要剪枝
避免过拟合

决策树很容易在一个小的数据集上生成一颗比较复杂的树

2 常用的减枝方法
    前剪枝(一边长一边剪)
        不纯,要分   (验证集合)
        剪之前(分):验证集合的准确率
        剪之后(不分):验证集合的准确率

        谁的准确率高,就按谁走

    后剪枝(长完再剪)
        剪,从叶子节点开始判断是否需要剪
        剪之前:验证集合的准确率
        剪之后:验证集合的准确率


        谁的准确率高,就按谁走

4.4 特征工程-特征提取

sklearn.feature_extraction.DictVectorizer(sparse=True,…)

    .fit_transform(X)

    .get_feature_names()

[{‘city’: ‘北京’,‘temperature’:100},
{‘city’: ‘上海’,‘temperature’:60},
{‘city’: ‘深圳’,‘temperature’:30}]

稀疏矩阵
(0, 1) 1.0
(0, 3) 100.0
(1, 0) 1.0
(1, 3) 60.0
(2, 2) 1.0
(2, 3) 30.0
[‘city=上海’, ‘city=北京’, ‘city=深圳’, ‘temperature’]

4.5 决策树算法api
sklearn.tree.DecisionTreeClassifier(criterion=’gini’, max_depth=None,random_state=None)

4.6 案例:泰坦尼克号乘客生存预测

读取数据
基本数据处理
    取出特征值,目标值
    处理缺失值
    划分数据集
特征工程
选择决策树训练模型
预测
评估

3 决策树可视化
graphviz dot 经常是一对出现,如果树的结构比较复杂,咱们通常是将其转化为dot 文件之后在处理

tree.export_graphviz(estimator,out_file='tree.dot’,feature_names=[‘’,’’])

3.5 决策树总结
优点:
原理清晰,解释性强,树形结构可以可视化

缺点:
    太容易生成结构复杂的树,容易过拟合

改进:
    剪枝
    随机森林

文本特征提取
sklearn.feature_extraction.text.CountVectorizer
sklearn.feature_extraction.text.TfidfVectorizer

3.3 jieba分词处理
jieba.cut()

每一个词的重要程度
词 整个文本集合的重要程度
词 对于每一个文本(样本)的重要程度

tf-idf


term frequency: 词频  当前这个词语 在样本之中出现次数 / 整个样本中所有词的次数


inverse document frequency: 逆文档指数   整个文本集合的重要程度

log(整个文本集中所有的文本数目(样本数) / 出现当前单词的样本数目)


    '决策树'

文本1: idf * tf1
文本2: idf * tf2

tf = 0.05
idf = 3

机器学习 周志华 西瓜书

名字
分类
原理
白话
推理
指标
数学
怎么用

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!