共计 1547 个字符,预计需要花费 4 分钟才能阅读完成。
1. 决策树算法简介
决策树是一种经典的机器学习算法,它通过树状结构对数据进行分类或回归。就像我们日常生活中做决策一样,决策树也通过一系列的判断条件来得出结论。

决策树最常见的应用场景包括:
- 客户分类(如判断客户是否会购买产品)
- 医疗诊断(如根据症状判断疾病)
- 信用评估(如判断贷款申请是否通过)
- 工业故障检测
2. Cart 决策树构建过程详解
2.1 基尼系数
Cart 决策树使用基尼系数 (Gini Index) 来衡量数据的不纯度。基尼系数越小,数据越纯。计算公式为:
$$Gini = 1 – \sum_{i=1}^{k} p_i^2$$
其中 $p_i$ 是第 i 类样本在数据集中所占的比例。
2.2 特征选择
选择最佳分裂特征的步骤如下:
- 计算当前数据集的基尼系数
- 对每个特征,计算按该特征分裂后的加权基尼系数
- 选择使基尼系数下降最多的特征作为分裂特征
2.3 递归构建决策树
完整构建流程:
- 从根节点开始,计算所有特征的基尼系数
- 选择最佳分裂特征和分裂点
- 将数据集分成两个子集
- 对每个子集递归执行上述步骤,直到:
- 所有样本属于同一类别
- 没有更多特征可用于分裂
- 达到预设的树深度
3. Python 实现示例
from sklearn.tree import DecisionTreeClassifier, export_text
import pandas as pd
# 示例数据
data = {'年龄': ['青年', '青年', '中年', '老年', '老年', '老年', '中年'],
'有工作': ['否', '否', '是', '是', '否', '否', '否'],
'有房': ['否', '否', '否', '是', '否', '否', '否'],
'信用': ['一般', '好', '好', '一般', '一般', '好', '好'],
'类别': ['否', '否', '是', '是', '是', '否', '是']
}
df = pd.DataFrame(data)
# 将分类变量转换为数值
for col in df.columns:
df[col] = df[col].astype('category').cat.codes
# 构建决策树
X = df.drop('类别', axis=1)
y = df['类别']
clf = DecisionTreeClassifier(criterion='gini', max_depth=3)
clf.fit(X, y)
# 输出决策树规则
tree_rules = export_text(clf, feature_names=list(X.columns))
print(tree_rules)
4. 决策树的优缺点
优点:
- 易于理解和解释,可视化直观
- 数据预处理要求低(可以处理缺失值、不需要标准化)
- 可以同时处理数值和分类特征
- 计算复杂度相对较低
缺点:
- 容易过拟合,需要剪枝
- 对数据的小变化敏感(可能生成完全不同的树)
- 倾向于选择特征值多的特征
- 在处理特征间有高度相关性时表现不佳
5. 最佳实践与常见问题
最佳实践:
- 数据预处理:
- 处理缺失值(决策树本身可以处理,但显式处理更好)
- 对分类特征进行编码
-
考虑特征重要性
-
参数调优:
- max_depth:控制树的最大深度
- min_samples_split:节点分裂所需的最小样本数
- min_samples_leaf:叶节点所需的最小样本数
常见问题解决方案:
- 过拟合:使用剪枝或设置更严格的停止条件
- 类别不平衡:使用 class_weight 参数
- 计算基尼系数时遇到零值:这是正常情况,表示完全纯净
6. 结语与思考题
通过本文,我们详细讲解了 Cart 决策树的构建过程,从基尼系数的计算到最终的树结构生成。决策树作为机器学习的基础算法,理解其原理对学习更复杂的模型大有裨益。
思考题:
1. 如果数据集中的特征既有连续值又有离散值,该如何处理?
2. 当特征之间存在强相关性时,决策树会有什么表现?
3. 尝试在 Iris 数据集上应用 Cart 算法,观察不同参数对结果的影响。
正文完
发表至: 未分类
近两天内
