决策树算法-实战篇

sklearn 库中的决策分类树只实现了ID3 算法和CART 算法。

DecisionTreeRegressor 类的构造函数

def init(self, *,

criterion=“mse”,

splitter=“best”,

max_depth=None,

min_samples_split=2,

min_samples_leaf=1,

min_weight_fraction_leaf=0.,

max_features=None,

random_state=None,

max_leaf_nodes=None,

min_impurity_decrease=0.,

min_impurity_split=None,

ccp_alpha=0.0):

DecisionTreeRegressor 类的构造函数中的criterion 参数有4 个取值:

  • mse:表示均方误差算法,为默认值。

  • friedman_mse:表示费尔德曼均方误差算法。

  • mae:表示平均误差算法。

  • poisson:表示泊松偏差算法。

其它参数可使用默认值。

3,构造分类树

我们使用 sklearn.datasets 模块中自带的鸢尾花数据集 构造一颗决策树。


在这里插入图片描述


3.1,鸢尾花数据集

鸢尾花数据集目的是通过花瓣的长度和宽度,及花萼的长度和宽度,预测出花的品种。

这个数据集包含150条数据,将鸢尾花分成了三类(每类是50条数据),分别是:

  • setosa,用数字0 表示。

  • versicolor,用数字1 表示。

  • virginica,用数字2 表示。

我们抽出3 条数据如下:

5.1,3.5,1.4,0.2,0

6.9,3.1,4.9,1.5,1

5.9,3.0,5.1,1.8,2

数据的含义:

  • 每条数据包含5 列,列与列之间用逗号隔开。

  • 从第1 列到第5 列,每列代表的含义是:花萼长度花萼宽度花瓣长度花瓣宽度花的品种

  • 在机器学习中,前4列称为特征值,最后1列称为目标值。我们的目的就是用特征值预测出目标值。

将上面3 条数据,用表格表示就是:

| 花萼长度 | 花萼宽度 | 花瓣长度 | 花瓣宽度 | 花的品种 |

| — | — | — | — | — |

| 5.1 | 3.5 | 1.4 | 0.2 | 0 |

| 6.9 | 3.1 | 4.9 | 1.5 | 1 |

| 5.9 | 3.0 | 5.1 | 1.8 | 2 |

3.2,构造分类树

首先导入必要的类和函数:

from sklearn.tree import DecisionTreeClassifier

from sklearn.datasets import load_iris

from sklearn.model_selection import train_test_split

from sklearn.metrics import accuracy_score

其中:

  • DecisionTreeClassifier 类用于构造决策树。

  • load_iris() 函数用于导入数据。

  • train_test_split() 函数用于将数据集拆分成训练集与测试集。

  • accuracy_score() 函数用于为模型的准确度进行评分。

导入数据集:

iris = load_iris() # 准备数据集

features = iris.data # 获取特征集

labels = iris.target # 获取目标集

将数据分成训练集测试集,训练集用于训练模型,测试集用于测试模型的准确度。

train_features, test_features, train_labels, test_labels =

train_test_split(features, labels, test_size=0.33, random_state=0)

我们向train_test_split() 函数中传递了4 个参数,分别是:

  • features:特征集。

  • labels:目标集。

  • test_size=0.33:测试集数据所占百分比,剩下的数据分给训练集。

  • random_state=0:随机数种子。

该函数返回4 个值,分别是:

  • train_features:训练特征集。

  • test_features:测试特征集。

  • train_labels:训练目标集。

  • test_labels:测试目标集。

接下来构造决策树:

用CART 算法构建分类树(你也可以使用ID3 算法构建)

clf = DecisionTreeClassifier(criterion=‘gini’)

用训练集拟合构造CART分类树

clf = clf.fit(train_features, train_labels)

上面两句代码已经在注释中说明,最终我们得到了决策树clfclassifier 的缩写)。

clf 预测测试集数据,test_predict 为预测结果:

test_predict = clf.predict(test_features)

计算预测结果的准确率:

score = accuracy_score(test_labels, test_predict)

score2 = clf.score(test_features, test_labels)

print(score, score2)

最终得出,sorce 和 score2都为 0.96,意思就是我们训练出的模型的准确率为96%

函数accuracy_score() 和 clf.score() 都可以计算模型的准确率,但注意这两个函数的参数不同。

4,打印决策树

为了清楚的知道,我们构造出的这个决策树cfl 到底是什么样子,可使用 graphviz 模块将决策树画出来。

代码如下:

from sklearn.tree import export_graphviz

import graphviz

clf 为决策树对象

dot_data = export_graphviz(clf)

graph = graphviz.Source(dot_data)

生成 Source.gv.pdf 文件,并打开

graph.view()

为了画出决策树,除了需要安装相应的 Python 模块外,还需要安装Graphviz 软件。

由上面的代码,我们得到的决策树图如下:


在这里插入图片描述


我们以根节点为例,来解释一下每个方框里的四行数据(叶子节点是三行数据)都是什么意思。


在这里插入图片描述


四行数据所代表的含义:

  • 第一行X[3]<=0.75:鸢尾花数据集的特征集有4 个属性,所以对于X[n]中的n的取值范围为0<=n<=3X[0]表示第1个属性,X[3] 表示第4 个属性。X[3]<=0.75 的意思就是当X[3] 属性的值小于等于0.75 的时候,走左子树,否则走右子树。

  • X[0] 表示花萼长度。

  • X[1] 表示花萼宽度。

  • X[2] 表示花瓣长度。

  • X[3] 表示花瓣宽度。

  • 第二行gini=0.666,表示当前的gini 系数值。

  • 第三行samples=100samples 表示当前的样本数。我们知道整个数据集有150 条数据,我们选择了0.33 百分比作为测试集,那么训练集的数据就占0.67,也就是100 条数据。根节点包含所有样本集,所以根节点的samples 值为100。

  • 第四行valuevalue 表示属于该节点的每个类别的样本个数,value 是一个数组,数组中的元素之和为samples 值。我们知道该数据集的目标集中共有3 个类别,分别为:setosaversicolor 和 virginica。所以:

  • value[0] 表示该节点中setosa 种类的数据量,即34。

  • value[1] 表示该节点中versicolor 种类的数据量,即31。

  • value[2] 表示该节点中virginica 种类的数据量,即35。

4.1,打印特征重要性

我们构造出来的决策树对象clf 中,有一个feature_importances_ 属性,如下:

clf.feature_importances_

array([0, 0.02252929, 0.88894654, 0.08852417])

clf.feature_importances_ 是一个数组类型,里边的元素分别代表对应特征的重要性,所有元素之和为1。元素的值越大,则对应的特征越重要。

所以,从这个数组,我们可以知道,四个特征的重要性排序为:

  • 花瓣长度 > 花瓣宽度 > 花萼宽度 > 花萼长度

我们可以使用下面这个函数,将该数组画成柱状图:

import matplotlib.pyplot as plt

import numpy as np

mode 是我们训练出的模型,即决策树对象

data 是原始数据集

def plot_feature_importances(model, data):

n_features = data.data.shape[1]

plt.barh(range(n_features), model.feature_importances_, align=‘center’)

plt.yticks(np.arange(n_features), data.feature_names)

plt.xlabel(“Feature importance”)

plt.ylabel(“Feature”)

plt.show()

plot_feature_importances(clf, iris)

下图是用plot_feature_importances() 函数生成的柱状图(红字是我添加的),从图中可以清楚的看出每个特种的重要性。

在这里插入图片描述

从该图中也可以看出,为什么决策树的根节点的特征是X[3]

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

总结

总体来说,如果你想转行从事程序员的工作,Java开发一定可以作为你的第一选择。但是不管你选择什么编程语言,提升自己的硬件实力才是拿高薪的唯一手段。

如果你以这份学习路线来学习,你会有一个比较系统化的知识网络,也不至于把知识学习得很零散。我个人是完全不建议刚开始就看《Java编程思想》、《Java核心技术》这些书籍,看完你肯定会放弃学习。建议可以看一些视频来学习,当自己能上手再买这些书看又是非常有收获的事了。


《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)*

img

总结

总体来说,如果你想转行从事程序员的工作,Java开发一定可以作为你的第一选择。但是不管你选择什么编程语言,提升自己的硬件实力才是拿高薪的唯一手段。

如果你以这份学习路线来学习,你会有一个比较系统化的知识网络,也不至于把知识学习得很零散。我个人是完全不建议刚开始就看《Java编程思想》、《Java核心技术》这些书籍,看完你肯定会放弃学习。建议可以看一些视频来学习,当自己能上手再买这些书看又是非常有收获的事了。

[外链图片转存中…(img-wHQPbxOO-1711891929136)]
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!

  • 29
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值