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: string,optional,默认="gini"

它代表了衡量分裂质量的函数。支持的标准是“gini”和“entropy”。默认为gini,表示Gini 杂质,而entropy 表示信息增益。

2

splitter: string,optional,默认="best"

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

3

max_depth: int 或 None,optional,默认=None

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

4

min_samples_split: int 或 float,optional,默认=2

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

5

min_samples_leaf: int 或 float, optional,默认=1

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

6

min_weight_fraction_leaf:float,optional,默认=0。

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

7

max_features: int, float, string 或 None,optional,默认=None

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

8

random_state: int, RandomState instance或None,optional,默认= none

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

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

  • RandomState instance: 在这种情况下,random_state 是随机数生成器。

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

9

max_leaf_nodes: int 或 None,optional,默认=None

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

10

min_impurity_decrease:float,optional,默认=0。

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

11

min_impurity_split: float,默认=1e-7

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

12

class_weight: dict 或 list of dicts,“balanced”或 None,默认= None

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

13

presort: bool,optional,默认=False

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

属性

下表由sklearn.tree.DecisionTreeClassifier模块使用的属性组成:

序号参数及说明
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()方法时的 features 数量。

6

n_outputs_: int

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

方法

下表是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])

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

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,\*\*参数)

我们可以用这个方法设置estimator的参数。

示例

下面的Python脚本将使用sklearn.tree.DecisionTreeClassifier模块来构建一个分类器,用于从我们的数据集中预测男性或女性,该数据集有25个样本和两个特征,即 "height"和 "length of hair”:

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: string, optional default= "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])