查看原文
其他

Sklearn入门之决策树

爬虫俱乐部 Stata and Python数据分析 2022-03-15

本文作者:杨长青

本文编辑:杨慧琳

技术总编:张学人

有问题,不要怕!访问 

http://www.wuhanstring.com/uploads/5_aboutus/爬虫俱乐部-用户问题登记表.docx(复制到浏览器中)下载爬虫俱乐部用户问题登记表并按要求填写后发送至邮箱statatraining@163.com,我们会及时为您解答哟~

爬虫俱乐部的github主站正式上线了!我们的网站地址是:https://stata-club.github.io,粉丝们可以通过该网站访问过去的推文哟~

爬虫俱乐部隆重推出数据定制及处理业务,您有任何网页数据获取及处理方面的难题,请发邮件至我们邮箱statatraining@163.com,届时会有俱乐部高级会员为您排忧解难。

决策树是一种常见的机器学习方法。通过数据的不同属性逐次划分数据集,直到数据集只包含一类数据为止,这样就形成了一棵树的形状。一般,一个决策树的构成包含一个根节点、若干内部节点、若干叶节点。下图是一个典型的决策树,通过有无房、是否结婚、收入是否达到两万来判定一个人是否逾期。其中叶节点对应的是决策结果,即下图中是否逾期。根节点是所有节点的祖先,即下图中的“有房”。从根节点到每个叶节点的路径构成了一个判定序列。

现在便将产生一个问题:属性的判定顺序是怎么排列的?我们先判定收入,再判定婚姻状况,最终判定是否有房不行吗?这就要谈到决策树算法的核心,如何选择最优的划分属性。我们希望决策树分支节点所包含的样本尽可能的属于同一类,即节点的纯度越高。如何度量节点的纯度成为了关键,由于sklearn决策树模块是基于CART(Classification and RegressionTree),CART决策树使用基尼指数来选择划分属性,数据集D纯度通过基尼值来度量:

其中k是指该属性的类别,一共有m个类别,Pk是类别为K的样本比例。基尼值越小,说明数据集的纯度越高。

类比可以定义属性α的基尼指数:

这个指数其实是对按照属性α分类后,计算分类后数据集的基尼值的加权值。指数越小,说明分类后效果越好,即选择基尼指数越小的属性进行分类,重复上述步骤,直至不能再分。

前期准备

sklearn库:机器学习库,用来实现决策树算法,通过 pip install sklearn 安装。

graphviz库:通过调用Graphviz生成决策树、流程图,通过 pip install graphviz 安装。

Graphviz:一个运用广泛的命令行绘图软体,能够很好的绘制复杂的流程图、类图。安装包已上传到爬虫俱乐部的腾讯云上,下载后点击安装,再将安装目录下的 bin 文件夹路径添加环境变量即可。

爬虫俱乐部是您身边的科研助手,能够为您在数据处理实证研究中提供帮助。承蒙近四万粉丝的支持与厚爱,我们在腾讯课堂推出了网络视频课程,专注于数据整理、网络爬虫、循环命令编制和结果输出…李老师及团队精彩地讲解,深入浅出,注重案例与实战,让您更加快速高效地掌握Stata技巧及数据处理的精髓,而且可以无限次重复观看,在原有课程基础上已上传了全新的内容!百分百好评,简单易学,一个月让您从入门到精通。绝对物超所值!观看学习网址:

https://ke.qq.com/course/286526?tuin=1b60b462,

敬请关注!

模型的训练

下面,我们通过sklearn自带示例的数据集 Iris 来实现决策树算法。该数据集包含150个数据,分为3类,每类50个数据,每个数据包含4个属性。可通过花萼长度,花萼宽度,花瓣长度,花瓣宽度4个属性预测鸢尾花卉属于(Setosa,Versicolour,Virginica)三个种类中的哪一类。

首先,我们将数据集拆分成75%的训练集,25%的测试集。并进行模型的训练,程序如下:

from sklearn.datasets import load_iris #加载sklearn自带数据集irisfrom sklearn import model_selection #删选数据,用于训练集和测试集的生成from sklearn import tree #用于生成决策树的模块iris = load_iris() #载入示例数据集x_train,x_test,y_train,y_test=model_selection.train_test_split(iris.data,iris.target,test_size=0.25,random_state=10010) #切分0.25的测试集,随机数种子为10010clf = tree.DecisionTreeClassifier() #指定用决策树算法分类,为默认参数clf = clf.fit(x_train, y_train) #模型的训练print(clf.feature_importances_) #打印四个特征的重要程度

最终模型完成训练,四个特征的重要程度如下:

可以发现第二个特征花萼宽度在判定时没有发挥任何作用。接下来,我们可以通过 graphviz 库,将判别情况导入成pdf,程序如下:

import graphviz #绘制决策树的库dot_data = tree.export_graphviz(clf, out_file=None, \feature_names = iris.feature_names,\class_names = iris.target_names)graph = graphviz.Source(dot_data)graph.render("iris")

最终在工作路径下,生成了一个名为 iris 的pdf文件,里面包含训练的决策树,如下所示:

模型的评价

用切分的测试集来评价模型效果,这里我们输出预测准确度和混淆矩阵,程序如下:

from sklearn.metrics import confusion_matrixy_pre = clf.predict(x_test) #y的预测值print("预测准确度:%f"%clf.score(x_test,y_test))matrix = confusion_matrix(y_test, y_pre,labels=[0, 1, 2]) #混淆矩阵

最终的预测准确度只有92.1%。混淆矩阵如下,可以看到有三组 Versicolour 被误判到 Virginica,这可能由于数据量太少花萼宽度未能参与有关判断有关。与此相比我们之前介绍的LDA效果要好一些。

如上就是我们今天介绍的运用sklearn实现决策树的全部内容,如有需要,欢迎大家通过邮件和我们联系。

对爬虫俱乐部的推文累计打赏超过1000元我们即可给您开具发票,发票类别为“咨询费”。用心做事,只为做您更贴心的小爬虫!

往期推文推荐

关于我们

微信公众号“爬虫俱乐部”分享实用的stata命令,欢迎转载、打赏。爬虫俱乐部是由李春涛教授领导下的研究生及本科生组成的大数据分析和数据挖掘团队。

此外,欢迎大家踊跃投稿,介绍一些关于stata的数据处理和分析技巧。

投稿邮箱:statatraining@163.com

投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到关于stata分析数据的问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存