大数据-202 数据挖掘 机器学习理论 - 决策树 sklearn 绘制决策树 防止过拟合

点一下关注吧!!!非常感谢!!持续更新!!!

目前已经更新到了:

  • Hadoop(已更完)
  • HDFS(已更完)
  • MapReduce(已更完)
  • Hive(已更完)
  • Flume(已更完)
  • Sqoop(已更完)
  • Zookeeper(已更完)
  • HBase(已更完)
  • Redis (已更完)
  • Kafka(已更完)
  • Spark(已更完)
  • Flink(已更完)
  • ClickHouse(已更完)
  • Kudu(已更完)
  • Druid(已更完)
  • Kylin(已更完)
  • Elasticsearch(已更完)
  • DataX(已更完)
  • Tez(已更完)
  • 数据挖掘(正在更新...)

章节内容

上节我们完成了如下的内容:

  • 决策树 局部最优
  • 决策树 剪枝 分裂 二叉分裂

使用sklearn实现决策树

参数CRITERION

criterion 这个参数使用来决定不纯度的计算方法,sklearn提供了两种选择:

  • 输入 entropy,使用信息熵(Entropy)
  • 输入 gini,使用基尼系数(Gini Impurity)

比起基尼系数,信息熵对不纯度更加敏感,对不纯度的惩罚最强。但是在实际使用中,信息熵和基尼系数的效果基本相同。

信息熵的计算比基尼系数要缓慢一些,因为基尼系数的计算不涉及对数。

另外,因为信息熵对不纯度更加敏感,所以信息熵作为指标时,决策树的生长会更加精细,因此在对于高维数据或者噪声很多的数据,信息熵很容易过拟合,基尼系数在这种情况下效果往往比较好。

当模型拟合程度不足时,即当模型在训练集和测试集上都表现的不太好的时候,使用信息熵。当然,这些不是绝对的。

初步建模

python 复制代码
# 导入需要的算法库和模块
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
from sklearn import tree
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split
plt.rcParams['font.sans-serif']=['Simhei']
plt.rcParams['axes.unicode_minus']=False

加载数据

python 复制代码
wine = load_wine()
wine.data.shape
wine.target

执行结果如下所示:

如果是 wine 是一张表,应该长这样:

python 复制代码
wine_pd=pd.concat([pd.DataFrame(wine.data),pd.DataFrame(wine.target)],axis=1).head()
wine.feature_names.append("result")
wine_pd.columns=wine.feature_names
wine_pd

执行结果如下图所示:

编写代码查看形状:

python 复制代码
Xtrain, Xtest, Ytrain, ytest = train_test_split(wine.data,wine.target,test_size=0.3,random_state=420)
print(Xtrain.shape)
print(Xtest.shape)

执行结果如下所示:

建立模型

python 复制代码
clf = tree.DecisionTreeClassifier(criterion="gini")
clf = clf.fit(Xtrain, Ytrain)
clf.score(Xtest, ytest) #返回预测的准确度

执行结果如下图所示:

画决策树

我们可以利用 Graphviz 模块导出决策树模型,第一次使用 Graphviz 之前需要进行安装,若是使用从 pip 安装:

shell 复制代码
!pip install graphviz

执行结果如下所示:

对图案进行绘制:

python 复制代码
import matplotlib.pyplot as plt
import graphviz
from sklearn import tree


feature_name = ['酒精','苹果酸','灰','灰的碱性','镁','总酚','类黄酮','非黄烷类酚类','花青素','颜色强度','色调','od280/od315 稀释葡萄酒','脯氨酸']
dot_data = tree.export_graphviz(clf, out_file = None, feature_names= feature_name, class_names=["琴酒","雪莉","贝尔摩德"], filled=True, rounded=True)
graph = graphviz.Source(dot_data)
graph

执行结果如下图所示:

绘制的图片如下所示:

export_graphviz 生成了一个 DOT 格式的决策树:

  • feature_names:每个属性的名字
  • class_names:每个因变量类别的名字
  • label:是否显示不纯度信息的标签,默认为 all 表都显示,可以是root或 none
  • filled:是否给每个节点的主分类绘制不同的颜色,默认为 False
  • out_file:输出的 dot 文件的名字,默认为 None表示不输出文件,可以是自定义名字如"tree.dot"
  • rounded:默认为 True,表示对每个节点的边框加圆角,使用 Helvetica 字体

防止过拟合

在不加限制的情况下,一颗决策树会生长到衡量不纯度的指标最优,或者没有更多的特征可用为止。这样的决策往往会过拟合,这就是说,它会在训练集上表现的很好,在测试集上却表现糟糕。我们收集的样本数据不可能和整体的状况完全一致,因此当一颗决策树对训练数据有了过于优秀的解释性,它找出了规则必然包含了训练样本中的噪声,并是它对未知数据的拟合程度不足。

python 复制代码
#我们的树对训练集的拟合程度如何?
score_train = clf.score(Xtrain, Ytrain)
score_train

执行结果如下图所示:

为了让决策树有更好的泛化性,我们要对决策树进行剪枝。剪枝策略对决策树的影响巨大,正确的剪枝策略是优化决策树算法的核心。

random_state

如果我们改动了 random_state,画出来的每一颗树都不一样,它为什么不稳定呢?如果使用其他数据集,它还会不稳定吗?

我们之前提过,无论决策树模型如何进化,在分支上的本质都还是追求某个不纯度相关的指标的优化,而正如我们提到的,不纯度是基于节点计算出来的,也就是说,决策树在建树时,是靠优化节点来追求一棵优化的树,但是最优的节点是能够保证最优的树吗?

集成算法被用来解决这个问题:sklearn 表示,既然一棵树不能保证最优,那就建更多不同的树,然后从中取最好的。怎么样从一组数据集中建不同的树呢?在每次分支的时候,不使用全部特征,而是随机选取一部分特征,从中选取不纯度相关指标最优的作为分支用的节点。

这样,每次生成的树叶不同了。

random_state 用来设置分支中的随机模型的参数,默认是 None,在高维度时随机性会表现更明显,低维度的数据随机性几乎不会显现。输入任意整数,会一直长出同一棵树,让模型稳定下来。

splitter

splitter 也是用来控制决策树中随机选项的,有两种输入值:

  • 输入 best,决策树在分支时虽然随机,但是还是会优先选择更重要的特征进行分支(重要性可以通过属性 feature_importance 查看)
  • 输入 random,决策树在分支时会更加随机,树会因为含有更多的不必要的信息而更深更大,并因为这些不必要信息而降低对训练集的拟合。这也是一种防止过拟合的方式。

当你预测到你的模型会过拟合,用这两个参数来帮助你降低树建成之后的过拟合的可能性,当然,树一旦建成,我们依然是使用剪枝参数来防止拟合的。

python 复制代码
clf = tree.DecisionTreeClassifier(criterion="entropy",random_state=30,splitter="random")
clf = clf.fit(Xtrain, Ytrain)
score = clf.score(Xtest, ytest)
print(score)
plt.rcParams['font.sans-serif']=['Simhei']
plt.rcParams['axes.unicode_minus']=False

代码的执行结果如下所示:

相关推荐
桃花键神23 分钟前
AI可信论坛亮点:合合信息分享视觉内容安全技术前沿
人工智能
野蛮的大西瓜44 分钟前
开源呼叫中心中,如何将ASR与IVR菜单结合,实现动态的IVR交互
人工智能·机器人·自动化·音视频·信息与通信
CountingStars6191 小时前
目标检测常用评估指标(metrics)
人工智能·目标检测·目标跟踪
tangjunjun-owen1 小时前
第四节:GLM-4v-9b模型的tokenizer源码解读
人工智能·glm-4v-9b·多模态大模型教程
冰蓝蓝1 小时前
深度学习中的注意力机制:解锁智能模型的新视角
人工智能·深度学习
橙子小哥的代码世界1 小时前
【计算机视觉基础CV-图像分类】01- 从历史源头到深度时代:一文读懂计算机视觉的进化脉络、核心任务与产业蓝图
人工智能·计算机视觉
云云3212 小时前
怎么通过亚矩阵云手机实现营销?
大数据·服务器·安全·智能手机·矩阵
新加坡内哥谈技术2 小时前
苏黎世联邦理工学院与加州大学伯克利分校推出MaxInfoRL:平衡内在与外在探索的全新强化学习框架
大数据·人工智能·语言模型
Data-Miner3 小时前
经典案例PPT | 大型水果连锁集团新零售数字化建设方案
大数据·big data
fanstuck3 小时前
Prompt提示工程上手指南(七)Prompt编写实战-基于智能客服问答系统下的Prompt编写
人工智能·数据挖掘·openai