Scikit Learn - 决策树



本章将学习 Sklearn 中称为决策树的学习方法。

决策树 (DTs) 是最强大的非参数监督学习方法。它们可用于分类和回归任务。DTs 的主要目标是通过学习从数据特征推导出的简单决策规则来创建一个预测目标变量值的模型。决策树有两个主要组成部分:一个是根节点,数据在此处分割;另一个是决策节点或叶子节点,我们在此处获得最终输出。

决策树算法

下面解释了不同的决策树算法:

ID3

它由 Ross Quinlan 于 1986 年开发。它也称为迭代二分器 3。该算法的主要目标是为每个节点找到那些分类特征,这些特征将为分类目标产生最大的信息增益。

它允许树增长到最大大小,然后为了提高树在未见数据上的能力,应用修剪步骤。此算法的输出将是一个多路树。

C4.5

它是 ID3 的后继者,它动态地定义一个离散属性,该属性将连续属性值划分为一组离散区间。这就是它消除了分类特征限制的原因。它将 ID3 训练的树转换为一组“IF-THEN”规则。

为了确定应用这些规则的顺序,将首先评估每个规则的准确性。

C5.0

它的工作方式与 C4.5 类似,但它使用更少的内存并构建更小的规则集。它比 C4.5 更准确。

CART

它被称为分类与回归树算法。它基本上通过使用特征和阈值来生成二元分割,在每个节点产生最大的信息增益(称为基尼指数)。

同质性取决于基尼指数,基尼指数的值越高,同质性就越高。它类似于 C4.5 算法,但不同之处在于它不计算规则集,也不支持数值目标变量(回归)。

决策树分类

在这种情况下,决策变量是分类变量。

Sklearn 模块 - Scikit-learn 库提供了名为 DecisionTreeClassifier 的模块,用于对数据集执行多类分类。

参数

下表包含 sklearn.tree.DecisionTreeClassifier 模块使用的参数:

序号 参数及说明
1

criterion − 字符串,可选,默认值 = “gini”

它表示用于衡量分割质量的函数。支持的标准是“gini”和“entropy”。默认值为 gini,用于基尼不纯度,而 entropy 用于信息增益。

2

splitter − 字符串,可选,默认值 = “best”

它告诉模型,在每个节点选择分割时,要从“best”或“random”中选择哪种策略。

3

max_depth − 整数或 None,可选,默认值 = None

此参数决定树的最大深度。默认值为 None,这意味着节点将扩展到所有叶子都是纯的,或者直到所有叶子包含少于 min_smaples_split 样本。

4

min_samples_split − 整数,浮点数,可选,默认值 = 2

此参数提供拆分内部节点所需的最小样本数。

5

min_samples_leaf − 整数,浮点数,可选,默认值 = 1

此参数提供叶节点所需的最小样本数。

6

min_weight_fraction_leaf − 浮点数,可选,默认值 = 0.

使用此参数,模型将获得叶节点所需的权重总和的最小加权分数。

7

max_features − 整数,浮点数,字符串或 None,可选,默认值 = None

它为模型提供在寻找最佳分割时要考虑的特征数量。

8

random_state − 整数,RandomState 实例或 None,可选,默认值 = none

此参数表示在洗牌数据时使用的伪随机数生成的种子。选项如下:

  • 整数 - 在这种情况下,random_state 是随机数生成器使用的种子。

  • RandomState 实例 - 在这种情况下,random_state 是随机数生成器。

  • None - 在这种情况下,随机数生成器是 np.random 使用的 RandonState 实例。

9

max_leaf_nodes − 整数或 None,可选,默认值 = None

此参数将以最佳优先方式种植具有 max_leaf_nodes 的树。默认值为 none,这意味着将有无限数量的叶节点。

10

min_impurity_decrease − 浮点数,可选,默认值 = 0.

此值用作节点分割的标准,因为如果此分割引起的杂质减少大于或等于 min_impurity_decrease 值,则模型将分割节点。

11

min_impurity_split − 浮点数,默认值 = 1e-7

它表示树增长中提前停止的阈值。

12

class_weight − 字典,字典列表,“balanced”或 None,默认值 = None

它表示与类关联的权重。形式为 {class_label: weight}。如果我们使用默认选项,则表示所有类都应该具有权重 1。另一方面,如果选择 class_weight: balanced,它将使用 y 的值来自动调整权重。

13

presort − 布尔值,可选,默认值 = False

它告诉模型是否预先对数据进行排序以加快拟合过程中最佳分割的查找速度。默认值为 false,但如果设置为 true,则可能会减慢训练过程。

属性

下表包含 sklearn.tree.DecisionTreeClassifier 模块使用的属性:

序号 参数及说明
1

feature_importances_ − 形状为 =[n_features] 的数组

此属性将返回特征重要性。

2

classes_: − 形状为 = [n_classes] 的数组或此类数组的列表

它表示类标签,即单输出问题,或类标签数组列表,即多输出问题。

3

max_features_ − 整数

它表示 max_features 参数的推断值。

4

n_classes_ − 整数或列表

它表示类的数量,即单输出问题,或每个输出的类数量列表,即多输出问题。

5

n_features_ − 整数

执行 fit() 方法时,它给出特征的数量。

6

n_outputs_ − 整数

执行 fit() 方法时,它给出输出的数量。

方法

下表包含 sklearn.tree.DecisionTreeClassifier 模块使用的方法:

序号 参数及说明
1

apply(self, X[, check_input])

此方法将返回叶子的索引。

2

decision_path(self, X[, check_input])

顾名思义,此方法将返回树中的决策路径。

3

fit(self, X, y[, sample_weight, …])

fit() 方法将根据给定的训练集 (X, y) 构建决策树分类器。

4

get_depth(self)

顾名思义,此方法将返回决策树的深度。

5

get_n_leaves(self)

顾名思义,此方法将返回决策树的叶子数。

6

get_params(self[, deep])

我们可以使用此方法获取估计器的参数。

7

predict(self, X[, check_input])

它将预测 X 的类值。

8

predict_log_proba(self, X)

它将预测我们提供的输入样本 X 的类对数概率。

9

predict_proba(self, X[, check_input])

它将预测我们提供的输入样本 X 的类概率。

10

score(self, X, y[, sample_weight])

顾名思义,score() 方法将返回给定测试数据和标签上的平均准确率。

11

set_params(self, \*\*params)

我们可以使用此方法设置估计器的参数。

实现示例

下面的 Python 脚本将使用 sklearn.tree.DecisionTreeClassifier 模块构建一个分类器,用于根据我们的数据集预测男性或女性,该数据集具有 25 个样本和两个特征,即“身高”和“头发长度”:

from sklearn import tree
from sklearn.model_selection import train_test_split
X=[[165,19],[175,32],[136,35],[174,65],[141,28],[176,15]
,[131,32],[166,6],[128,32],[179,10],[136,34],[186,2],[12
6,25],[176,28],[112,38],[169,9],[171,36],[116,25],[196,2
5], [196,38], [126,40], [197,20], [150,25], [140,32],[136,35]]
Y=['Man','Woman','Woman','Man','Woman','Man','Woman','Ma
n','Woman','Man','Woman','Man','Woman','Woman','Woman','
Man','Woman','Woman','Man', 'Woman', 'Woman', 'Man', 'Man', 'Woman', 'Woman']
data_feature_names = ['height','length of hair']
X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size = 0.3, random_state = 1)
DTclf = tree.DecisionTreeClassifier()
DTclf = clf.fit(X,Y)
prediction = DTclf.predict([[135,29]])
print(prediction)

输出

['Woman']

我们还可以通过使用以下 python predict_proba() 方法来预测每个类的概率:

示例

prediction = DTclf.predict_proba([[135,29]])
print(prediction)

输出

[[0. 1.]]

决策树回归

在这种情况下,决策变量是连续的。

Sklearn 模块 - Scikit-learn 库提供了名为 DecisionTreeRegressor 的模块,用于将决策树应用于回归问题。

参数

DecisionTreeRegressor 使用的参数与 DecisionTreeClassifier 模块中使用的参数几乎相同。不同之处在于“criterion”参数。对于 DecisionTreeRegressor 模块,‘criterion: 字符串,可选,默认值 = “mse”’ 参数具有以下值:

  • mse − 它代表均方误差。它等于方差减少作为特征选择标准。它使用每个终端节点的平均值来最小化 L2 损失。

  • freidman_mse − 它也使用均方误差,但使用 Friedman 的改进分数。

  • mae − 它代表平均绝对误差。它使用每个终端节点的中位数来最小化 L1 损失。

另一个区别是它没有 ‘class_weight’ 参数。

属性

DecisionTreeRegressor 的属性也与 DecisionTreeClassifier 模块的属性相同。不同之处在于它没有 ‘classes_’‘n_classes_’ 属性。

方法

DecisionTreeRegressor 的方法也与 DecisionTreeClassifier 模块的方法相同。不同之处在于它没有 ‘predict_log_proba()’‘predict_proba()’ 属性。

实现示例

决策树回归模型中的 fit() 方法将采用 y 的浮点值。让我们通过使用 Sklearn.tree.DecisionTreeRegressor 来查看一个简单的实现示例:

from sklearn import tree
X = [[1, 1], [5, 5]]
y = [0.1, 1.5]
DTreg = tree.DecisionTreeRegressor()
DTreg = clf.fit(X, y)

拟合后,我们可以使用此回归模型进行预测:

DTreg.predict([[4, 5]])

输出

array([1.5])
广告
© . All rights reserved.