我们在学习呆板学习算法时,通常会被各种枯燥的数学公式所劝退。
本日,我将实验用团结实际生存的方式,来先容一个非常经典,而且大概是最“懂你心意”的算法——决定树 (Decision Tree)。。
别被这个术语吓到了,实在你天天点外卖的时间都在用它。
想象一下,下战书三点,你站在奶茶店门口(大概打开了外卖App),面临眼花缭乱的菜单,你的大脑为了掩护你的体重,立刻启动了一个“决定树”步调:
- 这杯奶茶含糖吗? -> 如果是全糖 -> 不喝,会胖死 ❌。
- -> 如果是无糖 -> 再看看。
- 加没加小料? -> 没加? -> 没灵魂,不喝 ❌。
- -> 加了波霸/珍珠? -> 完善!买它! ✅
看,这就是一棵决定树!把你脑海里纠结的过程画下来,它就是一个倒立的树状流程图。
但在呆板学习里,我们不是自己画图,而是让盘算机通过学习汗青订单数据,自己总结出这套“点单秘笈”。
它是怎么做到的?别急,我们要用几杯奶茶来教会你。🧋
🌲 第一部门:剖解决定树
在深入之前,咱们先对齐一下 “行话”。固然它叫树,但在盘算机科学里,这棵树通常是倒着长的(根在上面,叶子在下面)。
- 根节点 (Root Node): 树的最顶端。也就是最关键的谁人标题(好比:甜度是多少?)。
- 决定节点 (Decision Node): 中心的那些站点,负责根据某个特性(好比小料、冷热)把数据分流。
- 叶节点 (Leaf Node): 树的末了。到了这里,不再问标题了,直接给出终极讯断(好比:喝! 大概 快逃!)。
🧠 第二部门:树是怎么“长”出来的?
这才是最迷人的地方。如果你给模子一堆奶茶数据,它怎么知道先看“甜度”照旧先看“代价”?
这就涉及到两个超等告急的概念:熵 (Entropy) 和 信息增益 (Information Gain)。
1. 什么是熵 (Entropy)?
物理学里说熵代表杂乱程度。在决定树里,熵代表数据的 “不纯度”(你也可以明确为** “纠结程度” **)。
- 场景 A: 你眼前有10杯奶茶,满是无糖波霸奶茶。这数据太纯了,熵 = 0。你闭着眼拿一杯都是你想喝的,完全不消纠结。
- 场景 B: 你眼前有10杯奶茶,5杯是你最爱的无糖,5杯是甜到齁的全糖,混在一起。这太杂乱了,熵 = 1(最高)。你完全猜不到下一杯是不是“雷”。
呆板学习的目的就是:通干涉标题(分裂),让数据的熵越来越小,直到酿成 0(完全纯净)。
2. 信息增益 (Information Gain)
这就是我们的 “筛选标准”。
简单说:如果我按“甜度”分,能让这堆数据变得多“干净”? 哪个标题能帮我排撤消最多的干扰项,我们就选哪个标题当老大(根节点)!
📊 第三部门:手动算一算 (奶茶案例)
假设我们网络了你已往买的50次奶茶记载,你的口胃偏好非常显着:只喝无糖。
数据分布如下:
- 全糖: 25杯 -> 结果满是 不喝 (❌)
- 无糖: 25杯 -> 结果是 喝 (✅)
我们要决定:先按“甜度”分,照旧先按“加没加冰”分?
方案一:按“甜度”切一刀 🔪
- 左边(全糖堆): 25杯满是❌。完善!这堆数据的熵直接酿成0了!(不消再问别的了,直接抛弃)。
- 右边(无糖堆): 25杯满是✅。完善!熵也是0!
方案二:按“加冰”切一刀 🧊
假设全糖和无糖里都有加冰和去冰的环境。
- 左边(加冰堆): 稠浊着全糖(❌)和无糖(✅)。照旧很乱,熵很高。
- 右边(去冰堆): 同样稠浊。
很显着,按甜度分的信息增益最大,由于它能帮我们瞬间把“绝对不喝”的那部门挑出来。
以是,呆板会选择 甜度 作为根节点!
💻 第四部门:Python 代码实战
光说不练假把式。作为工程师,我们要用代码语言。我们会使用 Python 的 scikit-learn 库。
假设我们整理好了数据 milktea.csv:
Sugar (甜度)Topping (小料)Decision (喝吗?)Full (全糖)Pearls (珍珠)0 (No)Zero (无糖)None (无)0 (No - 太寡淡)Zero (无糖)Pearls (珍珠)1 (Yes).........1. 预处置惩罚与训练
呆板看不懂中文或单词,我们要把它翻译成数字。- import pandas as pd
- from sklearn import tree
- import matplotlib.pyplot as plt
- # 1. 模拟一点奶茶数据
- # 假设我们的逻辑是:只有"无糖(Zero)"且"加珍珠(Pearls)"才喝
- data = pd.DataFrame({
- 'Sugar': ['Full', 'Zero', 'Full', 'Zero', 'Half', 'Zero'],
- 'Topping': ['Pearls', 'None', 'None', 'Pearls', 'Pearls', 'Pudding'],
- 'Drink': [0, 0, 0, 1, 0, 1] # 1=喝, 0=不喝 (假设只要是无糖且有小料就喝)
- })
- # 2. 数据预处理:把文字变成数字 (Mapping)
- # 甜度: Full=0, Zero=1, Half=2
- # 小料: Pearls=0, None=1, Pudding=2
- data['Sugar_Code'] = data['Sugar'].map({'Full': 0, 'Zero': 1, 'Half': 2})
- data['Topping_Code'] = data['Topping'].map({'Pearls': 0, 'None': 1, 'Pudding': 2})
- features = ['Sugar_Code', 'Topping_Code']
- X = data[features]
- Y = data['Drink']
- # 3. 训练模型
- # criterion='entropy' 表示我们使用“熵”来作为分裂标准
- clf = tree.DecisionTreeClassifier(criterion='entropy')
- clf = clf.fit(X, Y)
- print("🤖 奶茶鉴定模型训练完毕!")
复制代码 2. 可视化这棵树
让我们看看呆板头脑里想的图长什么样。- # 4. 画出决策树
- plt.figure(figsize=(10,6))
- tree.plot_tree(clf,
- feature_names=['Sugar', 'Topping'],
- class_names=['Pass', 'Drink'], # Pass=不喝, Drink=喝
- filled=True, # 颜色越深代表机器越确信
- rounded=True)
- plt.show()
复制代码
3. 推测新数据
这时间,老板推出了一款新品:无糖 + 珍珠。你要不要尝尝?
- # 预测 [Sugar=1, Topping=0]
- new_tea = [[1, 0]]
- prediction = clf.predict(new_tea)
- if prediction[0] == 1:
- print("决策结果:买它!🧋😋")
- else:
- print("决策结果:哒咩!❌")
- ## 运行结果:
- '''
- 决策结果:买它!🧋😋
- '''
复制代码 🚀 总结
本日我们通过一杯奶茶学习了:
- 决定树就是一套帮你做选择的“流程图”。
- 呆板使用熵(乱不乱)和信息增益(变干净了吗)来探求最佳的筛选条件。
- 用 scikit-learn 几行代码就能搞定。
呆板学习实在离生存很近。渴望这棵“树”能帮你不光选对模子,还能选对最适当你的那杯下战书茶!
免责声明:如果侵犯了您的权益,请联系站长及时删除侵权内容,谢谢合作!qidao123.com:ToB企服之家,中国第一个企服评测及软件市场,开放入驻,技术点评得现金. |