决策树是机器学习中非常重要的分类算法之一,其直观性和易于理解的特性使得它在许多实际问题中得到了广泛的应用。
决策树学习的 3 个步骤:
- 特征选择是决策树构建中的关键步骤,目的是筛选出与分类结果最相关的特征。常用的准则是信息增益,它衡量特征在分类中的重要性。
- 决策树的生成过程是从根节点开始,计算所有特征的信息增益,选择增益最大的特征作为节点,再根据该特征的取值建立子节点。这个过程会递归进行,直到信息增益很小或没有特征可选。
- 剪枝是为了防止过拟合,通过去除部分不必要的分支,简化决策树结构,从而提高模型的泛化能力。
今天,我们将深入探讨两种经典的决策树算法——ID3(Iterative Dichotomiser 3)和CART(Classification and Regression Tree)算法,并展示如何使用Python构建这两种决策树模型,最后对它们的效果进行对比分析。
什么是ID3算法?
ID3(Iterative Dichotomiser 3)算法是由Ross Quinlan于1986年提出的,它主要用于生成分类决策树。ID3的核心思想是通过信息增益(Information Gain)来选择最优特征进行数据集的划分。信息增益衡量了使用某一特征划分数据集后,数据集的不确定性减少的程度,信息增益越大,表示该特征对分类的帮助越大,因此它被选为决策树的分裂节点。
ID3的算法步骤可以总结为:
- 计算数据集的熵(Entropy),衡量数据集的不确定性。
- 对于每一个特征,计算通过该特征划分数据集后的信息增益。
- 选择信息增益最大的特征作为当前节点的分裂特征。
- 重复上述过程,直到所有数据被完全分类或达到停止条件(例如,所有特征都已经被用过,或者树的深度达到设定的最大值)。
ID3算法的优点是直观、简单,但它也有一些缺点,比如容易过拟合,且无法处理连续特征,需要先进行离散化处理。
什么是CART算法?
CART(Classification and Regression Tree)算法由Breiman等人于1986年提出,它是决策树算法的一个非常重要的变种,既可以用于分类问题,也可以用于回归问题。与ID3不同,CART采用二叉树结构(每个内部节点最多有两个子节点),并且使用基尼系数(Gini Index)作为特征选择的标准。
CART算法的工作原理:
- 分类树:CART在分类问题中选择基尼系数作为数据集的划分标准。基尼系数是衡量数据集纯度的一种度量,它的值越小,表示数据集中的样本越纯。
- 回归树:在回归问题中,CART使用均方误差(MSE)来评估特征的选择。
- 选择使得基尼系数或均方误差最小的特征进行分裂。
- 重复上述过程,直到满足停止条件(例如,树的深度达到设定的最大值,或者节点中的样本数小于预设阈值)。
CART的优势在于其生成的树结构是二叉的,且算法可以处理连续和离散特征,较为灵活和稳定。
数据准备
为了使用ID3和CART算法进行模型构建,首先需要准备好合适的训练数据集。在这里,我们假设有一个贷款审批的数据集,其中包含了几个人的特征和他们是否获得贷款的信息。数据集的字段包括:年龄段、是否有工作、是否有自己的房子、信贷情况和是否批准贷款。
我们首先需要对这些数据进行预处理,将分类变量转换为数字格式。然后,我们可以将数据集分为训练集和测试集,以便进行模型训练和评估。
数据预处理
import pandas as pd
from sklearn.preprocessing import LabelEncoder
from sklearn.metrics import accuracy_score
# 加载Excel数据
df = pd.read_excel('数据表.xlsx', sheet_name='Sheet1')
# 数据预处理 - 将分类变量编码为数字
label_encoders = {}
for column in ['年龄段', '有工作', '有自己的房子', '信贷情况', '类别(是否给贷款)']:
le = LabelEncoder()
df[column] = le.fit_transform(df[column])
label_encoders[column] = le
在这个步骤中,我们利用 LabelEncoder 将每一列的类别特征转化为数字形式,这样模型才可以处理这些数据。
ID3算法实现
ID3算法使用信息增益作为特征选择的标准。信息增益衡量了一个特征在划分数据集时所带来的信息量,信息增益越大,选择该特征作为划分节点的效果就越好。
构建ID3模型
from sklearn.tree import DecisionTreeClassifier, export_text
# 使用ID3算法 (entropy作为标准)
dt_id3 = DecisionTreeClassifier(criterion='entropy', random_state=42)
dt_id3.fit(X_train, y_train)
# 打印决策树规则
tree_rules_id3 = export_text(dt_id3, feature_names=['年龄段', '有工作', '有自己的房子', '信贷情况'])
print("ID3决策树规则:")
print(tree_rules_id3)
# 在测试集上评估
y_pred_id3 = dt_id3.predict(X_test)
accuracy_id3 = accuracy_score(y_test, y_pred_id3)
print(f"\nID3算法测试集准确率: {accuracy_id3:.2f}")
在ID3算法中,我们使用criterion='entropy’来指定采用信息增益标准进行特征选择。模型训练完成后,我们使用export_text打印出决策树的规则。
CART算法实现
CART算法(Classification and Regression Tree)则使用基尼系数作为特征选择标准,基尼系数越小,表示该特征的划分越能减少数据的不纯度。
构建CART模型
# 使用CART算法 (gini作为标准)
dt_cart = DecisionTreeClassifier(criterion='gini', random_state=42)
dt_cart.fit(X_train, y_train)
# 打印决策树规则
tree_rules_cart = export_text(dt_cart, feature_names=['年龄段', '有工作', '有自己的房子', '信贷情况'])
print("CART决策树规则:")
print(tree_rules_cart)
# 在测试集上评估
y_pred_cart = dt_cart.predict(X_test)
accuracy_cart = accuracy_score(y_test, y_pred_cart)
print(f"\nCART算法测试集准确率: {accuracy_cart:.2f}")
与ID3不同,CART算法选择基尼系数作为特征选择标准。训练模型之后,使用export_text打印决策树的规则,并在测试集上评估模型的准确性。
结果分析
编码映射关系
ID3算法结果
模型准确率:1.00
CART算法结果
模型准确率:1.00