Scikit Learn - 决策树

在本章中,我们将学习 Sklearn 中的一种学习方法,即决策树。

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

决策树算法

以下将解释不同的决策树算法 −

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 模块使用的参数 −

Sr.No 参数及说明
1

criterion − 字符串,可选,默认值为 "gini"

该函数用于衡量分割质量。支持的criterion包括"gini"和"entropy"。默认值为gini,表示基尼不纯度,而entropy表示信息增益。

2

splitter −字符串,可选,默认值为"best"

它告诉模型,在每个节点上选择哪种策略(从"best"到"random")。

3

max_depth − int 或 None,可选,默认值为 None

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

4

min_samples_split − int,浮点型,可选,默认值:2

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

5

min_samples_leaf − int,浮点型,可选,默认值:1

此参数指定位于叶节点所需的最小样本数。

6

min_weight_fraction_leaf −浮点型,可选,默认值为 0。

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

7

max_features 最小值,整数,浮点型,字符串或 None,可选,默认值为 None

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

8

random_state 最小值,整数,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 值,模型将分裂该节点。

11

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

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

12

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

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

13

presort − bool,可选,默认值为 False

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

属性

下表列出了 sklearn.tree.DecisionTreeClassifier 模块使用的属性 −

Sr.No 参数及说明
1

feature_importances_ −形状为 [n_features] 的数组

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

2

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

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

3

max_features_ − int

它表示 max_features 参数的推导值。

4

n_classes_ − int 或 list

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

5

n_features_ − int

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

6

n_outputs_ − int

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

方法

下表列出了 sklearn.tree.DecisionTreeClassifier 模块使用的方法 −

Sr.No 参数 &说明
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])