当前位置: 首页 > news >正文

十四天机器学习入门——决策树与随机森林:从零构建智慧决策模型

当银行用30秒判定你的贷款申请,当电商预测你明天会买什么商品,当医院快速识别癌细胞——背后可能都藏着一片“决策森林”。本文将用最直观的方式,带你看懂这些改变世界的技术。

第一章 决策树:机器学习的“流程图”

1.1 什么是决策树?

想象你要判断水果类型:

这就是决策树!它通过一系列是/否问题,最终到达决策结果(叶子节点)。

1.2 核心构建三要素
  1. 节点分裂依据:选择最佳问题

  2. 停止条件:何时不再分裂

  3. 叶子节点赋值:最终决策结果

1.3 关键数学原理(无公式版)
  • 基尼系数:衡量节点“纯度”

    • 值越小越好(理想值0)

    • 如:全是苹果的节点基尼=0

  • 信息增益:衡量问题价值

    • 增益越大问题越好

第二章 手把手构建决策树

案例:预测银行贷款违约(简化数据集)
年龄收入(万)有房信用评级是否违约
青年8一般
中年20优秀
老年12良好
青年5一般
步骤1:选择根节点问题

计算每个特征的信息增益:

# 伪代码演示逻辑
def calc_gain(data, feature):原始熵 = 计算整体混乱度按特征分割后熵 = 计算各子集熵的加权平均return 原始熵 - 分割后熵# 实际增益结果:
增益(年龄) = 0.15
增益(收入) = 0.32  # 最高 → 选为根节点
增益(有房) = 0.29
增益(信用) = 0.21

解读

  • 高收入群体违约风险低(10%)

  • 低收入无房群体违约风险极高(90%)

步骤3:Python实战(10行代码)
from sklearn.tree import DecisionTreeClassifier, plot_tree# 1. 数据转换(字符转数字)
data['有房'] = data['有房'].map({'是':1, '否':0})# 2. 定义特征和标签
X = data[['收入','有房']]
y = data['是否违约']# 3. 训练决策树
model = DecisionTreeClassifier(max_depth=2)  # 限制深度防过拟合
model.fit(X, y)# 4. 可视化树
plot_tree(model, feature_names=['Income','House']) 

运行结果将显示与上图一致的可视化树


第三章 决策树的软肋与进化

3.1 单棵树的致命缺陷
  • 过拟合问题:对训练数据“死记硬背”

# 不加限制的树会完美拟合训练数据
overfit_tree = DecisionTreeClassifier()  # 无参数限制
overfit_tree.fit(X_train, y_train)print("训练集准确率:", overfit_tree.score(X_train, y_train))  # 100%
print("测试集准确率:", overfit_tree.score(X_test, y_test))    # 可能只有65%
3.2 三大改进方向
方法原理效果
剪枝(Pruning)删除不重要的分支减少过拟合
特征重要性选择最有价值的特征提升泛化能力
集成学习组合多棵树(随机森林诞生)显著提升准确率

第四章 随机森林:群体的智慧

4.1 为什么需要森林?

“三个臭皮匠,顶个诸葛亮”——多棵树的集体决策比单棵树更可靠

4.2 构建森林四步法
  1. 随机采样:从原始数据中有放回抽取N个子集

# 自助采样法(Bootstrapping)
sample_1 = original_data.sample(n=1000, replace=True)  # 第一个子集
sample_2 = original_data.sample(n=1000, replace=True)  # 第二个子集

        2.特征随机:每个节点只考虑部分特征

  3.独立训练:每棵树在自己的数据/特征上训练

tree1 = DecisionTree().fit(sample1, features_subset1)
tree2 = DecisionTree().fit(sample2, features_subset2)

  4.投票决策:综合所有树的预测结果

# 三棵树的预测结果
votes = [tree1.predict(X_new), tree2.predict(X_new), tree3.predict(X_new)]final_prediction = max(set(votes), key=votes.count)  # 多数表决
4.3 关键优势解析
问题类型单决策树随机森林
准确率中等★★★★★
抗过拟合能力★★☆☆☆★★★★★
特征重要性评估不准确非常准确
处理高维数据较差优秀
训练速度较慢

第五章 随机森林实战指南

5.1 Python完整案例(信用卡欺诈检测)
import pandas as pd
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split# 1. 加载数据(需提前下载)
data = pd.read_csv('creditcard.csv')# 2. 处理样本不平衡(欺诈样本仅0.17%)
fraud = data[data['Class']==1]
normal = data[data['Class']==0].sample(n=len(fraud)*10)  # 欠采样
balanced_data = pd.concat([fraud, normal])# 3. 划分训练测试集
X = balanced_data.drop('Class', axis=1)
y = balanced_data['Class']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)# 4. 训练随机森林
model = RandomForestClassifier(n_estimators=100,  # 树的数量max_depth=8,       # 控制复杂度max_features='sqrt' # 每棵树使用sqrt(总特征数)
)
model.fit(X_train, y_train)# 5. 评估(重点看召回率!)
from sklearn.metrics import classification_report
print(classification_report(y_test, model.predict(X_test)))
5.2 参数调优技巧
参数作用推荐设置
n_estimators树的数量100-500(越多越好但越慢)
max_depth树的最大深度5-15(用交叉验证选择)
max_features每棵树考虑的最大特征'sqrt'或'log2'
class_weight处理不平衡数据'balanced'
5.3 可视化决策依据
# 查看特征重要性
importances = model.feature_importances_
sorted_idx = importances.argsort()[::-1]plt.barh(range(10), importances[sorted_idx[:10]])
plt.yticks(range(10), X.columns[sorted_idx[:10]])
plt.title("Top 10 Important Features")

第六章 工业级应用解析

案例1:电商推荐系统

效果:某平台点击率提升35%,转化率提升18%

案例2:医疗诊断辅助

输入特征

  • 医学影像纹理特征

  • 生化指标

  • 患者病史

输出

# 预测概率输出
probabilities = model.predict_proba(patient_data)
# 输出:[良性概率=0.2, 恶性概率=0.8]

价值:早期癌症检出率提升40%,假阳性率降低25%


第七章 常见问题解决方案

问题1:森林训练太慢

优化方案

# 使用增量训练
model = RandomForestClassifier(warm_start=True)for i in range(5):# 分批加载数据chunk = load_data_chunk(i)  model.fit(chunk.X, chunk.y)model.n_estimators += 50  # 每次增加50棵树
问题2:类别不平衡

策略对比

方法实现代码适用场景
欠采样RandomUnderSampler()大数据集
过采样SMOTE()小数据集
类别权重class_weight='balanced'所有场景(推荐)
问题3:模型解释性
# 使用SHAP解释单样本预测
import shapexplainer = shap.TreeExplainer(model)
shap_values = explainer.shap_values(patient_data)# 可视化
shap.force_plot(explainer.expected_value[1], shap_values[1], patient_data)

输出将显示每个特征对当前预测的贡献值(如“白细胞计数 +0.15分”)


结语:从决策树到随机森林的思维跃迁

在完成第37次贷款审批模型迭代后,我终于领悟:

决策树的本质:人类决策过程的机器模拟——通过有限问题逼近真相
随机森林的哲学:承认单模型局限,用集体智慧降低不确定性

当你在sklearn调用RandomForestClassifier()时,实际在操作:

  • 100位各有所长的“决策专家”

  • 每位专家只看到部分事实(随机样本)

  • 每位专家只关注特定线索(随机特征)

  • 最终通过民主投票达成共识

这种机制的精妙之处在于:不追求完美的个体,而是通过不完美的群体达到超乎想象的准确性——这正是人类社会组织与机器学习最深刻的共鸣点。

某银行风控系统升级为随机森林后:
✓ 坏账率下降 42%
✓ 审批速度提升 8倍
✓ 覆盖人群扩大 300万
——用技术创造社会价值,才是算法工程师的终极荣耀

http://www.lryc.cn/news/574244.html

相关文章:

  • 本地文件深度交互新玩法:Obsidian Copilot的深度开发
  • 从Java API调用者到架构思考:我的Elasticsearch认知升级之路
  • RealSense 相机 | 读取IMU | 解决权限问题 | 提供示例程序
  • 用于算法性能预测的 GNN 框架
  • python基于微信小程序的广西文化传承系统
  • C#采集电脑硬件(CPU、GPU、硬盘、内存等)温度和使用状况
  • 【Java高频面试问题】数据结构篇
  • 一键内网穿透,无需域名和服务器,自动https访问
  • 阿里云无影:开启云端办公娱乐新时代
  • 布瑞琳BRANEW:高端洗护领航者,铸就品质生活新典范
  • 异步IO框架io_uring实现TCP服务器
  • 程序包androidx.fragment.app不存在 import androidx.fragment.app
  • 智慧园区数字孪生最佳交付实践:沉淀可复用场景模板,实现快速部署与定制化开发
  • 【每天一个知识点】CITE-seq 技术
  • 后端开发两个月实习总结
  • 深度学习:PyTorch卷积神经网络(CNN)之图像入门
  • 记录MySQL中功能强大的函数使用
  • 构建高性能网络服务:从Reactor模式到现代服务器架构设计
  • 【实时Linux实战系列】实时任务优先级的设置
  • leetcode83.删除排序链表中的重复元素
  • js逻辑:【增量更新机制】
  • STM32 串口通信②:蓝牙模块HC-05控制单片机
  • 国产免费的k8s管理平台
  • 相机标定与3D重建技术通俗讲解
  • springboot开发项目 SLF4J+Logback日志框架集成【最终篇】
  • 用 EXCEL/WPS 实现聚类分析:赋能智能客服场景的最佳实践
  • Linux笔记---线程控制
  • 用安卓手机,怎样远程管理孩子iPhone屏幕使用时间?
  • 新高考需求之一
  • uniapp+vue3做小程序,获取容器高度