机器学习-决策树

发布于:2025-09-07 ⋅ 阅读:(18) ⋅ 点赞:(0)

​一、基础认知​

​1.1 什么是决策树?​

  • ​本质​​:模拟人类决策过程的树形结构
  • ​组成​​:
  • ​实例​​:相亲决策流程
    年龄 > 30? → 是 → 拒绝
            ↓ 否
    收入 > 50万? → 是 → 接受
            ↓ 否
    公务员? → 是 → 接受
            ↓ 否 → 拒绝

​1.2 核心概念对比​

​概念​ ​ID3决策树​ ​C4.5决策树​ ​CART决策树​
​分裂依据​ 信息增益最大 信息增益率最大 基尼指数最小
​树结构​ 多叉树 多叉树 二叉树
​支持任务​ 分类 分类 分类+回归
​缺陷​ 偏向多值特征 计算复杂度高 只能二叉树分裂

​二、核心数学原理(附图解)​

​2.1 信息熵:混乱度度量​

  • ​公式​​:
  • ​实例​​:
    数据集A:[A,B,C,D] → 熵 = -4×(1/4)×log₂(1/4) = 2.0
    数据集B:[A,A,A,B] → 熵 = -[(3/4)log₂(3/4)+(1/4)log₂(1/4)] ≈ 0.81

    ​结论​​:数据越纯净,熵值越小

​2.2 信息增益(ID3核心)​

  • ​计算流程​​:
    1. 计算父节点熵值 H(D)
    2. 按特征分裂后计算子节点加权熵 ∑(子样本数/总样本数)×H(子)
    3. 信息增益 = H(D) - 子节点加权熵
  • ​实例演算​​(7人拖欠贷款数据集):
    特征\结果 拖欠(Yes) 不拖欠(No) 计算
    ​有房​ 0 3 熵=0
    ​无房​ 3 4 熵≈0.985
    ​信息增益​​ = 0.985 - (3/10)×0 + (7/10)×0.985 ≈ 0.69

​2.3 信息增益率(C4.5核心)​

  • ​公式​​:
  • ​修正原理​​:
    特征“邮编”有1000个取值 → 固有值很大 → 增益率变小 
    特征“性别”有2个取值 → 固有值小 → 增益率保留

​2.4 基尼指数(CART核心)​

  • ​公式​​:
  • ​物理意义​​:随机抽两个样本,类别不一致的概率
  • ​实例​​:
    数据集[3个A,7个B]: 
    Gini = 1 - [(3/10)² + (7/10)²] = 0.42

​三、实战案例详解​

​3.1 泰坦尼克生存预测(分类树)​

import pandas as pd
from sklearn.tree import DecisionTreeClassifier

# 数据预处理
titanic = pd.read_csv('titanic.csv')
titanic['Age'].fillna(titanic['Age'].mean(), inplace=True)  # 年龄缺失值填充
X = pd.get_dummies(titanic[['Pclass', 'Age', 'Sex']])       # 独热编码
y = titanic['Survived']

# 模型训练与评估
model = DecisionTreeClassifier(criterion='gini', max_depth=3) 
model.fit(X_train, y_train)
print(f"准确率: {model.score(X_test, y_test):.2%}")

# 决策树可视化
from sklearn.tree import plot_tree
plot_tree(model, feature_names=X.columns, class_names=['Died','Survived'])

​关键输出​​:

              precision    recall  f1-score   support
        Died       0.83      0.91      0.87       105
    Survived       0.82      0.68      0.74        69
    accuracy                           0.83       174

​3.2 房价预测(回归树)​

from sklearn.tree import DecisionTreeRegressor

# 生成波形数据
X = np.sort(5 * np.random.rand(80, 1), axis=0)
y = np.sin(X).ravel() + np.random.normal(0, 0.1, X.shape[0])

# 不同深度树对比
regr_1 = DecisionTreeRegressor(max_depth=2)
regr_2 = DecisionTreeRegressor(max_depth=5)
regr_1.fit(X, y)
regr_2.fit(X, y)

# 可视化预测曲线
plt.plot(X_test, regr_1.predict(X_test), label="深度=2")
plt.plot(X_test, regr_2.predict(X_test), label="深度=5")

​结论​​:树深度越大,拟合能力越强(过拟合风险越高)


​四、剪枝技术解析​

​4.1 为什么要剪枝?​

  • ​过拟合现象​​:训练准确率99% → 测试准确率70%
  • ​根本原因​​:树过于复杂,学习了噪声数据

​4.2 剪枝方法对比​

​类型​ ​操作时机​ ​优点​ ​缺点​
预剪枝 树生成过程中 训练快,减少计算资源 可能欠拟合(早停问题)
后剪枝 生成完整树后 保留更多有效分支 计算开销大

​4.3 剪枝效果演示​

# 未剪枝 vs 预剪枝对比
full_tree = DecisionTreeClassifier()  # 无限制
pruned_tree = DecisionTreeClassifier(max_depth=3, min_samples_leaf=5) 

full_tree.fit(X_train, y_train)
pruned_tree.fit(X_train, y_train)

print(f"未剪枝测试集准确率: {full_tree.score(X_test, y_test):.2%}")
print(f"预剪枝测试集准确率: {pruned_tree.score(X_test, y_test):.2%}")

​典型输出​​:

未剪枝测试集准确率:76.34% 
预剪枝测试集准确率:82.15%  # 剪枝后泛化能力提升

​五、高频面试题解析​
  1. ​信息增益 vs 信息增益率​

    信息增益偏向多值特征(如“ID”字段),增益率通过除以特征固有值修正此问题

  2. ​CART为何用基尼指数?​

    基尼指数计算只需加减乘(熵需要log运算),在大数据场景效率更高

  3. ​如何处理连续特征?​

    步骤:
    1. 排序特征值:[10, 20, 30, 40]
    2. 计算候选切分点:(10+20)/2=15, (20+30)/2=25...
    3. 选择最优切分点(基尼指数最小)
  4. ​决策树优缺点​
    ​优点​​:可解释性强、无需特征缩放、支持混合数据类型
    ​缺点​​:容易过拟合、对样本敏感、忽略特征间相关性


​六、学习资源推荐​
  1. ​实践平台​​:Kaggle Titanic竞赛(决策树基线模型)
  2. ​可视化工具​​:
  3. ​进阶方向​​:
    • 集成学习:随机森林、GBDT
    • 特征重要性分析:model.feature_importances_

网站公告

今日签到

点亮在社区的每一天
去签到