今天学习决策树和随机森林像玩游戏一样做决策每个概念都解释每行代码都说明白预计时间2-3 小时含费曼输出练习 第 1 步快速复习前两天的内容20 分钟费曼输出 #0考考你合上教程尝试回答□ 什么是机器学习用自己的话解释不要用从数据中学习这种定义 □ K 近邻算法的核心思想是什么用至少 2 个生活例子说明 □ 机器学习的完整流程是怎样的画一个流程图 □ 如果让你向朋友解释 K 值的选择你会怎么说⏰ 时间15 分钟如果都能答出来我们开始今天的内容如果有忘记的花 5 分钟翻一下 Day01 和 Day02。 第 2 步什么是决策树40 分钟故事时间 想象你在玩一个猜人游戏你的朋友心里想了一个人你要猜是谁 你问的问题 1. 是男的吗 ├─ 是 → 继续问 2 └─ 否 → 继续问 3 2. 戴眼镜吗针对男性 ├─ 是 → 可能是小明 └─ 否 → 可能是小刚 3. 长头发吗针对女性 ├─ 是 → 可能是小红 └─ 否 → 可能是小丽这个过程就是一棵决策树决策树的结构[是男的吗] ← 根节点第一个问题 / \ 是 / \ 否 / \ [戴眼镜吗] [长头发吗] ← 内部节点中间问题 / \ / \ 是/ \否 是/ \否 / \ / \ [小明] [小刚] [小红] [小丽] ← 叶节点最终答案名词解释根节点第一个问题树的根部内部节点中间的问题叶节点最终的答案不再有分支分支从一个节点到另一个节点的连线 费曼输出 #1解释决策树任务 1向小学生解释场景有个小朋友问你什么是决策树呀要求不用节点、分支、分类这些专业术语用游戏、学校、家庭等生活场景比喻让小学生能听懂参考模板决策树就像______一样。 比如你要______ 你先问______ 然后根据答案选______ 最后得到______。 就是这样一层一层地问问题⏰ 时间15 分钟 卡壳检查点如果你在解释时卡住了□ 我说不清楚决策树和普通 if-else 的区别 □ 我不知道如何解释树的概念 □ 我只能说像流程图但不能更具体这很正常标记下来回去再看上面的内容然后重新尝试解释提示决策树 20 个问题游戏 统计数据 第 3 步决策树是如何学习的30 分钟核心问题计算机怎么知道先问哪个问题关键概念信息增益想象你在玩猜猜我是谁的游戏第一次问的问题 ✓ 是男的吗 → 排除一半人好问题 ✗ 叫张三吗 → 只能排除一个人烂问题 为什么 因为是男的吗能把可能性减少很多 这就是信息增益大信息增益 不确定性减少的程度问之前100 个人都可能是 问之后如果是男的只剩 50 个可能 减少了 50 个 → 信息增益大 问之前100 个人都可能是 问之后如果叫张三只剩 99 个可能 只减少了 1 个 → 信息增益小决策树的学习过程1. 计算每个特征的信息增益 - 问性别→ 增益 0.5 - 问年龄→ 增益 0.3 - 问名字→ 增益 0.01 2. 选增益最大的特征作为第一个问题 → 先问性别 3. 对每一组继续找最佳问题 → 男性组下一个问什么最好 → 女性组下一个问什么最好 4. 重复直到能准确分类 费曼输出 #2深入理解信息增益任务 1创造比喻场景朋友问你什么是信息增益要求至少创造 2 个不同的比喻用侦探破案、考试答题、购物选择等场景让对方一听就懂示例思路信息增益就像是______ 就像侦探找线索______任务 2解释为什么需要信息增益思考题1. 为什么不能随便选一个问题开始问 2. 信息增益大的问题有什么特点 3. 如果每次都选信息增益最大的问题会怎样⏰ 时间20 分钟 卡壳检查点□ 我解释不清楚信息增益的含义 □ 我不知道为什么信息增益大的问题更好 □ 我不能用生活中的例子说明提示信息增益 问题的含金量含金量高 一问就能排除很多可能性就像考试时先做分值高的题 第 4 步动手实现决策树50 分钟第 1 步准备环境在命令行输入pip install scikit-learn matplotlib seaborn等安装完成第 2 步第一个决策树模型打开 Jupyter Notebook新建笔记本输入from sklearn.tree import DecisionTreeClassifier from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split print( * 50) print( 我的第一个决策树模型) print( * 50) # 1. 加载数据鸢尾花数据集 iris load_iris() X iris.data # 特征花萼长、宽花瓣长、宽 y iris.target # 标签花的品种0,1,2 print(\n数据集信息) print(f样本数{len(X)} 朵花) print(f特征{iris.feature_names}) print(f类别{iris.target_names}) # 2. 划分训练集和测试集 X_train, X_test, y_train, y_test train_test_split( X, y, test_size0.3, random_state42 ) print(f\n训练集{len(X_train)} 朵花) print(f测试集{len(X_test)} 朵花) # 3. 创建决策树模型 clf DecisionTreeClassifier( max_depth3, # 最大深度防止过拟合 random_state42 # 随机种子保证结果可重复 ) # 4. 训练模型 print(\n正在训练决策树...) clf.fit(X_train, y_train) print(✅ 训练完成) # 5. 评估模型 train_score clf.score(X_train, y_train) test_score clf.score(X_test, y_test) print(f\n 模型性能) print(f训练集准确率{train_score*100:.2f}%) print(f测试集准确率{test_score*100:.2f}%) # 6. 实际预测 print(\n * 50) print( 实际应用预测一朵新的花) print( * 50) new_flower [[5.0, 3.5, 1.5, 0.3]] prediction clf.predict(new_flower) species_name iris.target_names[prediction[0]] print(f\n新花的特征{new_flower[0]}) print(f预测结果这是 {species_name} 鸢尾花) print(\n * 50) print( 恭喜你学会了决策树) print( * 50)按 Shift Enter 运行 费曼输出 #3解释代码含义逐行解释给小白听任务假装你在教一个完全不懂编程的人要解释清楚1. DecisionTreeClassifier() 是在做什么 2. max_depth3 是什么意思为什么要限制深度 3. clf.fit() 和 clf.predict() 有什么区别 4. train_score 和 test_score 分别代表什么 5. 为什么需要训练集和测试集要求不用分类器、拟合、过拟合等术语用生活化的比喻每行代码都要说明白参考思路DecisionTreeClassifier() 就像是______ max_depth3 就像是______ fit() 就像是______predict() 就像是______ train_score 就像是______test_score 就像是______⏰ 时间20 分钟 卡壳检查点□ 我解释不清 max_depth 的作用 □ 我分不清 fit 和 predict 的区别 □ 我说不明白为什么需要测试集 □ 我不知道过拟合是什么提示max_depth 树的最大层数防止钻牛角尖fit() 学习做题并记住答案predict() 考试做新的题目train_score 平时练习成绩test_score 期末考试成绩 第 5 步什么是随机森林40 分钟思想三个臭皮匠顶个诸葛亮生活中的例子考试答题 一个人答 → 可能答错 ❌ 100 个人一起答 - 每个人投票选一个答案 - 统计票数选最多的 - 正确率更高 ✅ 这就是随机森林的思想随机森林的工作原理森林 很多棵树 训练过程 1. 从数据中随机抽取一部分样本 → 就像抽签每次抽到的不一样 2. 从特征中随机选择一部分 → 就像考试时只看部分题目 3. 用这些样本和特征训练一棵树 → 每棵树学到的东西略有不同 4. 重复 1-3 步训练 100 棵树 → 100 个专家 5. 这 100 棵树组成森林 预测过程 1. 每棵树都给出自己的答案 → 100 个专家投票 2. 统计所有树的答案 → 数票数 3. 选票数最多的那个 → 少数服从多数为什么更准确一棵树 → 可能看走眼 多棵树 → 集体智慧更可靠 就像 - 一个人判断 → 可能主观 - 100 个人投票 → 更客观 这就是群体的智慧 费曼输出 #4深入理解随机森林任务 1创造多个比喻场景向不同背景的人解释随机森林对小朋友用班级投票、家庭决策等例子对非技术人员用专家会诊、民主投票等例子对技术人员用集成学习、偏差方差权衡等角度要求每个场景至少创造一个比喻任务 2解释为什么随机性很重要思考题1. 为什么每棵树要用不同的样本 2. 如果所有树都一样会怎样 3. 随机有什么好处⏰ 时间20 分钟 卡壳检查点□ 我解释不清为什么随机性能提高准确率 □ 我说不明白集体的智慧的原理 □ 我不能用生活中的例子说明投票机制提示多样性 每个人看问题的角度不同随机性 避免所有人犯同样的错误投票 抵消个别错误 第 6 步随机森林代码实现30 分钟from sklearn.ensemble import RandomForestClassifier print( * 50) print( 随机森林的力量) print( * 50) # 使用之前的数据 # X_train, X_test, y_train, y_test 已经有了 # 1. 创建随机森林模型 rf RandomForestClassifier( n_estimators100, # 树的数量100 棵 max_depth10, # 每棵树的最大深度 random_state42 ) # 2. 训练模型 print(\n正在训练随机森林100 棵树...) rf.fit(X_train, y_train) print(✅ 训练完成) # 3. 评估 rf_train_score rf.score(X_train, y_train) rf_test_score rf.score(X_test, y_test) print(f\n 模型性能) print(f训练集准确率{rf_train_score*100:.2f}%) print(f测试集准确率{rf_test_score*100:.2f}%) # 4. 对比单棵决策树 print(\n * 50) print( 决策树 vs 随机森林) print( * 50) # 重新训练一棵决策树用同样的数据 dt DecisionTreeClassifier(max_depth10, random_state42) dt.fit(X_train, y_train) print(f单棵决策树 - 测试集准确率{dt.score(X_test, y_test)*100:.2f}%) print(f随机森林 - 测试集准确率{rf_test_score*100:.2f}%) improvement (rf_test_score - dt.score(X_test, y_test)) * 100 print(f\n提升{improvement:.2f}%) print(看到了吗随机森林通常比单棵树更好) 费曼输出 #5对比两种算法任务当一次小老师场景有同学问我应该用决策树还是随机森林你要解释1. 两种方法各有什么优缺点 2. 什么情况下用决策树 3. 什么情况下用随机森林 4. 用生活中的例子说明参考表格维度决策树随机森林理解难度简单易懂较复杂准确率一般更高可解释性能画出来黑箱速度快慢适用场景需要解释追求准确率⏰ 时间15 分钟 第 7 步实战项目泰坦尼克号生存预测50 分钟背景介绍1912 年泰坦尼克号沉没 数据包含乘客信息 - 年龄、性别 - 船票等级一等舱、二等舱、三等舱 - 是否有兄弟姐妹/配偶 - 是否有父母/子女 - 票价等 目标预测谁能存活 历史事实 - 妇女和儿童优先上救生艇 - 一等舱乘客存活率更高完整项目代码import pandas as pd import numpy as np from sklearn.preprocessing import LabelEncoder print( * 50) print( 泰坦尼克号生存预测实战) print( * 50) # 1. 创建模拟数据因为真实数据要下载 print(\n正在创建模拟数据...) np.random.seed(42) n_passengers 500 # 创建乘客信息 data pd.DataFrame({ Pclass: np.random.choice([1, 2, 3], n_passengers), # 船票等级 Sex: np.random.choice([male, female], n_passengers), # 性别 Age: np.random.normal(30, 15, n_passengers).clip(0, 80), # 年龄 SibSp: np.random.randint(0, 6, n_passengers), # 兄弟姐妹/配偶数 Parch: np.random.randint(0, 6, n_passengers), # 父母/子女数 Fare: np.random.exponential(30, n_passengers).clip(0, 500), # 票价 }) # 创建目标变量是否存活 # 模拟历史事实女性、一等舱、年轻人更容易存活 survival_prob ( 0.3 * (data[Sex] female) # 女性加分 0.2 * (data[Pclass] 1) # 一等舱加分 0.1 * (data[Age] 18) # 未成年人加分 np.random.random(n_passengers) * 0.3 # 随机因素 ) data[Survived] (survival_prob 0.5).astype(int) print(f✓ 数据创建完成) print(f乘客总数{len(data)} 人) print(f存活人数{sum(data[Survived]1)} 人) print(f遇难人数{sum(data[Survived]0)} 人) # 2. 数据预处理 print(\n正在处理数据...) # 把文字转成数字机器只懂数字 le_sex LabelEncoder() data[Sex] le_sex.fit_transform(data[Sex]) # male1, female0 # 准备特征和标签 features [Pclass, Sex, Age, SibSp, Parch, Fare] X data[features] y data[Survived] # 填补缺失值如果有 X X.fillna(X.median()) print(✓ 数据预处理完成) print(f特征{features}) # 3. 划分训练集和测试集 from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test train_test_split( X, y, test_size0.2, random_state42 ) print(f\n训练集{len(X_train)} 人) print(f测试集{len(X_test)} 人) # 4. 训练随机森林模型 print(\n正在训练随机森林模型...) rf_titanic RandomForestClassifier( n_estimators100, max_depth8, min_samples_split10, # 至少 10 个样本才继续分 random_state42 ) rf_titanic.fit(X_train, y_train) print(✅ 模型训练完成) # 5. 评估 train_acc rf_titanic.score(X_train, y_train) test_acc rf_titanic.score(X_test, y_test) print(f\n 模型性能) print(f训练集准确率{train_acc*100:.2f}%) print(f测试集准确率{test_acc*100:.2f}%) # 6. 实际预测几个乘客 print(\n * 50) print( 预测具体乘客的生存概率) print( * 50) # 创建几个虚拟乘客 passengers pd.DataFrame({ Pclass: [1, 3, 1, 3], Sex: le_sex.transform([female, male, male, female]), Age: [25, 25, 40, 5], SibSp: [1, 0, 0, 2], Parch: [0, 0, 0, 2], Fare: [100, 10, 200, 50] }, columnsfeatures) passenger_names [ 乘客 A一等舱女乘客25 岁, 乘客 B三等舱男乘客25 岁, 乘客 C一等舱男乘客40 岁, 乘客 D三等舱女儿童5 岁 ] predictions rf_titanic.predict(passengers) probabilities rf_titanic.predict_proba(passengers) for i, name in enumerate(passenger_names): pred predictions[i] prob_survive probabilities[i][1] * 100 status ✅ 存活 if pred 1 else ❌ 遇难 print(f\n{name}:) print(f 预测结果{status}) print(f 存活概率{prob_survive:.1f}%) # 7. 特征重要性分析 print(\n * 50) print( 影响生存的关键因素) print( * 50) feat_names X.columns importances rf_titanic.feature_importances_ # 排序 indices np.argsort(importances)[::-1] print(\n按重要性排序) for i in range(len(feat_names)): feat_idx indices[i] bar █ * int(importances[feat_idx] * 20) print(f{feat_names[feat_idx]:12} {bar} {importances[feat_idx]:.4f}) print(\n结论) if importances[indices[0]] 0.3: print(f✓ 最重要的因素是{feat_names[indices[0]]}) print(\n * 50) print( 恭喜你完成了泰坦尼克号预测项目) print( * 50) 费曼输出 #6完整项目讲解任务录制项目讲解视频场景你要把这个项目讲给完全不懂的人听要覆盖的内容1. 项目背景泰坦尼克号是什么 2. 数据有哪些特征 3. 为什么要把文字转成数字 4. 随机森林是怎么工作的 5. 特征重要性说明了什么 6. 预测结果如何解读方式 录一段 10-15 分钟的视频 写一篇 800 字左右的文章 找个朋友完整地讲给他听⏰ 时间30 分钟 今日费曼总结30 分钟⭐完整的费曼学习流程第 1 步回顾今天的内容5 分钟□ 什么是决策树用比喻 □ 信息增益的概念 □ 随机森林的思想 □ 完整的项目实战第 2 步合上教程尝试完整教授15 分钟⭐任务假装你在给一个完全不懂的人上第三堂课要覆盖决策树的工作原理至少 2 个比喻什么是信息增益为什么重要随机森林的核心思想泰坦尼克号项目的完整流程方式 写一篇 800 字左右的文章 录一段 10-15 分钟的视频 找个朋友给他讲一遍第 3 步标记卡壳点5 分钟我今天卡壳的地方 □ _________________________________ □ _________________________________ □ _________________________________第 4 步针对性复习5 分钟回到教程中卡壳的地方重新学习然后再次尝试解释 费曼学习笔记模板╔═══════════════════════════════════════════════════╗ ║ Day 3 费曼学习笔记 ║ ╠═══════════════════════════════════════════════════╣ ║ 日期__________ ║ ║ 学习时长__________ ║ ╠═══════════════════════════════════════════════════╣ ║ ║ ║ 1. 我向小白解释了 ║ ║ _______________________________________________ ║ ║ _______________________________________________ ║ ║ ║ ║ 2. 我卡壳的地方 ║ ║ □ _____________________________________________ ║ ║ □ _____________________________________________ ║ ║ ║ ║ 3. 我的通俗比喻 ║ ║ • 决策树就像 ______ ║ ║ • 信息增益就像 ______ ║ ║ • 随机森林就像 ______ ║ ║ ║ ║ 4. 我还想知道 ║ ║ _______________________________________________ ║ ║ ║ ╚═══════════════════════════════════════════════════╝ 今日总结✅ 你今天学到了1. 决策树像玩游戏一样做决策if-else 判断的升级版有根节点、内部节点、叶节点2. 信息增益问题的含金量含金量越高越值得先问就像侦探找最关键的线索3. 随机森林多棵树投票三个臭皮匠顶个诸葛亮通常比单棵树更准确4. 完整项目泰坦尼克号生存预测数据预处理特征重要性分析5. 费曼输出能力⭐能用比喻解释决策树能向小白说明信息增益能完整讲解项目 明日预告明天你将学习主题支持向量机SVM 内容 ✓ 找最优分界线 ✓ 核技巧的魔力 ✓ 处理复杂数据 ✓ 实战手写数字识别 需要准备 ✓ 复习今天的决策树和随机森林 ✓ 了解什么是边界 ✓ 保持好奇心 常见问题Q1: 决策树和随机森林选哪个决策树 ✓ 简单易懂能画出来 ✓ 适合解释给非技术人员 ✗ 容易过拟合 随机森林 ✓ 准确率高 ✓ 不容易过拟合 ✗ 黑箱模型不知道为啥 建议 需要解释 → 决策树 追求准确率 → 随机森林Q2: 树的数量设多少经验值 ✓ 小数据集50-100 棵树 ✓ 中等数据100-200 棵树 ✓ 大数据集200-500 棵树 注意 树越多越慢但不一定更准 超过一定数量后提升不明显 最后的鼓励第三天完成了你已经学会了 ✓ K 近邻Day 2 ✓ 决策树Day 3 ✓ 随机森林Day 3 三种不同的算法 你现在是个真正的机器学习初学者了 更重要的是 ✓ 你能用自己的话解释概念了 ✓ 你能创造生动的比喻了 ✓ 你能发现并解决知识盲点了 ✓ 你能完整讲解一个项目了 继续加油明天学习更高级的算法 记住费曼的话 如果你不能简单地解释它你就没有真正理解它 今天你能用自己的话解释决策树和随机森林了吗 如果能你就真的学会了 加油我相信你一定可以的✨ 打卡模板日期___________ 学习时长_______ 小时 费曼输出次数_______ 次 今天学会了 遇到的卡壳点 如何用比喻解释的 明天的目标明天见继续加油✨