欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

机器学习实战:基于Scikit-Learn和TensorFlow 读书笔记 第6章 决策树

程序员文章站 2022-08-21 22:18:29
数据挖掘作业,要实现决策树,现记录学习过程 win10系统,Python 3.7.0 构建一个决策树,在鸢尾花数据集上训练一个DecisionTreeClassifier: from sklearn.datasets import load_iris from sklearn.tree import ......

数据挖掘作业,要实现决策树,现记录学习过程

win10系统,python 3.7.0

构建一个决策树,在鸢尾花数据集上训练一个decisiontreeclassifier:

from sklearn.datasets import load_iris
from sklearn.tree import decisiontreeclassifier
iris = load_iris()
x = iris.data[:,2:]
y = iris.target
tree_clf = decisiontreeclassifier(max_depth=2)
tree_clf.fit(x,y)

要将决策树可视化,首先,使用export_graphviz()方法输出一个图形定义文件,命名为iris_tree.dot

 

这里需要安装graphviz

安装方式:

① conda install python-graphviz

② pip install graphviz

在当前目录下新建images/decision_trees目录

不然会报错

traceback (most recent call last):
file "decisiontree.py", line 21, in <module>
filled=true)
file "e:\anaconda\lib\site-packages\sklearn\tree\export.py", line 762, in export_graphviz
out_file = open(out_file, "w", encoding="utf-8")
filenotfounderror: [errno 2] no such file or directory: '.\\images\\decision_trees\\iris_tree.dot'

from sklearn.tree import export_graphviz
import os
project_root_dir = "."
chapter_id = "decision_trees"
def image_path(fig_id):
    return os.path.join(project_root_dir, "images", chapter_id, fig_id)

export_graphviz(tree_clf, out_file=image_path("iris_tree.dot"), feature_names=iris.feature_names[2:], class_names=iris.target_names, rounded=true, filled=true)

运行过后生成了一个dot文件

机器学习实战:基于Scikit-Learn和TensorFlow 读书笔记  第6章 决策树

 

 

 使用命令dot -tpng iris_tree.dot -o iris_tree.png 将dot文件转换为png文件方便显示

机器学习实战:基于Scikit-Learn和TensorFlow 读书笔记  第6章 决策树

 

 

 

 决策树如上图所示

petal length:花瓣长度   petal width:花瓣宽度

samples:统计出它应用于多少个训练样本实例

value:这个节点对于每一个类别的样例有多少个  机器学习实战:基于Scikit-Learn和TensorFlow 读书笔记  第6章 决策树这个叶结点显示包含0 个 iris-setosa,1 个 iris-versicolor 和 45 个 iris-virginica

 gini:用于测量它的纯度,如果一个节点包含的所有训练样例全都是同一类别的,我们就说这个节点是纯的( gini=0 )

gini公式:

机器学习实战:基于Scikit-Learn和TensorFlow 读书笔记  第6章 决策树 pik是第i个节点上,类别为k的训练实例占比

 

 

 

深度为 2 的左侧节点基尼指数为: 1 - (0/54)² - (49/54)² - (5/54)² = 0.68

进行预测

当找到了一朵鸢尾花并且想对它进行分类时,从根节点开始,询问花朵的花瓣长度是否小于2.45厘米。如果是,将向下移动到根的左侧子节点,在这种情况下,它是一片叶子节点,它不会再继续问任何问题,决策树预测你的花是iris-setosa

 

假设你找到了另一朵花,但这次的花瓣长度是大于2.45厘米的。必须向下移动到根的右侧子节点,而这个节点不是叶节点,它会问另一个问题,花瓣宽度是否小于1.75厘米?如果是,则将这朵花分类成iris-versicolor ,不是,则分类成iris-versicolor

 

注意:scikit-learn使用的是cart算法,该算法仅生成二叉树;非叶节点永远只有两个子节点。

估计分类概率

新样本:花瓣长5厘米,花瓣宽1.5厘米,预测具体的类

print(tree_clf.predict_proba([[5,1.5]]))
print(tree_clf.predict([[5,1.5]]))

机器学习实战:基于Scikit-Learn和TensorFlow 读书笔记  第6章 决策树

此处说明分类为iris-setosa的概率为0,分类为iris-versicolor的概率为0.90740741,分类为iris-virginica的概率为0.09259259

通过predict预测该花为iris-versicolor

 完整代码

#在鸢尾花数据集上进行一个决策树分类器的训练
from sklearn.datasets import load_iris
from sklearn.tree import decisiontreeclassifier
from sklearn.tree import export_graphviz
import os
project_root_dir = "."
chapter_id = "decision_trees"
def image_path(fig_id):
    return os.path.join(project_root_dir, "images", chapter_id, fig_id)

iris = load_iris()
x = iris.data[:,2:]
y = iris.target
tree_clf = decisiontreeclassifier(max_depth=2)
tree_clf.fit(x,y)
export_graphviz(tree_clf,
                out_file=image_path("iris_tree.dot"),
                feature_names=iris.feature_names[2:],
                class_names=iris.target_names,
                rounded=true,
                filled=true)      
print(tree_clf.predict_proba([[5,1.5]]))
#[0]:iris-setosa,     [1]:iris-versicolor,    [2]:iris-virginica"
print(tree_clf.predict([[5,1.5]]))

 

cart训练算法原理介绍:

scikit-learn使用的是分类与回归树(classification and regression tree,简称cart)算法来训练决策树(也叫作“生长”树)。想法非常简单:首先,使用单个特征k和阈值tk(例如,花瓣长度≤2.45厘米)将训练集分成两个子集。k和阈值tk怎么选择?答案是产生出最纯子集(受其大小加权)的k和tk就是经算法搜索确定的(t,tk)。

机器学习实战:基于Scikit-Learn和TensorFlow 读书笔记  第6章 决策树