编程语言
首页 > 编程语言> > 机器学习笔记(通俗易懂)---决策树算法介绍(6)---附完整代码

机器学习笔记(通俗易懂)---决策树算法介绍(6)---附完整代码

作者:互联网

机器学习笔记—决策树算法介绍(6)—附完整代码

以下都是本人在学习机器学习过程中的一些心得和笔记,仅供参考。


文章目录

如果你要区分四种动物:熊、鹰、企鹅和海豚,可以转换成一颗决策树来表示。

mglearn.plots.plot_animal_tree()

在这里插入图片描述

图为 区分几种动物的决策树


1.构造决策树

我们在下面的二维分类数据集上构造决策树,这个two_moons数据集由2个半月组成,每个类别都包含50个数据点。

mglearn.plots.plot_tree_progressive()

在这里插入图片描述

图为 two_moos数据集


在这里插入图片描述

图为 深度为1的树的决策边界

上图选出了第一个测试,将数据集在x[1]=0.0596处垂直划分可以得到最多信息,它在最大程度上将类别 0 中的点与类别 1 中的点进行区分。

右侧的决策树,通过测试 x[1] <=0.0596的真假来对数据集进行划分,在图中表示为一条黑线。

如果测试结果为真,那么将这个点分配给左结点,左结点里包含属于类别 0 的 2 个点和属于类别 1 的 32 个点。否则将这个点分配给右结点,右结点里包含属于类别 0 的 48 个点和属于类别 1 的 18 个点。


在这里插入图片描述

图为 深度为2的树的决策边界

尽管第一次划分已经对两个类别做了很好的区分,但底部区域仍包含属于类别 0 的点,顶部区域也仍包含属于类别 1 的点。我们可以在两个区域中重复寻找最佳测试的过程,从而构建出更准确的模型。

上图展示了信息量最大的下一次划分,这次划分是基于 x[0]做出的,分为左右两个区域。

这一递归过程生成一棵二元决策树,其中每个结点都包含一个测试。或者你可以将每个测试看成沿着一条轴对当前数据进行划分。这是一种将算法看作分层划分的观点。由于每个测试仅关注一个特征,所以划分后的区域边界始终与坐标轴平行。
对数据反复进行递归划分,直到划分后的每个区域(决策树的每个叶结点)只包含单一目标值(单一类别或单一回归值)。如果树中某个叶结点所包含数据点的目标值都相同,那么这个叶结点就是纯的(pure)。这个数据集的最终划分结果见下图。


在这里插入图片描述

图为 深度为9的树的决策边界


2.控制决策树的复杂度

为什么要控制决策树的复杂度,就是防止过拟合。

防止过拟合有两种常见的策略:

预剪枝的限制条件可能包括限制树的最大深度、限制叶结点的最大数目,或者规定一个结点中数据点的最小数目来防止继续划分。

scikit-learn 的决策树在 DecisionTreeRegressor 类和 DecisionTreeClassifier类中实现。D但是scikit-learn 只实现了预剪枝,没有实现后剪枝。


下面我们在乳腺癌数据集上更详细地看一下预剪枝的效果。运行代码如下:

In

from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
#加载数据
cancer = load_breast_cancer()
#分离数据,stratify作用为以分层方式分割数据,保持测试集与整个数据集里cancer.target的数据分类比例一致
#随机数种子为42
X_train, X_test, y_train, y_test = train_test_split(
    cancer.data, cancer.target, stratify=cancer.target, random_state=42)
#调用函数
tree = DecisionTreeClassifier(random_state=0)
#训练模型
tree.fit(X_train, y_train)
print("Accuracy on training set: {:.3f}".format(tree.score(X_train, y_train)))
print("Accuracy on test set: {:.3f}".format(tree.score(X_test, y_test)))

Out

Accuracy on training set: 1.000
Accuracy on test set: 0.937

如果我们不限制决策树的深度,它的深度和复杂度都可以变得特别大。因此,未剪枝的树容易过拟合,对新数据的泛化性能不佳

这里我们设置max_depth=4,这意味着只可以连续问4个问题,限制树的深度可以减少过拟合,会降低训练集的精度,但可以提高测试集的精度

In

from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
#加载数据
cancer = load_breast_cancer()
#分离数据,stratify作用为以分层方式分割数据,保持测试集与整个数据集里cancer.target的数据分类比例一致
#随机数种子为42
X_train, X_test, y_train, y_test = train_test_split(
    cancer.data, cancer.target, stratify=cancer.target, random_state=42)
#调用函数
tree = DecisionTreeClassifier(max_depth=4, random_state=0)
tree.fit(X_train, y_train)

print("Accuracy on training set: {:.3f}".format(tree.score(X_train, y_train)))
print("Accuracy on test set: {:.3f}".format(tree.score(X_test, y_test)))

Out

Accuracy on training set: 0.988
Accuracy on test set: 0.951

3.分析决策树

我们可以利用tree模块的export_graphviz函数来将树可视化。

这个函数会生成一个.dot格式的文件,这是一种用于保存图形的文本文件格式。

from sklearn.tree import export_graphviz
export_graphviz(tree, out_file="tree.dot", class_names=["malignant", "benign"],
                feature_names=cancer.feature_names, impurity=False, filled=True)

我们可以利用graphviz模块读取这个文件并将其可视化:

import graphviz
with open("tree.dot") as f:
    dot_graph = f.read()
display(graphviz.Source(dot_graph))

在这里插入图片描述

图为 机器乳腺癌数据集构造的决策树的可视化


4.树的特征重要性

查看整个树可能非常费劲,除此之外,我还可以利用一些有用的属性来总结树的工作原理。

In

from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
cancer = load_breast_cancer()
#分离数据,stratify作用为以分层方式分割数据,保持测试集与整个数据集里cancer.target的数据分类比例一致
#随机数种子为42
X_train, X_test, y_train, y_test = train_test_split(
    cancer.data, cancer.target, stratify=cancer.target, random_state=42)
#调用函数,max_depth参数代表深度
tree = DecisionTreeClassifier(max_depth=4,random_state=0)
#训练模型
tree.fit(X_train, y_train)
print("Feature importances:\n{}".format(tree.feature_importances_))

Out

Feature importances:
[0.         0.         0.         0.         0.         0.
 0.         0.         0.         0.         0.01019737 0.04839825
 0.         0.         0.0024156  0.         0.         0.
 0.         0.         0.72682851 0.0458159  0.         0.
 0.0141577  0.         0.018188   0.1221132  0.01188548 0.        ]

将特征重要性可视化:

from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
import numpy as np
cancer = load_breast_cancer()
#分离数据,stratify作用为以分层方式分割数据,保持测试集与整个数据集里cancer.target的数据分类比例一致
#随机数种子为42
X_train, X_test, y_train, y_test = train_test_split(
    cancer.data, cancer.target, stratify=cancer.target, random_state=42)
#调用函数,max_depth参数代表深度
tree = DecisionTreeClassifier(max_depth=4,random_state=0)
#训练模型
tree.fit(X_train, y_train)
def plot_feature_importance_cancer(model):
	#.shape[1]表示矩阵的第二维的长度,在这里就是特征的长度
    n_features = cancer.data.shape[1]
    plt.barh(range(n_features), model.feature_importances_, align='center')
    #前者代表y坐标轴的各个刻度,后者代表各个刻度位置的显示的lable
    plt.yticks(np.arange(n_features), cancer.feature_names)
    plt.xlabel("Feature importance")
    plt.ylabel("Feature")
    plt.show() 
plot_feature_importance_cancer(tree)

在这里插入图片描述

图为 在乳腺癌数据集上学到的决策树的特征重要性


在这里插入图片描述

图为 一个二维数据集与决策树给出的决策边界

在这里插入图片描述

图为 学习得到的决策树


虽然我们主要讨论的是用于分类的决策树,但对用于回归的决策树来说,所有内容都是类似的,在 DecisionTreeRegressor中实现。

回归树的用法和分析与分类树非常类似。但在将基于树的模型用于回归时,我们想要指出它的一个特殊性质。 DecisionTreeRegressor(以及其他所有基于树的回归模型)不能外推加粗样式(extrapolate),也不能在训练数据范围之外进行预测。


5.优缺点和参数



5.优缺点和参数


标签:结点,cancer,tree,通俗易懂,---,train,test,决策树
来源: https://blog.csdn.net/ntntg/article/details/114287064