• 机器学习【决策树算法2】


    一 Cart剪枝

    1 为什么要剪枝

    在这里插入图片描述

    • 横轴表示在决策树创建过程中树的结点总数,纵轴表示决策树的预测精度。

    • 实线显示的是决策树在训练集上的精度,虚线显示的则是在一个独立的测试集上测量出来的精度。

    • 随着树的增长,在训练样集上的精度是单调上升的, 然而在独立的测试样例上测出的精度先上升后下降。

      实线为训练集,虚线为测试集,容易发生过拟合

    出现这种情况的原因:

    • 原因1:噪声、样本冲突,即错误的样本数据。
    • 原因2:特征即属性不能完全作为分类标准。
    • 原因3:巧合的规律性,数据量不够大。

    2 常用的减枝方法

    2.1 预剪枝

    (1)每一个结点所包含的最小样本数目,例如10,则该结点总样本数小于10时,则不再分;

    (2)指定树的高度或者深度,例如树的最大深度为4;

    (3)指定结点的熵小于某个值,不再划分。随着树的增长, 在训练样集上的精度是单调上升的, 然而在独立的测试样例上测出的精度先上升后下降。

    2.2 后剪枝

    后剪枝,在已生成过拟合决策树上进行剪枝,可以得到简化版的剪枝决策树。

    二 特征工程-特征提取

    特征工程:将数据转换成机器更容易识别的数据

    什么是特征提取

    在这里插入图片描述
    在这里插入图片描述

    1 特征提取

    1.1 定义

    将任意数据(如文本或图像)转换为可用于机器学习的数字特征

    注:特征值化是为了计算机更好的去理解数据

    特征提取分类:

    • 字典特征提取(特征离散化)
    • 文本特征提取
    • 图像特征提取(深度学习将介绍)

    1.2 特征提取API

    sklearn.feature_extraction
    
    • 1

    2 字典特征提取

    作用:对字典数据进行特征值化

    sklearn.feature_extraction.DictVectorizer(sparse=True,…)
    	DictVectorizer.fit_transform(X)
    		X:字典或者包含字典的迭代器返回值
    		返回sparse矩阵
    	DictVectorizer.get_feature_names() 返回类别名称
    
    • 1
    • 2
    • 3
    • 4
    • 5

    2.1 应用

    对以下数据进行特征提取

    [{'city': '北京','temperature':100},
    {'city': '上海','temperature':60},
    {'city': '深圳','temperature':30}]
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    2.2 流程分析

    • 实例化类DictVectorizer
    • 调用fit_transform方法输入数据并转换(注意返回格式)
    from sklearn.feature_extraction import DictVectorizer
    
    def dict_demo():
        """
        对字典类型的数据进行特征抽取
        :return: None
        """
        data = [{'city': '北京','temperature':100}, {'city': '上海','temperature':60}, {'city': '深圳','temperature':30}]
        # 1、实例化一个转换器类
        transfer = DictVectorizer(sparse=False)
        # 2、调用fit_transform
        data = transfer.fit_transform(data)
        print("返回的结果:\n", data)
        # 打印特征名字
        print("特征名字:\n", transfer.get_feature_names())
    
        return None
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    注意观察没有加上sparse=False参数的结果

    返回的结果:
    (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']
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    这个结果并不是 想要看到的,所以加上参数sparse=False,得到想要的结果:

    返回的结果:
     [[   0.    1.    0.  100.]
     [   1.    0.    0.   60.]
     [   0.    0.    1.   30.]]
    特征名字:
     ['city=上海', 'city=北京', 'city=深圳', 'temperature']
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    之前在学习pandas中的离散化的时候,也实现了类似的效果。

    把这个处理数据的技巧叫做”one-hot“编码:

    在这里插入图片描述
    转换为:
    在这里插入图片描述

    要做的工作就是为每个类别生成一个布尔列,这些列中只有一列可以为每个样本取值1,专业术语为“one-shot”编码

    对于特征当中存在类别信息的 都会做one-hot编码处理

    3 文本特征提取

    作用:对文本数据进行特征值化

    sklearn.feature_extraction.text.CountVectorizer(stop_words=[])
    	返回词频矩阵
    	stop_words:不统计[]内的词
    	单个字母,标点符号不做统计
    	CountVectorizer.fit_transform(X)
    		X:文本或者包含文本字符串的可迭代对象
    		返回值:返回sparse矩阵
    	CountVectorizer.get_feature_names() 返回值:单词列表
    sklearn.feature_extraction.text.TfidfVectorizer
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    3.1 应用

    对以下数据进行特征提取

    ["life is short,i like python",
    "life is too long,i dislike python"]
    
    • 1
    • 2

    在这里插入图片描述

    3.2 流程分析

    • 实例化类CountVectorizer
    • 调用fit_transform方法输入数据并转换 (注意返回格式,利用toarray()进行sparse矩阵转换array数组)
    from sklearn.feature_extraction.text import CountVectorizer
    
    def text_count_demo():
        """
        对文本进行特征抽取,countvetorizer
        :return: None
        """
        data = ["life is short,i like like python", "life is too long,i dislike python"]
        # 1、实例化一个转换器类
        # transfer = CountVectorizer(sparse=False) # 注意,没有sparse这个参数
        transfer = CountVectorizer(stop_words=['dislike','is'])
        # 2、调用fit_transform
        data = transfer.fit_transform(data)
        print("文本特征抽取的结果:\n", data.toarray())
        print("返回特征名字:\n", transfer.get_feature_names())
    
        return None
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    想要查看sparse矩阵,使用toarray方法,返回结果:

    文本特征抽取的结果:
     [[0 1 1 2 0 1 1 0]
     [1 1 1 0 1 1 0 1]]
    返回特征名字:
     ['dislike', 'is', 'life', 'like', 'long', 'python', 'short', 'too']
    
    • 1
    • 2
    • 3
    • 4
    • 5

    如果 将数据替换成中文?

    "人生苦短,我喜欢Python","生活太长久,我不喜欢Python"
    
    • 1

    那么最终得到的结果是

    在这里插入图片描述

    为什么会得到这样的结果呢,仔细分析之后会发现英文默认是以空格分开的。其实就达到了一个分词的效果,所以 要对中文进行分词处理

    3.3 jieba分词处理

    jieba.cut()
    	返回词语组成的生成器
    需要安装下jieba库
    pip3 install jieba
    
    • 1
    • 2
    • 3
    • 4

    3.4 案例分析

    对以下三句话进行特征值化

    今天很残酷,明天更残酷,后天很美好,
    但绝对大部分是死在明天晚上,所以每个人不要放弃今天。
    
     看到的从很远星系来的光是在几百万年之前发出的,
    这样当 看到宇宙时, 是在看它的过去。
    
    如果只用一种方式了解某样事物,你就不会真正了解它。
    了解事物真正含义的秘密取决于如何将其与 所了解的事物相联系。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    分析

    • 准备句子,利用jieba.cut进行分词
    • 实例化CountVectorizer
    • 将分词结果变成字符串当作fit_transform的输入值
    from sklearn.feature_extraction.text import CountVectorizer
    import jieba
    
    def cut_word(text):
        """
        对中文进行分词
        "我爱北京天安门"————>"我 爱 北京 天安门"
        :param text:
        :return: text
        """
        # 用结巴对中文字符串进行分词
        text = " ".join(list(jieba.cut(text)))
    
        return text
    
    def text_chinese_count_demo2():
        """
        对中文进行特征抽取
        :return: None
        """
        data = ["一种还是一种今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。",
                " 看到的从很远星系来的光是在几百万年之前发出的,这样当 看到宇宙时, 是在看它的过去。",
                "如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与 所了解的事物相联系。"]
        # 将原始数据转换成分好词的形式
        text_list = []
        for sent in data:
            text_list.append(cut_word(sent))
        print(text_list)
    
        # 1、实例化一个转换器类
        # transfer = CountVectorizer(sparse=False)
        transfer = CountVectorizer(stop_word["一种","还是"])
        # 2、调用fit_transform
        data = transfer.fit_transform(text_list)
        print("文本特征抽取的结果:\n", data.toarray())
        print("返回特征名字:\n", transfer.get_feature_names())
    
        return None
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    返回结果:

    Building prefix dict from the default dictionary ...
    Dumping model to file cache /var/folders/mz/tzf2l3sx4rgg6qpglfb035_r0000gn/T/jieba.cache
    Loading model cost 1.032 seconds.
    ['一种 还是 一种 今天 很 残酷 , 明天 更 残酷 , 后天 很 美好 , 但 绝对 大部分 是 死 在 明天 晚上 , 所以 每个 人 不要 放弃 今天 。', '  看到 的 从 很 远 星系 来 的 光是在 几百万年 之前 发出 的 , 这样 当   看到 宇宙 时 ,   是 在 看 它 的 过去 。', '如果 只用 一种 方式 了解 某样 事物 , 你 就 不会 真正 了解 它 。 了解 事物 真正 含义 的 秘密 取决于 如何 将 其 与   所 了解 的 事物 相 联系 。']
    Prefix dict has been built succesfully.
    文本特征抽取的结果:
     [[2 0 1 0 0 0 2 0 0 0 0 0 1 0 1 0 0 0 0 1 1 0 2 0 1 0 2 1 0 0 0 1 1 0 0 1 0]
     [0 0 0 1 0 0 0 1 1 1 0 0 0 0 0 0 0 1 3 0 0 0 0 1 0 0 0 0 2 0 0 0 0 0 1 0 1]
     [1 1 0 0 4 3 0 0 0 0 1 1 0 1 0 1 1 0 1 0 0 1 0 0 0 1 0 0 0 2 1 0 0 1 0 0 0]]
    返回特征名字:
     ['一种', '不会', '不要', '之前', '了解', '事物', '今天', '光是在', '几百万年', '发出', '取决于', '只用', '后天', '含义', '大部分', '如何', '如果', '宇宙', ' ', '所以', '放弃', '方式', '明天', '星系', '晚上', '某样', '残酷', '每个', '看到', '真正', '秘密', '绝对', '美好', '联系', '过去', '还是', '这样']
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    但如果把这样的词语特征用于分类,会出现以下问题

    两篇文章,其中某些词汇占比很大,如何计算某些词对文章的重要程度
    在这里插入图片描述

    3.5 Tf-idf文本特征提取

    • TF-IDF的主要思想是:如果某个词或短语在一篇文章中出现的概率高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。
    • TF-IDF作用:用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。

    3.5.1 公式

    • 词频(term frequency,tf)指的是某一个给定的词语在该文件中出现的频率
    • 逆向文档频率(inverse document frequency,idf)是一个词语普遍重要性的度量。某一特定词语的idf,可以由总文件数目除以包含该词语之文件的数目,再将得到的商取以10为底的对数得到
      在这里插入图片描述

    最终得出结果可以理解为重要程度。

    举例:
    假如一篇文章的总词语数是100个,而词语"非常"出现了5次,那么"非常"一词在该文件中的词频就是5/100=0.05。
    而计算文件频率(IDF)的方法是以文件集的文件总数,除以出现"非常"一词的文件数。
    所以,如果"非常"一词在1,0000份文件出现过,而文件总数是10,000,000份的话,
    其逆向文件频率就是lg(10,000,000 / 1,0000)=3。
    最后"非常"对于这篇文档的tf-idf的分数为0.05 * 3=0.15
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    3.5.2 案例

    from sklearn.feature_extraction.text import TfidfVectorizer
    import jieba
    
    def cut_word(text):
        """
        对中文进行分词
        "我爱北京天安门"————>"我 爱 北京 天安门"
        :param text:
        :return: text
        """
        # 用结巴对中文字符串进行分词
        text = " ".join(list(jieba.cut(text)))
    
        return text
    
    def text_chinese_tfidf_demo():
        """
        对中文进行特征抽取
        :return: None
        """
        data = ["一种还是一种今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。",
                " 看到的从很远星系来的光是在几百万年之前发出的,这样当 看到宇宙时, 是在看它的过去。",
                "如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与 所了解的事物相联系。"]
        # 将原始数据转换成分好词的形式
        text_list = []
        for sent in data:
            text_list.append(cut_word(sent))
        print(text_list)
    
        # 1、实例化一个转换器类
        # transfer = CountVectorizer(sparse=False)
        transfer = TfidfVectorizer(stop_words=['一种', '不会', '不要'])
        # 2、调用fit_transform
        data = transfer.fit_transform(text_list)
        print("文本特征抽取的结果:\n", data.toarray())
        print("返回特征名字:\n", transfer.get_feature_names())
    
        return None
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    返回结果:

    Building prefix dict from the default dictionary ...
    Loading model from cache /var/folders/mz/tzf2l3sx4rgg6qpglfb035_r0000gn/T/jieba.cache
    Loading model cost 0.856 seconds.
    Prefix dict has been built succesfully.
    ['一种 还是 一种 今天 很 残酷 , 明天 更 残酷 , 后天 很 美好 , 但 绝对 大部分 是 死 在 明天 晚上 , 所以 每个 人 不要 放弃 今天 。', '  看到 的 从 很 远 星系 来 的 光是在 几百万年 之前 发出 的 , 这样 当   看到 宇宙 时 ,   是 在 看 它 的 过去 。', '如果 只用 一种 方式 了解 某样 事物 , 你 就 不会 真正 了解 它 。 了解 事物 真正 含义 的 秘密 取决于 如何 将 其 与   所 了解 的 事物 相 联系 。']
    文本特征抽取的结果:
     [[ 0.          0.          0.          0.43643578  0.          0.          0.
       0.          0.          0.21821789  0.          0.21821789  0.          0.
       0.          0.          0.21821789  0.21821789  0.          0.43643578
       0.          0.21821789  0.          0.43643578  0.21821789  0.          0.
       0.          0.21821789  0.21821789  0.          0.          0.21821789
       0.        ]
     [ 0.2410822   0.          0.          0.          0.2410822   0.2410822
       0.2410822   0.          0.          0.          0.          0.          0.
       0.          0.2410822   0.55004769  0.          0.          0.          0.
       0.2410822   0.          0.          0.          0.          0.48216441
       0.          0.          0.          0.          0.          0.2410822
       0.          0.2410822 ]
     [ 0.          0.644003    0.48300225  0.          0.          0.          0.
       0.16100075  0.16100075  0.          0.16100075  0.          0.16100075
       0.16100075  0.          0.12244522  0.          0.          0.16100075
       0.          0.          0.          0.16100075  0.          0.          0.
       0.3220015   0.16100075  0.          0.          0.16100075  0.          0.
       0.        ]]
    返回特征名字:
     ['之前', '了解', '事物', '今天', '光是在', '几百万年', '发出', '取决于', '只用', '后天', '含义', '大部分', '如何', '如果', '宇宙', ' ', '所以', '放弃', '方式', '明天', '星系', '晚上', '某样', '残酷', '每个', '看到', '真正', '秘密', '绝对', '美好', '联系', '过去', '还是', '这样']
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    3.6 Tf-idf的重要性

    分类机器学习算法进行文章分类中前期数据处理方式

    三 决策树算法API

    class sklearn.tree.DecisionTreeClassifier(criterion=’gini’, max_depth=None,random_state=None)
    	criterion
    		特征选择标准
    		"gini"或者"entropy",前者代表基尼系数,后者代表信息增益。一默认"gini",即CART算法。
    	min_samples_split
    		内部节点再划分所需最小样本数
    		这个值限制了子树继续划分的条件,如果某节点的样本数少于min_samples_split,则不会继续再尝试选择最优特征来进行划分。 默认是2。如果样本量不大,不需要管这个值。如果样本量数量级非常大,则推荐增大这个值。我之前的一个项目例子,有大概10万样本,建立决策树时,我选择了min_samples_split=10。可以作为参考。
    	min_samples_leaf
    		叶子节点最少样本数
    		这个值限制了叶子节点最少的样本数,如果某叶子节点数目小于样本数,则会和兄弟节点一起被剪枝。 默认是1,可以输入最少的样本数的整数,或者最少样本数占样本总数的百分比。如果样本量不大,不需要管这个值。如果样本量数量级非常大,则推荐增大这个值。之前的10万样本项目使用min_samples_leaf的值为5,仅供参考。
    	max_depth
    		决策树最大深度
    		决策树的最大深度,默认可以不输入,如果不输入的话,决策树在建立子树的时候不会限制子树的深度。一般来说,数据少或者特征少的时候可以不管这个值。如果模型样本量多,特征也多的情况下,推荐限制这个最大深度,具体的取值取决于数据的分布。常用的可以取值10-100之间
    	random_state
    		随机数种子
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

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

    1 泰坦尼克号数据

    在泰坦尼克号和titanic2数据帧描述泰坦尼克号上的个别乘客的生存状态。这里使用的数据集是由各种研究人员开始的。其中包括许多研究人员创建的旅客名单,由Michael A. Findlay编辑。 提取的数据集中的特征是票的类别,存活,乘坐班,年龄,登陆,home.dest,房间,票,船和性别。

    数据:http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt
    在这里插入图片描述

    经过观察数据得到

    • 乘坐班是指乘客班(1,2,3),是社会经济阶层的代表
    • 其中age数据存在缺失

    2 步骤分析

    • 获取数据
    • 数据基本处理
      • 确定特征值,目标值
      • 缺失值处理
      • 数据集划分
    • 特征工程(字典特征抽取)
    • 机器学习(决策树)
    • 模型评估

    3 代码过程

    • 导入需要的模块
    import pandas as pd
    import numpy as np
    from sklearn.feature_extraction import DictVectorizer
    from sklearn.model_selection import train_test_split
    from sklearn.tree import DecisionTreeClassifier, export_graphviz
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 获取数据
    # 1、获取数据
    titan = pd.read_csv("http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt")
    
    
    • 1
    • 2
    • 3
    • 数据基本处理

      • 确定特征值,目标值
      x = titan[["pclass", "age", "sex"]]
      y = titan["survived"]
      
      
      • 1
      • 2
      • 3
      • 缺失值处理
      # 缺失值需要处理,将特征当中有类别的这些特征进行字典特征抽取
      # 用均值填充原值
      x['age'].fillna(x['age'].mean(), inplace=True)
      
      
      • 1
      • 2
      • 3
      • 4
      • 数据集划分
      x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=22)
      
      
      • 1
      • 2
    • 特征工程(字典特征抽取)

    特征中出现类别符号,需要进行one-hot编码处理(DictVectorizer)

    x.to_dict(orient=“records”) 需要将数组特征转换成字典数据

    # 对于x转换成字典数据x.to_dict(orient="records")
    # [{"pclass": "1st", "age": 29.00, "sex": "female"}, {}]
    
    transfer = DictVectorizer(sparse=False)
    
    x_train = transfer.fit_transform(x_train.to_dict(orient="records"))
    x_test = transfer.fit_transform(x_test.to_dict(orient="records"))
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 决策树模型训练和模型评估

    决策树API当中,如果没有指定max_depth那么会根据信息熵的条件直到最终结束。这里 可以指定树的深度来进行限制树的大小

    # 4.机器学习(决策树)
    estimator = DecisionTreeClassifier(criterion="entropy", max_depth=5)
    estimator.fit(x_train, y_train)
    
    # 5.模型评估
    estimator.score(x_test, y_test)
    
    estimator.predict(x_test)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    决策树的结构是可以直接显示的

    3 决策树可视化

    3.1 保存树的结构到dot文件

    sklearn.tree.export_graphviz() 该函数能够导出DOT格式
    	tree.export_graphviz(estimator,out_file='tree.dot’,feature_names=[‘’,’’])
    
    
    • 1
    • 2
    • 3
    export_graphviz(estimator, out_file="./data/tree.dot", feature_names=['age', 'pclass=1st', 'pclass=2nd', 'pclass=3rd', '女性', '男性'])
    
    
    • 1
    • 2

    dot文件当中的内容如下

    digraph Tree {
    node [shape=box] ;
    0 [label="petal length (cm) <= 2.45\nentropy = 1.584\nsamples = 112\nvalue = [39, 37, 36]"] ;
    1 [label="entropy = 0.0\nsamples = 39\nvalue = [39, 0, 0]"] ;
    0 -> 1 [labeldistance=2.5, labelangle=45, headlabel="True"] ;
    2 [label="petal width (cm) <= 1.75\nentropy = 1.0\nsamples = 73\nvalue = [0, 37, 36]"] ;
    0 -> 2 [labeldistance=2.5, labelangle=-45, headlabel="False"] ;
    3 [label="petal length (cm) <= 5.05\nentropy = 0.391\nsamples = 39\nvalue = [0, 36, 3]"] ;
    2 -> 3 ;
    4 [label="sepal length (cm) <= 4.95\nentropy = 0.183\nsamples = 36\nvalue = [0, 35, 1]"] ;
    3 -> 4 ;
    5 [label="petal length (cm) <= 3.9\nentropy = 1.0\nsamples = 2\nvalue = [0, 1, 1]"] ;
    4 -> 5 ;
    6 [label="entropy = 0.0\nsamples = 1\nvalue = [0, 1, 0]"] ;
    5 -> 6 ;
    7 [label="entropy = 0.0\nsamples = 1\nvalue = [0, 0, 1]"] ;
    5 -> 7 ;
    8 [label="entropy = 0.0\nsamples = 34\nvalue = [0, 34, 0]"] ;
    4 -> 8 ;
    9 [label="petal width (cm) <= 1.55\nentropy = 0.918\nsamples = 3\nvalue = [0, 1, 2]"] ;
    3 -> 9 ;
    10 [label="entropy = 0.0\nsamples = 2\nvalue = [0, 0, 2]"] ;
    9 -> 10 ;
    11 [label="entropy = 0.0\nsamples = 1\nvalue = [0, 1, 0]"] ;
    9 -> 11 ;
    12 [label="petal length (cm) <= 4.85\nentropy = 0.191\nsamples = 34\nvalue = [0, 1, 33]"] ;
    2 -> 12 ;
    13 [label="entropy = 0.0\nsamples = 1\nvalue = [0, 1, 0]"] ;
    12 -> 13 ;
    14 [label="entropy = 0.0\nsamples = 33\nvalue = [0, 0, 33]"] ;
    12 -> 14 ;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    那么这个结构不能看清结构,所以可以在一个网站上显示

    3.2 网站显示结构

    在这里插入图片描述

    将dot文件内容复制到该网站当中显示

    在这里插入图片描述

    通过观察决策树叶子结点包含的样本数,可以看到决策树已经过拟合

    使用参数criterion=“entropy”, max_depth=5限制模型的训练

    3.3 决策树总结

    优点:简单的理解和解释,树木可视化。

    缺点:决策树学习者可以创建不能很好地推广数据的过于复杂的树,容易发生过拟合。

    改进:

    • 减枝cart算法
    • 随机森林(集成学习的一种)

    传统企业重要决策,由于决策树很好的分析能力,在决策过程应用较多, 可以选择特征

  • 相关阅读:
    tf.GPUOptions
    unity URP内置shader lit解析
    win10系统下Yolov5目标检测环境搭建(Anaconda3+Pytorch+Yolov5,CPU,无GPU)
    侯捷 C++ STL标准库和泛型编程 —— 3 容器(序列式容器)
    【BOOST C++ 14 消息编程】(4) 传播者
    A Guide to PriorityQueue
    Acwing:通电围栏(皮克定理)
    CCLINK IEFB总线转ETHERNET/IP网络的协议网关使欧姆龙和三菱的数据互通的简单配置方法
    推荐系统笔记(八):推荐系统中的长尾效应
    华为HCDA论证教程
  • 原文地址:https://blog.csdn.net/weixin_43923463/article/details/126293437