graphviz 画决策树_数据挖掘入门系列教程(四)之基于scikit-lean决策树处理Iris

19cd3b89d2e7111c64f45988b5303389.png
  • 数据挖掘入门系列教程(四)之基于scikit-lean决策树处理Iris
    • 加载数据集
    • 数据特征
    • 训练
    • 随机森林
    • 调参工程师
    • 结尾

数据挖掘入门系列教程(四)之基于scikit-lean决策树处理Iris

在上一篇博客,我们介绍了决策树的一些知识。如果对决策树还不是很了解的话,建议先阅读上一篇博客,在来学习这一篇。

本次实验基于scikit-learn中的Iris数据。说了好久的Iris,从OneR到决策树,那么Iris到底长啥样呢?

adf217ff8e0f0550b99ad66e9ebd0c49.png

加载数据集

首先我们还是需要先加载数据集,数据集来自scikit自带的iris数据集,数据集的内容可以参考以前的博客,这里就不在赘述。

首先让我们从scikit-learn中加载数据集。

from sklearn.datasets import load_iris
dataset = load_iris()
data = dataset.data
target = dataset.target

然后我们再使用pandas将数据进行格式化以下,添加Iris的属性到数据集中。

import numpy as np
import pandas as pd
data = pd.DataFrame(data,columns=["sepal_length","sepal_width","petal_length","petal_width"])
data["class"] = target

data的数据如下所示:

79ce76c8b73d4843f40f74bdf8b74bfd.png

class代表类别。其他的就是Iris的属性了。

数据特征

这里我们主要是用画图来看一看Iris数据集的特征。本来以为画图就matpotlib就行了,但是没想到有seaborn这个好使用的库,来自B站up主的提示。使用的库如下:

  • matplotlib
  • seaborn

首先我们画散点图:

import matplotlib.pyplot as plt
import seaborn as sb
# data.dropna()去除里面的none元素
sb.pairplot(data.dropna(),hue="class")

图像如下所示:

b9a33e59487726ffbd8c91f37c81d42a.png

上面的这幅图展示了在四个属性中的类别的分别情况。

同时我们还可以画小提琴图:

plt.figure(figsize=(20, 20))
for column_index, column in enumerate(data.columns):if column == 'class':continueplt.subplot(2, 2, column_index + 1)sb.violinplot(x='class', y=column, data=data)

画出的图如下:

8524371b74937f97aa2755b6a73cf6aa.png

通过上面的这幅图我们可以直观的比较出哪一个变量更具有代表性。比如说petal_width 对类别0更加的友好。

接下来就是进行训练了。

训练

首先的首先,我们还是需要从数据集中抽出训练集和测试集。这个内容在前面讲过了,就不多讲了。

from sklearn.model_selection import train_test_splitinput_data = data[["sepal_length","sepal_width","petal_length","petal_width"]]
input_class =  data["class"]train_data,test_data,train_class,test_class = train_test_split(input_data,input_class,random_state = 14)

then,让我们来开始进行训练吧,在scikit-learn中实现了决策树,和前面的K近邻算法一样我们直接引用就行,调用fit(训练)和predict(预测)函数。使用如下所示:

from sklearn.tree import DecisionTreeClassifierdecision_tree = DecisionTreeClassifier(random_state=14)
decision_tree.fit(train_data,train_class)
predict_class = decision_tree.predict(test_data)
predict_score = np.mean(predict_class == test_class)
print("预测的准确度为{}".format(predict_score))

DecisionTreeClassifier其他的参数在后面说,这里主要说一下random_state参数。为什么决策树还需要random_state这个参数,以下知乎上面的两位博主的说法。

59ead5a8926c2533d786cb770f85b065.png

f7c91f25d9e02149f360fd471054c3cc.png

至于哪个说法是正确的,我暂时也不知道,如果有知道的,可以在评论区留言哦!

最后得到的预测结果如下所示:

25a3211dde77afb30ad5d92b53f7479c.png

这里值得注意的是DecisionTreeClassifier()函数,里面可以添加很多参数。官方文档在这里: https://scikit-learn.org/stable/modules/generated/sklearn.tree.DecisionTreeClassifier.html 。

这里还是稍微的说一下参数。

# criterion  gini(默认)/tropy:这里对应的就是之前的熵增益和Gini系数# splitter  best(默认)/random 每个结点选择的拆分策略# max_depth  树的最大深度。# min_samples_split int类型或者float(默认2) 如果某节点的样本数少于min_samples_split,则不会进行拆分了。浮点值表示分数,代表所占比例# min_samples_leaf 默认=1 这个值限制了叶子节点最少的样本数,如果某叶子节点数目小于样本数,则会和兄弟节点一起被剪枝。# min_weight_fraction_leaf float(默认0.0) 这个值限制了叶子节点所有样本权重,如果小于这个值,则会和兄弟节点一起被剪枝。一般来说,如果我们有较多样本有缺失值,或者分类树样本的分布类别偏差很大,就会引入样本权重,这时我们就要注意这个值了。# max_features int, float or {“auto”, “sqrt”, “log2”}(默认0.0)# max_leaf_nodes 通过限制最大叶子节点数,可以防止过拟合,默认是"None”,即不限制最大的叶子节点数。如果加了限制,算法会建立在最大叶子节点数内最优的决策树。# class_weight dict/balanced 指定样本各类别的的权重,主要是为了防止训练集某些类别的样本过多导致训练的决策树过于偏向这些类别。这里可以自己指定各个样本的权重。“balanced”,则算法会自己计算权重,样本量少的类别所对应的样本权重会高。# min_impurity_split 这个值限制了决策树的增长,如果某节点的不纯度(基尼系数,信息增益,均方差,绝对差)小于这个阈值则该节点不再生成子节点。即为叶子节点 。

更多的可以去看官网细节。

然后我们可以将这个树的结构可视化,将文件保存在“tree.dot”中:

from sklearn.tree import export_graphviz
with open("tree.dot",'w') as f:export_graphviz(decision_tree, feature_names =['sepal_length', 'sepal_width', 'petal_length', 'petal_width'], out_file = f)

这个是决策树的图:

9667fbe5477f6a685452c9091ac1c7f3.png

同样,我们还可以使用交叉验证,具体的使用可以参考别人的博客,或者看我的这一篇博客:

from sklearn.model_selection import cross_val_score
decision_tree = DecisionTreeClassifier()
scores = cross_val_score(decision_tree,input_data,input_class,scoring='accuracy')
print("交叉验证结果: {0:.2f}%".format(np.mean(scores) * 100))

通过交叉验证得到的准确度如下:

e935ad3bb9e80bd421fba5f9886ff20a.png

比上面的结果略低,不过这个是正常的。

随机森林

前面的博客介绍了随机树,这里不多做介绍,直接看使用吧。我们通过导入RandomForestClassifier模块,并指令森林中树的个数为30,具体的参数看官网

from  sklearn.ensemble import RandomForestClassifier
rft = RandomForestClassifier(n_estimators=20,random_state=14)
rft.fit(train_data,train_class)
predict_class = rft.predict(test_data)
predict_score = np.mean(predict_class == test_class)
print("随机森林预测的准确度为{}".format(predict_score))

最后的结果如下图

924099c8e1f2dbcfe1d1290f3f909880.png

然后进行交叉验证:

scores = cross_val_score(rft,input_data,input_class,scoring='accuracy')
print("Accuracy: {0:.2f}%".format(np.mean(scores) * 100))

结果如下:

8fa1eac4a4223d3544175d72f6226e27.png

emm,好像和上面的结果一样,因为这个数据集很小,可能会有这种情况。

调参工程师

首先,我们可以对决策树的max_feature和max_depth进行调参,改变其值,最终的结果如下:

03496060a480002edcd9158fc875b69a.png

在随机森林中,我们可以对树的个数进行调参,结果如下图:

a3c47d29fe91d1e05c8e8b2b53827d2b.png

结尾

这次并没有使用《 Python数据挖掘入门与实践 》书上的例子,实在是它打篮球的数据找不到,emm。相比较与oneR算法的70%左右的正确率,决策树95%正确率已经算足够优秀了。

尽管代码写起来很简单,也很容易实现得到结果,但是我们真正应该了解的是里面的内涵:决策树是什么?里面是怎样工作的?以及所蕴含的含义……

项目地址:GitHub

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/261939.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

设计模式UML图

1.简单工厂模式 2.工厂模式 工厂模式与简单工厂模式的不同在于,每个操作类都有自己的工厂,而且把逻辑判断交给了客户端,而简单工厂的逻辑判断在工厂类里边,当增加新的操作类时,简单工厂需要修改工厂类,而工…

Android小項目之--ListView與ListAcitivity完善論壇管理效果2(附源碼)

ListAcitivity 类型布局用来配置应用程序,主要为显示菜单列表、列表明细项目,假如让程序继承 ListActivity ,可以实现以下的方法: getListAdapter()  取得目前列表项目的 AdaptergetListView()  取得目前列表的 ViewgetSelectedItemId() …

c语言编辑输出后汉字乱码,为什么这个程序会输出汉字乱码

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼#include #include #include #include #include int main(void){int correct false;char anothergame *Y*;int counter 0;int sequencelength 0;time_t seed 0;int number 0;time_t now 0;int time_taken0;int i1;printf(&qu…

Ctrl+F5不能使用的问题

axure中F5生成整个原型,CtrlF5是生成当前的单个页面。 如果碰到CtrlF5不能生成的情况,则表明当前的页面处在母版页,动态面板的状态页,或者在生成页面中,没有勾选生成所有页面转载于:https://www.cnblogs.com/zlhayden/…

docker 覆盖 entrypoint_最佳实践,Dockerfile中ENTRYPOINT与CMD指令的区别与建议

通过本文你会获得什么熟悉Dockerfile中ENTRYPOINT和CMD指令之间的区别,以及在实际项目中的使用建议。1 - 开始前准备首先你要有个docker环境,以下实验基于:docker 18.09,以及alpine:3.8镜像。下载基础镜像docker pull alpine:3.82…

《修改winXP pro安装界面》 、《修改winXP pro开机画面》、《修改winXP pro登录画面》...

一、《修改winXP pro安装界面》 ---------------------------- 安装界面----也就是安装复制完系统文件,重启进入的安装界面,这个界面停留的时间较长,值得一改以 供欣赏,复制完winXP pro的安装文件到硬盘上后,点击“i38…

单实例单向rac搭建gg流

1、 m1 m2 m3 source端 2、 在m1 m2 m3 上 /etc/hosts 172.16.10.140 source source上 添加 #public network 172.16.15.101 m1 172.16.15.102 m2 172.16.15.103 m3 #private network 10.11.11.1 m1-pri 10.11.11.2 m2-pri 10.11.11.3 m3-pri 29 #VIP network 172.16.15.1…

int0低电平触发c语言,单片机中断的解释.ppt

单片机中断的解释在CPU和外设交换信息时,存在着快速CPU和慢速外设间的矛盾,机器内部有时也可能出现突发事件,为此,计算机中通常采用中断技术。 中断 CPU和外设并行工作,当外设数据准备好( 或有某种突发事件发生)时向CP…

python自动登录教程_Python 实现自动登录+点击+滑动验证功能

需要用到的库有selenium,还需要安装Chrome浏览器驱动,具体如何安装我就不详述了 在这里我模拟了csdn的登录过程 ** 1**.首先打开网页,用户名密码登录,然后定位用户名输入框,和密码输入框,输入后 点击登陆 弹…

js 字符ascii码转换函数

字符转ascii码&#xff1a;用charCodeAt();ascii码砖字符&#xff1a;用fromCharCode(); 看一个小例子<script>str"A";code str.charCodeAt(); str2 String.fromCharCode(code);str3 String.fromCharCode(0x6026);document.write(code<br />);documen…

【生活智慧】005.信守诺言的约束

《塔木德》指出&#xff0c;信守诺言的约束&#xff0c;重视集体的力量&#xff0c;永远怀着必胜的信念的等&#xff0c;都有助于一个人获得成功。 下面的故事生动地诠释了这些使很多犹太人受益一生的原则。 丛林中走出了四个男人&#xff0c;他们蓬头垢面&#xff0c;衣衫褴褛…

python c 语言接口,## 人生苦短我用python[0x08] 使用ctypes调用c语言接口 ##

文章内容为原创&#xff0c;欢迎转载请注明出处作者&#xff1a; EflyPro->晦明禅师1.背景python作为解析语言大规模应用在各个领域&#xff0c;c语言作为系统级别的语言广泛应用在基础&#xff0c;系统&#xff0c;网络等底层服务当中&#xff0c;可以说python和c语言之间各…

2月份.xyz域名总量10强:西数称王 注册量破百万

IDC评述网&#xff08;idcps.com&#xff09;02月25日报道&#xff1a;根据ntldstats.com发布的最新数据显示&#xff0c;截止至2016年2月24日17时&#xff0c;国内外.xyz域名总量十强名单顺序&#xff0c;与上期1月28日对比&#xff0c;无任何变化。最值得一提的是&#xff0c…

flash作业_一起作业,你很智障!

电子作业现在貌似很流行&#xff0c;在很多学校都有&#xff0c;具体的利弊就不再赘述&#xff0c;可以点击前面的超链接跳转到某度百科自己看。今天只是忍不住怕盘点下国内知名电子作业平台——一起作业网的一些智障设计。。。本来想写到这里去的&#xff1a;有哪些让人拍案叫…

XML 测验

您的回答&#xff1a; 1.XML指的是&#xff1f; 您的回答&#xff1a;eXtensible Markup Language 2.XML对数据进行描述的方式是&#xff1f; 您的回答&#xff1a;XML使用描述节点类描述数据 正确答案&#xff1a;XML使用DTD来描述数据 3.XML的目标是取代HTML 您的回答&#x…

【unity3d游戏开发之基础篇】利用射线实现鼠标控制角色转向和移动(角色移动一)...

由于最近搞2D游戏&#xff0c; 下面的代码配合NGUI来使用 。。。 将代码拖到角色身上就OK&#xff0c; 实现了角色转向、移动 &#xff0c;想看效果的可以将代码下下来~ 用到了向量来计算角度 以及方向&#xff0c; 得恶补下向量知识了 。。。 代码参考&#xff1a; 1 using…

QtCreator添加图片资源

在qt creator里面&#xff0c;设计师designer是一个很好用的功能&#xff0c;通过它我们可以可视化的设计界面。当然了&#xff0c;设计界面就需要各种各样的效果&#xff0c;图片资源是不可少的。今天&#xff0c;小编就来教大家qt怎么添加图片资源 工具/原料 qt creator方法/…

只安装python_AI帮你写Python,安装只需5步,还能任你调教 | 开源

一行一行地敲代码就像是徒手搬砖&#xff0c;聪明的程序猿们表示&#xff1a;我们要解放生产力&#xff01; 比如像这样&#xff1a;在机器学习的时代&#xff0c;AI智能补全代码早已不是梦想&#xff0c;各种IDE和插件都在努力帮助程序猿减少击键次数&#xff0c;延长键盘寿命…

巧用apply让javascript函数仅执行一次

RT,有时候我们只想要让某些脚步函数执行一次就算完成任务了。如何实现这种功能呢&#xff1f;简单模仿下面这段就可以轻松搞定了&#xff1a; 代码 varobj newObject();obj.triggerOnce function(fn) { //控制让函数只触发一次returnfunction() { try{ fn.ap…

c语言输出去掉最后一行回车,新人提问:如何将输出时每行最后一个空格删除...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼如何将每行最后一个空格删除&#xff0c;使矩阵只有数字间有空格&#xff0c;没有多余空格&#xff1f;#include#includeint main(){int i,j,k,m,n,x,h,y;int a[15][15]{0};while(scanf("%d",&i)){k1;for(n1;n<i;…