四季度读书 發表於 2026-2-7 08:06:00

决策树极简入门

<p>我们在学习机器学习算法时,往往会被各种枯燥的数学公式所劝退。</p>
<p>今天,我将尝试用结合实际生活的方式,来介绍一个非常经典,而且可能是最“懂你心意”的算法——决策树 (Decision Tree)。。</p>
<p>别被这个术语吓到了,其实你每天点外卖的时候都在用它。</p>
<p>想象一下,下午三点,你站在奶茶店门口(或者打开了外卖App),面对眼花缭乱的菜单,你的大脑为了保护你的体重,立刻启动了一个“决策树”程序:</p>
<ol>
<li>这杯奶茶含糖吗? -&gt; 如果是全糖 -&gt; 不喝,会胖死 ❌。</li>
<li>-&gt; 如果是无糖 -&gt; 再看看。</li>
<li>加没加小料? -&gt; 没加? -&gt; 没灵魂,不喝 ❌。</li>
<li>-&gt; 加了波霸/珍珠? -&gt; 完美!买它! ✅</li>
</ol>
<p><img src="https://img2024.cnblogs.com/blog/83005/202602/83005-20260207080350892-40837281.jpg" alt="画板" loading="lazy"></p>
<p>看,这就是一棵决策树!把你脑海里纠结的过程画下来,它就是一个倒立的树状流程图。</p>
<p>但在机器学习里,我们不是自己画图,而是让计算机通过学习历史订单数据,自己总结出这套“点单秘籍”。</p>
<p>它是怎么做到的?别急,我们要用几杯奶茶来教会你。🧋</p>
<h1 id="-第一部分解剖决策树">🌲 第一部分:解剖决策树</h1>
<p>在深入之前,咱们先对齐一下 <strong>“行话”</strong>。虽然它叫树,但在计算机科学里,这棵树通常是倒着长的(根在上面,叶子在下面)。</p>
<ul>
<li><strong>根节点</strong> (<code>Root Node</code>): 树的最顶端。也就是最关键的那个问题(比如:甜度是多少?)。</li>
<li><strong>决策节点</strong> (<code>Decision Node</code>): 中间的那些站点,负责根据某个特征(比如小料、冷热)把数据分流。</li>
<li><strong>叶节点</strong> (<code>Leaf Node</code>): 树的末端。到了这里,不再问问题了,直接给出最终判决(比如:喝! 或者 快逃!)。</li>
</ul>
<h1 id="-第二部分树是怎么长出来的">🧠 第二部分:树是怎么“长”出来的?</h1>
<p>这才是最迷人的地方。如果你给模型一堆奶茶数据,它怎么知道先看“甜度”还是先看“价格”?</p>
<p>这就涉及到两个超级重要的概念:<strong>熵</strong> (<code>Entropy</code>) 和 <strong>信息增益</strong> (<code>Information Gain</code>)。</p>
<h2 id="1-什么是熵-entropy">1. 什么是熵 (Entropy)?</h2>
<p>物理学里说<strong>熵</strong>代表<strong>混乱程度</strong>。在决策树里,<strong>熵</strong>代表数据的 <strong>“不纯度”</strong>(你也可以理解为** “纠结程度” **)。</p>
<ul>
<li><strong>场景 A</strong>: 你面前有10杯奶茶,全是无糖波霸奶茶。这数据太纯了,熵 = 0。你闭着眼拿一杯都是你想喝的,完全不用纠结。</li>
<li><strong>场景 B:</strong> 你面前有10杯奶茶,5杯是你最爱的无糖,5杯是甜到齁的全糖,混在一起。这太混乱了,熵 = 1(最高)。你完全猜不到下一杯是不是“雷”。</li>
</ul>
<p>机器学习的目标就是:通过问问题(分裂),让数据的熵越来越小,直到变成 0(完全纯净)。</p>
<h2 id="2-信息增益-information-gain">2. 信息增益 (Information Gain)</h2>
<p>这就是我们的 <strong>“筛选标准”</strong>。</p>
<ul>
<li><strong>信息增益</strong> = <strong>分裂前的熵</strong> - <strong>分裂后的熵</strong></li>
</ul>
<p>简单说:如果我按“甜度”分,能让这堆数据变得多“干净”? 哪个问题能帮我排除掉最多的干扰项,我们就选哪个问题当老大(根节点)!</p>
<h1 id="-第三部分手动算一算-奶茶案例">📊 第三部分:手动算一算 (奶茶案例)</h1>
<p>假设我们收集了你过去买的50次奶茶记录,你的口味偏好非常明显:只喝无糖。<br>
数据分布如下:</p>
<ul>
<li><strong>全糖</strong>: <code>25</code>杯 -&gt; 结果全是 不喝 (❌)</li>
<li><strong>无糖</strong>: <code>25</code>杯 -&gt; 结果是 喝 (✅)</li>
</ul>
<p>我们要决定:先按“甜度”分,还是先按“加没加冰”分?</p>
<h2 id="方案一按甜度切一刀-">方案一:按“甜度”切一刀 🔪</h2>
<ul>
<li>左边(<strong>全糖堆</strong>): 25杯全是❌。完美!这堆数据的熵直接变成0了!(不用再问别的了,直接扔掉)。</li>
<li>右边(<strong>无糖堆</strong>): 25杯全是✅。完美!熵也是0!</li>
</ul>
<h2 id="方案二按加冰切一刀-">方案二:按“加冰”切一刀 🧊</h2>
<p>假设全糖和无糖里都有加冰和去冰的情况。</p>
<ul>
<li>左边(<strong>加冰堆</strong>): 混杂着全糖(❌)和无糖(✅)。还是很乱,熵很高。</li>
<li>右边(<strong>去冰堆</strong>): 同样混杂。</li>
</ul>
<p>很明显,按<strong>甜度分</strong>的信息增益最大,因为它能帮我们瞬间把“绝对不喝”的那部分挑出来。</p>
<p>所以,机器会选择 <strong>甜度</strong> 作为根节点!</p>
<h1 id="-第四部分python-代码实战">💻 第四部分:Python 代码实战</h1>
<p>光说不练假把式。作为工程师,我们要用代码说话。我们会使用 Python 的 <code>scikit-learn</code> 库。</p>
<p>假设我们整理好了数据 <code>milktea.csv</code>:</p>
<table>
<thead>
<tr>
<th>Sugar (甜度)</th>
<th>Topping (小料)</th>
<th>Decision (喝吗?)</th>
</tr>
</thead>
<tbody>
<tr>
<td>Full (全糖)</td>
<td>Pearls (珍珠)</td>
<td>0 (No)</td>
</tr>
<tr>
<td>Zero (无糖)</td>
<td>None (无)</td>
<td>0 (No - 太寡淡)</td>
</tr>
<tr>
<td>Zero (无糖)</td>
<td>Pearls (珍珠)</td>
<td>1 (Yes)</td>
</tr>
<tr>
<td>...</td>
<td>...</td>
<td>...</td>
</tr>
</tbody>
</table>
<h2 id="1-预处理与训练">1. 预处理与训练</h2>
<p>机器看不懂中文或单词,我们要把它翻译成数字。</p>
<pre><code class="language-python">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':   # 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
Y = data['Drink']

# 3. 训练模型
# criterion='entropy' 表示我们使用“熵”来作为分裂标准
clf = tree.DecisionTreeClassifier(criterion='entropy')
clf = clf.fit(X, Y)

print("🤖 奶茶鉴定模型训练完毕!")
</code></pre>
<h2 id="2-可视化这棵树">2. 可视化这棵树</h2>
<p>让我们看看机器脑子里想的图长什么样。</p>
<pre><code class="language-python"># 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()
</code></pre>

<p><img src="https://img2024.cnblogs.com/blog/83005/202602/83005-20260207080350764-430638444.png" alt="" loading="lazy"></p>
<h2 id="3-预测新数据">3. 预测新数据</h2>
<p>这时候,老板推出了一款新品:无糖 + 珍珠。你要不要尝尝?</p>
<ul>
<li>无糖 = 1</li>
<li>珍珠 = 0</li>
</ul>
<pre><code class="language-python"># 预测
new_tea = []
prediction = clf.predict(new_tea)

if prediction == 1:
    print("决策结果:买它!🧋😋")
else:
    print("决策结果:哒咩!❌")

## 运行结果:
'''
决策结果:买它!🧋😋
'''
</code></pre>
<h1 id="-总结">🚀 总结</h1>
<p>今天我们通过一杯奶茶学习了:</p>
<ol>
<li><strong>决策树</strong>就是一套帮你做选择的“流程图”。</li>
<li>机器利用<strong>熵</strong>(乱不乱)和<strong>信息增益</strong>(变干净了吗)来寻找最佳的筛选条件。</li>
<li>用 <code>scikit-learn</code> 几行代码就能搞定。</li>
</ol>
<p>机器学习其实离生活很近。希望这棵“树”能帮你不仅选对模型,还能选对最适合你的那杯下午茶!</p><br><br>
来源:https://www.cnblogs.com/wang_yb/p/19587107
頁: [1]
查看完整版本: 决策树极简入门