Scikit-Learn决策树
1、决策树分类
决策树是一种简单但广泛使用的分类器,它通过训练数据构建决策树,对未知的数据进行分类。决策树在机器学习知识结构中的位置如下:
决策树(Decision tree)是基于已知各种情况(特征取值)的基础上,通过构建树型决策结构来进行分析的一种方式,是常用的有监督的分类算法
决策树模型呈树形结构,在分类问题中,一颗决策树可以视作if-then规则的集合。模型具有可读性,分类速度快的特点,在各种实际业务建模过程中广泛使用
决策树模型模拟人类决策过程。决策树是一种预测模型,代表的是对象属性与对象值之间的映射关系
决策树模型的核心由以下几部分组成:
- 节点和有向边组成
- 节点有内部节点和叶结点两种类型
- 内部节点表示一个特征,叶节点表示一个类
其中,根节点是第一个内部节点;每个内部结点表示一个属性的测试,每个分支表示一个测试输出(A属性取某类值的可能结果),每个叶结点代表一种类别。当属性A取值为0时,则对下一个属性B进行测试;若属性A取值为1时,则对应于叶结点(决策结果)
决策树的学习过程是,通过对训练样本的分析来确定划分属性,即内部节点所对应的属性;决策树的预测过程是,将测试示例从根节点开始,沿着划分属性所构成的判定测试序列下行,直到叶节点
更多关于决策树和决策树算法的介绍详见文章:传送门
2、Scikit-Learn决策树分类
2.1、Scikit-Learn决策树API
sklearn.tree.DecisionTreeClassifier
是Scikit-Learn决策树分类的API:
class sklearn.tree.DecisionTreeClassifier(*, criterion='gini', splitter='best', max_depth=None, min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features=None, random_state=None, max_leaf_nodes=None, min_impurity_decrease=0.0, class_weight=None, ccp_alpha=0.0, monotonic_cst=None)
官方对该API的描述如下:
DecisionTreeClassifier
是一个既能够进行二分类,也能够进行多类分类的类。与其他分类器一样,DecisionTreeClassifier
使用两个数组作为输入,经拟合后,该模型可用于预测其他样本的类别
中文官方文档:https://scikit-learn.org.cn/view/784.html
API参数及说明如下:
参数 | 说明 |
---|---|
criterion |
用于衡量节点(分支)划分质量的指标,默认为gini (基尼系数)。其他取值还有entropy (信息熵),这种指标使用父节点的信息熵与子节点的信息熵之差(信息增益);log_loss (逻辑损失) |
splitter |
用于在每个节点上选择划分的策略,默认为best (最佳划分)。其他还有random (随机划分) |
max_depth |
决策树的最大深度,默认为None,表示将节点展开,直到所有叶子都是纯净的,或者直到所有叶子都包含少于min_samples_split 个样本,即没有限制。大于最大深度的部分将被剪掉 |
min_samples_split |
拆分内部节点所需的最少样本数,默认为2,表示每个节点至少需要2个样本才能进行划分。中间节点样本数量小于min_samples_split 的将被剪掉 |
min_samples_leaf |
在叶节点处需要的最小样本数,默认为1,表示每个叶子节点至少需要1个样本才能停止划分。样本数量小于min_samples_leaf 的叶子节点将被剪掉 |
min_weight_fraction_leaf |
在所有叶节点处(所有输入样本)的权重总和中的最小加权分数,默认为0.0。如果未提供sample_weight ,则样本的权重相等 |
max_features |
寻找最佳划分时要考虑的特征数量,默认为None或auto ,使用全部特征。其他取值还有sqrt (sqrt(n_features) );log2 (log2(n_features) );也可使用int 类型直接指定 |
random_state |
用于控制估算器的随机性,设置随机数生成器的种子 |
max_leaf_nodes |
用于控制决策树最多有多少个叶子节点,默认为None,叶子节点的数量不受限制 |
min_impurity_decrease |
用于控制每个节点最少需要减少多少不纯度才能进行划分,默认值为0.0,表示每个节点至少需要减少0个不纯度才能进行划分 |
class_weight |
目标类别的权重,字典类型,默认为None,所有分类的权重为1 |
ccp_alpha |
用于最小代价复杂度修剪的复杂度参数,默认值为0.0,表示不执行修剪 |
monotonic_cst |
要对每个特征强制实施的单调性约束,默认为None(0),不应用任何约束。1表示单调递增;-1表示单调递减 |
常用属性及说明如下:
属性 | 说明 |
---|---|
feature_importances_ |
返回每个特征的重要程度,一维数组类型 |
max_features_ |
拟合期间的特征数 |
n_classes_ |
类别数(单输出问题),或者一个包含所有类别数量的列表(多输出问题) |
n_features_in_ |
拟合期间的特征数 |
feature_names_in_ |
拟合期间的特征名称 |
常用方法及说明如下:
方法 | 说明 |
---|---|
fit(X,y) |
根据训练集构建决策树分类器 |
predict(X) |
预测X的类或回归值 |
score(X,y) |
返回模型在给定测试数据和标签上的平均准确度 |
get_depth() |
返回决策树的深度 |
get_n_leaves() |
返回决策树的叶子数 |
apply(X) |
返回每个样本被预测为叶子的索引 |
cost_complexity_pruning_path(X,y) |
在最小化成本复杂性修剪期间计算修剪路径 |
decision_path(X) |
返回树中的决策路径 |
2.2、Scikit-Learn决策树初体验
下面我们使用Scikit-Learn提供的API制作两个交错的半圆形数据集来演示Scikit-Learn决策树的基本使用
1)制作数据集
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
# 生成两个交错的半圆形状数据集
X, y = datasets.make_moons(noise=0.25, random_state=666)
plt.scatter(X[y == 0, 0], X[y == 0, 1])
plt.scatter(X[y == 1, 0], X[y == 1, 1])
plt.show()
2)训练决策树分类模型
from sklearn.tree import DecisionTreeClassifier # 决策树分类器
# 使用CART分类树的默认参数
dt_clf = DecisionTreeClassifier()
# dt_clf = DecisionTreeClassifier(max_depth=2, max_leaf_nodes=4)
# 训练拟合
dt_clf.fit(X, y)
3)绘制决策边界
# 绘制决策边界
decision_boundary_fill(dt_clf, axis=[-1.5, 2.5, -1.0, 1.5])
plt.scatter(X[y == 0, 0], X[y == 0, 1]