点一下关注吧!!!非常感谢!!连续更新!!!
现在已经更新到了:
- 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)
比起基尼系数,信息熵对不纯度更加敏感,对不纯度的惩罚最强。但是在实际利用中,信息熵和基尼系数的效果根本类似。
信息熵的计算比基尼系数要缓慢一些,因为基尼系数的计算不涉及对数。
另外,因为信息熵对不纯度更加敏感,所以信息熵作为指标时,决策树的生长会更加精细,因此在对于高维数据或者噪声很多的数据,信息熵很轻易过拟合,基尼系数在这种情况下效果往往比较好。
当模型拟合程度不足时,即当模型在练习集和测试集上都表现的不太好的时间,利用信息熵。当然,这些不是绝对的。
初步建模
- # 导入需要的算法库和模块
- 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
复制代码 加载数据
- wine = load_wine()
- wine.data.shape
- wine.target
复制代码 实行效果如下所示:
如果是 wine 是一张表,应该长如许:
- 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
复制代码 实行效果如下图所示:
编写代码查看形状:
- Xtrain, Xtest, Ytrain, ytest = train_test_split(wine.data,wine.target,test_size=0.3,random_state=420)
- print(Xtrain.shape)
- print(Xtest.shape)
复制代码 实行效果如下所示:
创建模型
- clf = tree.DecisionTreeClassifier(criterion="gini")
- clf = clf.fit(Xtrain, Ytrain)
- clf.score(Xtest, ytest) #返回预测的准确度
复制代码 实行效果如下图所示:
画决策树
我们可以利用 Graphviz 模块导出决策树模型,第一次利用 Graphviz 之前需要进行安装,若是利用从 pip 安装:
实行效果如下所示:
对图案进行绘制:
- 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 字体
防止过拟合
在不加限制的情况下,一颗决策树会生长到衡量不纯度的指标最优,或者没有更多的特征可用为止。如许的决策往往会过拟合,这就是说,它会在练习集上表现的很好,在测试集上却表现糟糕。我们收集的样本数据不可能和团体的状态完全同等,因此当一颗决策树对练习数据有了过于优秀的解释性,它找出了规则一定包含了练习样本中的噪声,并是它对未知数据的拟合程度不足。
- #我们的树对训练集的拟合程度如何?
- score_train = clf.score(Xtrain, Ytrain)
- score_train
复制代码 实行效果如下图所示:
为了让决策树有更好的泛化性,我们要对决策树进行剪枝。剪枝策略对决策树的影响巨大,正确的剪枝策略是优化决策树算法的焦点。
random_state
如果我们改动了 random_state,画出来的每一颗树都不一样,它为什么不稳固呢?如果利用其他数据集,它还会不稳固吗?
我们之前提过,无论决策树模型如何进化,在分支上的本质都照旧追求某个不纯度相干的指标的优化,而正如我们提到的,不纯度是基于节点计算出来的,也就是说,决策树在建立时,是靠优化节点来追求一棵优化的树,但是最优的节点是可以或许包管最优的树吗?
集成算法被用来解决这个题目:sklearn 表示,既然一棵树不能包管最优,那就建更多不同的树,然后从中取最好的。怎么样从一组数据会合建不同的树呢?在每次分支的时间,不利用全部特征,而是随机选取一部分特征,从中选取不纯度相干指标最优的作为分支用的节点。
如许,每次生成的树叶不同了。
random_state 用来设置分支中的随机模型的参数,默认是 None,在高维度时随机性会表现更明显,低维度的数据随机性险些不会显现。输入恣意整数,会不停长出同一棵树,让模型稳固下来。
splitter
splitter 也是用来控制决策树中随机选项的,有两种输入值:
- 输入 best,决策树在分支时虽然随机,但是照旧会优先选择更重要的特征进行分支(重要性可以通过属性 feature_importance 查看)
- 输入 random,决策树在分支时会更加随机,树会因为含有更多的不必要的信息而更深更大,并因为这些不必要信息而低落对练习集的拟合。这也是一种防止过拟合的方式。
当你预测到你的模型会过拟合,用这两个参数来帮助你低落树建成之后的过拟合的可能性,当然,树一旦建成,我们依然是利用剪枝参数来防止拟合的。
- 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
复制代码 代码的实行效果如下所示:
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |