本站原创文章,转载请说明来自《老饼讲解-机器学习》ml.bbbdata.com
本文我们介绍CART决策树的模型结构,模型的预测流程,
并通过一个简单实例,讲解如何构建一棵CART决策模型
本节讲述CART决策树的模型结构和它的运作原理
初步认识CART决策树模型是一个什么样的模型
模型结构
CART分类树是一棵二叉树
模型表达
决策树是一种描述型的模型,没有数学表达式。
决策树更多时候是用 一套 if else判断语句去描述树的样子。
但不管用什么形式表达决策树,都必须包含如下三点:
1. 树结构 :树长什么样子。
2. 节点分枝依据:分枝节点的特征名称和特征阈值。
3. 叶子节点类别:叶子节点所属类别。
模型运作原理
来了新样本时,模型的按如下方式进行预测:
总的来说,
就是根据样本的各个特征的值,进行判断,
一直到达叶子,根据叶子类别确定样本是属于哪个类别。
叶子节点不作判断,叶子节点只负责告诉我们,模型的预测结果是什么
本节通过一个实例,认识怎么利用软件包中的决策树函数构建一棵决策树
问 题
现有鸢尾花样本数据如下(即sklearn中的iris数据):
数据共150条,
每条数据包括四个鸢尾花特征和鸢尾花的类别,如下:
特征:花萼长度 sepal length
花萼宽度 sepal width
花瓣长度 petal length
花瓣宽度 petal width
类别:0:山鸢尾,1:杂色鸢尾,2:弗吉尼亚鸢尾
现需要用以上鸢尾花数据,训练一棵决策树,
通过鸢尾花的特征来预测鸢尾花的类别
代码实现
利用sklearn中的决策树函数,编写python代码如下:
from sklearn.datasets import load_iris
from sklearn import tree
import numpy as np
#----------------数据准备----------------------------
iris = load_iris() # 加载数据
#---------------模型训练----------------------------------
clf = tree.DecisionTreeClassifier(min_samples_leaf=15) # sk-learn的决策树模型
clf = clf.fit(iris.data, iris.target) # 用数据训练树模型构建()
#---------------模型预测结果------------------------
test_x = iris.data[[0], :]
pred_target = clf.predict(test_x) # 预测类别
#---------------打印结果---------------------------
print("\n===模型结构======")
print("树结构-左节点:"+str(clf.tree_.children_left))
print("树结构-右节点:"+str(clf.tree_.children_right))
print("节点分裂特征:"+str(clf.tree_.feature))
print("节点分裂阈值:"+str(np.round(clf.tree_.threshold,2)))
print("节点类别:"+str(clf.classes_.take( [ np.argmax(i) for i in clf.tree_.value])))
print("\n===模型预测=====")
print("数据:"+str(test_x)+',预测类别:'+str(pred_target))
代码运行结果如下:
===模型结构======
树结构-左节点:[ 1 -1 3 4 -1 -1 7 -1 -1]
树结构-右节点:[ 2 -1 6 5 -1 -1 8 -1 -1]
节点分裂特征:[ 2 -2 3 2 -2 -2 0 -2 -2]
节点分裂阈值:[ 2.45 -2. 1.75 4.45 -2. -2. 6.35 -2. -2. ]
节点类别:[0 0 1 1 1 1 2 2 2]
===模型预测=====
数据:[[5.1 3.5 1.4 0.2]],预测类别:[0]
结果解读
结果中共两部分,
第一部分是训练好的模型结构
第二部分是预测的结果
1、模型结构
程序输出的是节点编号型表述
它代表的是以下的决策树:
2、模型预测结果
应用上面训练好的决策树,
对 样本【花萼长度,花萼宽度,花瓣长度,花瓣宽度】 = 【5.1 ,3.5,1.4 ,0.2】进行预测
得到了类别预测结果:0(山鸢尾)
预测的具体流程如下:
End