摘要:决策树是一种基于树形结构的分类和预测算法,通过递归拆分数据生成决策规则。它分为分类树(用于类别预测)和回归树(用于数值预测)两种类型,使用基尼指数或信息增益作为分割标准。算法通过计算基尼分数、拆分数据集和评估所有分割来构建树结构,最终形成由决策节点和终端节点组成的预测模型。Python实现中可利用scikit-learn库加载鸢尾花数据集,训练决策树分类器并评估准确率,还能可视化树结构。该算法简单直观,适合处理分类问题,但需注意过拟合风险。
目录
决策树算法的类型
决策树算法的实现
基尼指数
分裂创作
建树
第一部分:终端节点的创建
第二部分:递归拆分
预测
假设
Python 实现
完整实现示例
决策树算法是一种基于层次树的算法,用于根据一组规则对结果进行分类或预测。它的工作原理是根据输入特征的值将数据拆分为子集。该算法递归地拆分数据,直到达到一个点,使每个子集的数据属于同一类或目标变量的值相同。由此生成的树是一组决策规则,可用于进行预测或分类新数据。
决策树算法通过选择最佳特征来在每个节点分割数据。最好的特征是能带来最多信息增益或最多熵减少的特征。信息增益是通过在特定特征处拆分数据所获得的信息量,而熵则是数据随机性或无序性的度量。算法利用这些指标确定最佳特征 在每个节点分割数据。
以下给出的二叉树示例,用于预测一个人是否适合,提供年龄、饮食习惯和锻炼习惯等多种信息——
在上述决策树中,问题是决策节点,最终结果是叶子。
决策树算法的类型
决策树算法主要有两种类型 −
分类树− 分类树用于将数据分类为不同的类别或类别。它的工作原理是根据输入特征的值将数据划分为子集,并将每个子集分配给不同的类别。
回归树− 回归树用于预测数值或连续变量。它的工作原理是根据输入特征的值将数据划分为子集,并为每个子集分配一个数值。
决策树算法的实现
基尼指数
它是用于评估数据集中二元分裂的成本函数名称,并与类别目标变量成功或失败相关。
基尼指数越高,均匀性越高。完美的基尼指数值为0,最差值为0.5(对于2类问题)。分裂的基尼指数可以通过以下步骤计算 −
首先,利用公式p^2+q^2计算子节点的基尼指数,这是成功与失败概率的平方和。
接着,利用该分段中每个节点的加权基尼得分计算分裂的基尼指数。
分类与回归树(CART)算法使用基尼方法生成二元分割。
分裂创作
拆分基本上就是在数据集中包含一个属性和一个值。我们可以通过以下三个部分创建数据集分割 −
第一部分:基尼得分计算 − 我们刚在上一节讨论过这一部分。
第二部分:拆分数据集− 可以定义为将数据集分为两行列表,每个行的索引为属性,并有该属性的拆分值。在从数据集中获得右组和左组后,我们可以利用第一部分计算的基尼分数来计算分裂的值。拆分值将决定属性属于哪个组。
第三部分:评估所有拆分− 在找到基尼分数并拆分数据集后,下一步是评估所有拆分。为此,首先我们必须将每个属性关联的每个值作为候选拆分进行检查。然后我们需要通过评估拆分成本来找到最佳的拆分方案。最佳分割将作为决策树中的节点使用。
建树
我们知道树有根节点和终端节点。创建根节点后,我们可以通过以下两部分 − 构建树
第一部分:终端节点的创建
在创建决策树的终端节点时,一个重要点是决定何时停止增长树或创建更多终端节点。它可以通过两个标准实现,即最大树深度和最小节点记录数,具体如下 −
最大树深度− 顾名思义,是树中根节点之后节点的最大数量。一旦树达到最大深度,即树拥有最大终端节点数,我们必须停止添加终端节点。
最小节点记录− 它可以定义为给定节点负责的最少训练模式数量。一旦树达到这些最小节点记录或以下,我们必须停止添加终端节点。
终端节点用于最终预测。
第二部分:递归拆分
当我们理解了何时创建终端节点后,现在可以开始构建我们的树了。递归拆分是一种构建树的方法。在这种方法中,一旦创建了节点,我们可以递归地在每个数据组上创建子节点(添加到现有节点上的节点),这些数据是通过拆分数据集生成的,通过反复调用同一个函数。
预测
构建决策树后,我们需要对其做出预测。基本上,预测涉及在决策树中导航,并使用特定的数据行。
我们可以像上面一样,借助递归函数做出预测。同样的预测例程会再次调用左节点或子节点。
假设
以下是我们在创建决策树时所做的一些假设 −
在准备决策树时,训练集作为根节点。
决策树分类器倾向于特征值为类别。如果你想使用连续值,那么在建模之前必须先进行离散化。
基于属性值,记录被递归分布。
统计方法将用于将属性放置在根节点 i.e.as 内部节点的任何节点位置。
Python 实现
让我们用一个流行的分类任务数据集 Iris 数据集,在 Python 中实现决策树算法。其中包含150朵鸢尾花样本,每种花具有四个特征:萼片长度、萼片宽度、花瓣长度和花瓣宽度。花朵分为三个纲:长花、绿花和维吉尼亚。
首先,我们导入必要的库并加载数据集 −
import numpy as np from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.tree import DecisionTreeClassifier # Load the iris dataset iris = load_iris() # Split the dataset into training and testing sets X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.3, random_state=0)然后我们创建一个决策树分类器的实例,并用训练集 − 进行训练
# Create a Decision Tree classifier dtc = DecisionTreeClassifier() # Fit the classifier to the training data dtc.fit(X_train, y_train)我们现在可以使用训练好的分类器对测试集 − 进行预测
# Make predictions on the testing data y_pred = dtc.predict(X_test)我们可以通过计算分类器的准确性 − 来评估其性能
# Calculate the accuracy of the classifier accuracy = np.sum(y_pred == y_test) / len(y_test) print("Accuracy:", accuracy)我们可以用 Matplotlib 库 − 可视化决策树
import matplotlib.pyplot as plt from sklearn.tree import plot_tree # Visualize the Decision Tree using Matplotlib plt.figure(figsize=(20,10)) plot_tree(dtc, filled=True, feature_names=iris.feature_names, class_names=iris.target_names) plt.show()sklearn.tree模块中的plot_tree函数可用于绘制决策树。我们可以输入训练好的决策树分类器,填充参数填充节点颜色,feature_names参数标记特征,以及标记目标类的class_names参数。我们还指定了figsize参数 设置图形大小并调用显示函数以显示图表。
完整实现示例
以下是使用 iris 数据集 − 的完整示例,使用 Python 中
import numpy as np from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.tree import DecisionTreeClassifier # Load the iris dataset iris = load_iris() # Split the dataset into training and testing sets X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.3, random_state=0) # Create a Decision Tree classifier dtc = DecisionTreeClassifier() # Fit the classifier to the training data dtc.fit(X_train, y_train) # Make predictions on the testing data y_pred = dtc.predict(X_test) # Calculate the accuracy of the classifier accuracy = np.sum(y_pred == y_test) / len(y_test) print("Accuracy:", accuracy) # Visualize the Decision Tree using Matplotlib import matplotlib.pyplot as plt from sklearn.tree import plot_tree plt.figure(figsize=(20,10)) plot_tree(dtc, filled=True, feature_names=iris.feature_names, class_names=iris.target_names) plt.show()输出
这将生成一个如下的决策树图——
Accuracy: 0.9777777777777777
如你所见,图中展示了决策树的结构,每个节点代表基于特征值的决策,每个叶节点代表一个类别或数值。每个节点的颜色表示该节点样本的多数类别或数值,底部的数字表示到达该节点的样本数量。