首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >七天学完十大机器学习经典算法-03.决策树:人类思考的算法实现

七天学完十大机器学习经典算法-03.决策树:人类思考的算法实现

作者头像
熊猫钓鱼
发布2025-08-01 18:24:56
发布2025-08-01 18:24:56
3850
举报
文章被收录于专栏:人工智能应用人工智能应用

接上一篇《七天学完十大机器学习经典算法-02.逻辑回归:从概率到决策的智慧

本文是机器学习可解释性最强的算法,通过医疗诊断、金融风控等真实案例,揭示决策树如何像人类一样逐步推理。无需数学公式,初中生也能轻松理解!

一、为什么决策树是"最像人脑"的算法?

想象你要判断是否贷款给某人:

代码语言:javascript
复制
 年收入 > 50万? 
   → 是 → 查看信用分
      → 信用分 > 700? 
         → 是 → 批准
         → 否 → 拒绝
   → 否 → 查看抵押物
      → 有房产? 
         → 是 → 批准
         → 否 → 拒绝

这正是决策树的工作方式! 它通过一系列是/否问题模拟人类决策过程。

行业应用统计

  • 医疗诊断:85%的临床决策支持系统使用决策树
  • 金融风控:信用卡审批的核心算法
  • 制造业:产品缺陷根源分析工具

二、决策树本质:问答游戏的算法实现
生活案例1:买西瓜决策

特征

好瓜(1)

坏瓜(0)

纹理

清晰

8

2

模糊

1

9

敲声

清脆

9

1

沉闷

2

8

人类决策逻辑

  1. 先看纹理:清晰的瓜80%是好瓜
  2. 若纹理模糊:直接判坏瓜(准确率90%)
  3. 若纹理清晰:再听敲声
    • 清脆→好瓜(90%概率)
    • 沉闷→坏瓜(80%概率)

三、核心问题:如何选择最佳提问顺序?
关键指标1:信息熵(混乱度度量)
Entropy(S) = -\sum_{i=1}^{c} p_i \log_2 p_i
Entropy(S) = -\sum_{i=1}^{c} p_i \log_2 p_i
  • S:当前数据集
  • pᵢ:第i类样本的比例

案例计算(买瓜数据集):

  • 初始状态(10好瓜+10坏瓜):

Entropy = - [0.5*log₂(0.5) + 0.5*log₂(0.5)] = 1

  • 按纹理清晰分割后:
    • 清晰组(8好+2坏):Entropy = 0.72
    • 模糊组(1好+9坏):Entropy = 0.47
关键指标2:信息增益
Gain(S, A) = Entropy(S) - \sum_{v \in A} \frac{|S_v|}{|S|} Entropy(S_v)
Gain(S, A) = Entropy(S) - \sum_{v \in A} \frac{|S_v|}{|S|} Entropy(S_v)
  • A:待测试特征(如纹理)
  • Sᵥ:特征A取值为v的子集

纹理特征的信息增益

Gain = 1 - [ (10/20)*0.72 + (10/20)*0.47 ] = 0.405
Gain = 1 - [ (10/20)*0.72 + (10/20)*0.47 ] = 0.405
对比测试:敲声特征
  • 清脆组(9好+1坏):Entropy=0.47
  • 沉闷组(2好+8坏):Entropy=0.72
Gain = 1 - [ (10/20)*0.47 + (10/20)*0.72 ] = 0.405
Gain = 1 - [ (10/20)*0.47 + (10/20)*0.72 ] = 0.405

发现:纹理和敲声增益相同?此时需用基尼系数作为第二标准!


四、决策树构建全流程
算法步骤:
  1. 从根节点开始,计算所有特征的信息增益
  2. 选择增益最大的特征作为分裂点
  3. 按特征值划分数据集,创建子节点
  4. 对每个子节点递归执行步骤1-3,直到:
    • 节点样本全属同一类
    • 特征用完
    • 达到最大深度
停止条件设置(防过拟合):
代码语言:javascript
复制
from sklearn.tree import DecisionTreeClassifier

# 关键参数
model = DecisionTreeClassifier(
    max_depth=3,       # 树的最大深度
    min_samples_split=10, # 节点继续分裂的最小样本数
    min_samples_leaf=5,  # 叶节点的最小样本数
    max_features=5      # 每次分裂考虑的最大特征数
)
五、Python实战:预测泰坦尼克生存率
数据集:乘客生存状态
代码语言:javascript
复制
import pandas as pd
from sklearn.tree import plot_tree

# 加载数据
titanic = pd.read_csv("titanic.csv")
print(titanic.columns)
# ['PassengerId','Survived','Pclass','Name','Sex','Age','SibSp','Parch','Ticket','Fare','Cabin','Embarked']
特征工程:
代码语言:javascript
复制
# 1. 提取有用特征
features = ['Pclass', 'Sex', 'Age', 'SibSp', 'Parch', 'Fare', 'Embarked']

# 2. 处理缺失值
titanic['Age'].fillna(titanic['Age'].median(), inplace=True)

# 3. 类别特征编码
titanic['Sex'] = titanic['Sex'].map({'male':0, 'female':1})
titanic = pd.get_dummies(titanic, columns=['Embarked'])

# 4. 创建决策树模型
X = titanic[['Pclass','Sex','Age','SibSp','Parch','Fare','Embarked_C','Embarked_Q','Embarked_S']]
y = titanic['Survived']
训练与可视化:
代码语言:javascript
复制
model = DecisionTreeClassifier(max_depth=3, random_state=42)
model.fit(X, y)

# 可视化决策树(需安装graphviz)
plt.figure(figsize=(15,10))
plot_tree(model, 
          feature_names=X.columns,
          class_names=['Died','Survived'],
          filled=True, 
          rounded=True)
plt.savefig('titanic_tree.png')
决策规则解读:
  1. 首要判断性别:女性优先逃生(根节点)
  2. 女性中:舱位等级>1.5(即三等舱)→ 死亡率升高
  3. 男性中:年龄≤6.5的儿童优先获救

六、高级进化:森林的力量
单棵决策树的问题:
  • 对训练数据过拟合
  • 小数据变动导致结构剧变
  • 忽略特征间交互
解决方案:随机森林
Python实现:
代码语言:javascript
复制
from sklearn.ensemble import RandomForestClassifier

rf = RandomForestClassifier(
    n_estimators=100,  # 100棵决策树
    max_depth=5,
    max_features=3,    # 每棵树随机选3个特征
    random_state=42
)
rf.fit(X_train, y_train)
print("准确率:", rf.score(X_test, y_test))  # 通常比单棵树高5-10%
七、工业级优化技巧
1. 特征工程(效果提升关键)

分箱处理:将连续变量离散化

代码语言:javascript
复制
titanic['AgeGroup'] = pd.cut(titanic['Age'], 
                            bins=[0,12,18,60,100],
                            labels=['Child','Teen','Adult','Elder'])

组合特征:挖掘特征间关系

代码语言:javascript
复制
titanic['FamilySize'] = titanic['SibSp'] + titanic['Parch']
titanic['IsAlone'] = (titanic['FamilySize'] == 0).astype(int)
2. 类别不平衡处理
代码语言:javascript
复制
# 调整类别权重
model = DecisionTreeClassifier(
    class_weight={0:1, 1:2}  # 更关注少数类(生存者)
)

# 或使用SMOTE过采样
from imblearn.over_sampling import SMOTE
smote = SMOTE()
X_res, y_res = smote.fit_resample(X, y)
3. 决策树剪枝(防过拟合)
代码语言:javascript
复制
# 代价复杂度剪枝
model = DecisionTreeClassifier(ccp_alpha=0.02)  # 越大剪枝越狠

# 剪枝效果对比
plt.figure()
model.fit(X_train, y_train)
plot_tree(model)  # 对比未剪枝的树更简洁
八、避坑指南:常见误区解析
误区1:决策树不需要特征缩放

真相:对连续变量分裂有影响!

代码语言:javascript
复制
# 错误做法:直接使用未标准化的年龄和票价
# 正确方案:标准化连续特征
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X[['Age','Fare']] = scaler.fit_transform(X[['Age','Fare']])
误区2:决策树不能处理缺失值

解决方案

代码语言:javascript
复制
# 方法1:分裂时增加缺失值分支
model = DecisionTreeClassifier(splitter='best')

# 方法2:用模型预测缺失值
from sklearn.impute import KNNImputer
imputer = KNNImputer()
X_imputed = imputer.fit_transform(X)
误区3:树越深效果越好

过拟合风险:深度=10的树在训练集准确率99%,测试集仅70%

调试技巧

代码语言:javascript
复制
# 绘制学习曲线
train_scores, test_scores = [], []
depths = range(1, 15)
for depth in depths:
    model.set_params(max_depth=depth)
    model.fit(X_train, y_train)
    train_scores.append(model.score(X_train, y_train))
    test_scores.append(model.score(X_test, y_test))

# 找到测试集峰值对应的深度
optimal_depth = depths[np.argmax(test_scores)]
九、决策树 vs. 其他算法

场景

推荐算法

决策树优势

需要模型解释性

决策树

可视化决策路径

高维稀疏数据

线性模型

不受特征维度影响

图像/语音识别

深度学习

处理非结构化数据更强

金融风控

随机森林

更高的准确率和稳定性

经验法则:当需要向业务方解释模型逻辑时,决策树是首选
十、决策树知识框架
十一、实战:糖尿病预测系统
代码语言:javascript
复制
# 完整项目代码
import pandas as pd
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report

# 加载数据集
data = pd.read_csv('diabetes.csv')

# 特征选择
features = ['Pregnancies','Glucose','BloodPressure','SkinThickness',
            'Insulin','BMI','DiabetesPedigreeFunction','Age']
X = data[features]
y = data['Outcome']

# 划分数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

# 创建模型
model = DecisionTreeClassifier(
    max_depth=4,
    min_samples_leaf=5,
    class_weight='balanced'
)

# 训练与评估
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
print(classification_report(y_test, y_pred))

# 特征重要性可视化
plt.barh(features, model.feature_importances_)
plt.title('Feature Importance')

关键输出

代码语言:javascript
复制
              precision    recall  f1-score   support
           0       0.83      0.85      0.84       107
           1       0.68      0.65      0.67        52
    accuracy                           0.78       159
总结:决策树的智慧
  1. 可解释性:白盒模型,决策过程透明
  2. 非参数特性:不需要假设数据分布
  3. 多数据类型支持:同时处理数值和类别特征
  4. 特征重要性:自动识别关键影响因素

人类思考的算法映射:决策树将人类分步决策的过程数学化,是连接人脑与AI的桥梁

创作不易,如有收获请点🌟收藏加关注,谢谢各位兄弟,祝前程似锦!!

下期预告:《七天学完十大机器学习经典算法-04.随机森林:群众智慧的机器学习实践》

上一篇《七天学完十大机器学习经典算法-02.逻辑回归:从概率到决策的智慧

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-06-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、为什么决策树是"最像人脑"的算法?
  • 二、决策树本质:问答游戏的算法实现
    • 生活案例1:买西瓜决策
  • 三、核心问题:如何选择最佳提问顺序?
    • 关键指标1:信息熵(混乱度度量)
    • 关键指标2:信息增益
    • 对比测试:敲声特征
  • 四、决策树构建全流程
    • 算法步骤:
    • 停止条件设置(防过拟合):
  • 五、Python实战:预测泰坦尼克生存率
    • 数据集:乘客生存状态
    • 特征工程:
    • 训练与可视化:
    • 决策规则解读:
  • 六、高级进化:森林的力量
    • 单棵决策树的问题:
    • 解决方案:随机森林
    • Python实现:
  • 七、工业级优化技巧
    • 1. 特征工程(效果提升关键)
    • 2. 类别不平衡处理
    • 3. 决策树剪枝(防过拟合)
  • 八、避坑指南:常见误区解析
    • 误区1:决策树不需要特征缩放
    • 误区2:决策树不能处理缺失值
    • 误区3:树越深效果越好
  • 九、决策树 vs. 其他算法
  • 经验法则:当需要向业务方解释模型逻辑时,决策树是首选
  • 十、决策树知识框架
  • 十一、实战:糖尿病预测系统
  • 总结:决策树的智慧
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档