大数据-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

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

相关推荐
巨龙之路几秒前
【TDengine源码阅读】#if defined(__APPLE__)
大数据·时序数据库·tdengine
MonkeyKing_sunyuhua3 分钟前
VSCode + Cline AI辅助编程完全指南
ide·人工智能·vscode
Leinwin9 分钟前
Microsoft Azure 服务4月更新告示
人工智能·azure
胡耀超13 分钟前
霍夫圆变换全面解析(OpenCV)
人工智能·python·opencv·算法·计算机视觉·数据挖掘·数据安全
jndingxin21 分钟前
OpenCV CUDA 模块中用于在 GPU 上计算两个数组对应元素差值的绝对值函数absdiff(
人工智能·opencv·计算机视觉
jerry60921 分钟前
LLM笔记(五)概率论
人工智能·笔记·学习·概率论
硅谷秋水22 分钟前
学习以任务为中心的潜动作,随地采取行动
人工智能·深度学习·计算机视觉·语言模型·机器人
巨龙之路30 分钟前
【TDengine源码阅读】TAOS_DEF_ERROR_CODE(mod, code)
大数据·时序数据库·tdengine
钊兵1 小时前
hivesql是什么数据库?
大数据·hive
Tiny番茄1 小时前
Multimodal models —— CLIP,LLava,QWen
人工智能