Scikit Learn - 决策树


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

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

决策树算法

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

ID3

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

它让树生长到最大尺寸,然后为了提​​高树处理未见数据的能力,应用修剪步骤。该算法的输出将是多路树。

C4.5

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

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

C5.0

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

大车

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

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

用决策树分类

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

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

参数

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

先生编号 参数及说明
1

标准- 字符串,可选默认=“基尼”

它代表衡量分割质量的函数。支持的标准是“基尼”和“熵”。默认为基尼系数,用于基尼杂质,而熵用于信息增益。

2

splitter - 字符串,可选默认=“最佳”

它告诉模型,从“最佳”或“随机”策略中选择每个节点的分割。

3

max_depth - int 或 None,可选默认值=None

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

4

min_samples_split - int、float、可选默认=2

该参数提供了分割内部节点所需的最小样本数。

5

min_samples_leaf - int、float、可选默认=1

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

6

min_weight_fraction_leaf - 浮点数,可选,默认值=0。

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

7

max_features - int、float、string 或 None,可选默认=None

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

8

random_state - int,RandomState 实例或 None,可选,默认 = none

该参数表示在混洗数据时使用的生成的伪随机数的种子。以下是选项 -

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

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

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

9

max_leaf_nodes - int 或 None,可选默认值 = None

此参数将以最佳优先的方式生长一棵具有 max_leaf_nodes 的树。默认值为 none,这意味着叶节点的数量不受限制。

10

min_impurity_decrease - 浮点数,可选,默认值=0。

该值作为节点分裂的标准,因为如果该分裂导致杂质减少大于或等于min_impurity_decrease value ,则模型将分裂节点。

11

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

它代表树木生长早期停止的阈值。

12

class_weight - 字典,字典列表,“平衡”或无,默认=无

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

13

presort - bool,可选默认=False

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

属性

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

先生编号 参数及说明
1

feature_importances_ − 形状数组 =[n_features]

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

2

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

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

3

max_features_ - int

它表示 max_features 参数的推导值。

4

n_classes_ - 整数或列表

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

5

n_features_ - int

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

6

n_outputs_ - int

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

方法

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

先生编号 参数及说明
1

应用(自我,X [,check_input])

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

2

Decision_path(自身,X[,check_input])

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

3

适合(自身,X,y[,样本权重,...])

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

4

获取深度(自身)

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

5

get_n_leaves(自己)

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

6

get_params (self[, 深])

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

7

预测(自身,X[,check_input])

它将预测 X 的类别值。

8

Predict_log_proba(自身,X)

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

9

Predict_proba(自身,X[,check_input])

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

10

分数(自身,X,y[,样本权重])

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

11

set_params (自身, \*\*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 - 它也使用均方误差,但使用弗里德曼的改进分数。

  • 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])