今天我們用一個?「相親決策」?的例子來講解決策樹算法,保證你輕松理解原理和實現!
🌳?決策樹是什么?
決策樹就像玩?「20個問題」猜謎游戲:
-
你心里想一個東西(比如「蘋果」)
-
朋友通過一系列問題猜(「是水果嗎?」→「是紅色的嗎?」→...)
-
問的問題越精準,猜得越快!
機器學習中的決策樹:通過一系列「如果...那么...」的規則,把數據一步步分類。
💍?例子:用決策樹決定是否相親
假設你是媒婆,手上有歷史相親數據,記錄每個人的:
-
年齡(青年/中年/老年)
-
外貌(帥/普通)
-
收入(高/中/低)
-
是否成功(是/否)
現在有個新小伙:「青年、外貌帥、收入中」,要不要安排相親?
📊?歷史數據
年齡 | 外貌 | 收入 | 是否成功 |
---|---|---|---|
青年 | 帥 | 高 | 是 |
青年 | 普通 | 高 | 是 |
中年 | 帥 | 高 | 是 |
老年 | 普通 | 中 | 否 |
... | ... | ... | ... |
🌟?決策樹原理
1.?關鍵問題:如何選擇「最佳問題」?
決策樹的核心:每一步選一個最能區分數據的問題(比如優先問「收入高嗎?」比「年齡大嗎?」更能區分成功率)。
衡量標準:
-
信息增益:問完這個問題后,數據更「純凈」(比如「收入高」的人群中成功率明顯更高)。
-
基尼系數:類似,值越小說明分類越準。
2.?構建決策樹(偽代碼)
def 構建決策樹(數據):if 所有數據都屬于同一類別:return 葉子節點(類別)選擇最佳問題 = 找信息增益最大的特征(如「收入」)樹 = {最佳問題: {}}for 該問題的每個選項(如「高/中/低」):子數據 = 篩選出符合該選項的數據樹[最佳問題][選項] = 構建決策樹(子數據)return 樹
3.?本例可能的決策樹
1. 收入=高?├─ 是 → 相親(歷史數據中高收入全部成功)└─ 否 → 2. 外貌=帥?├─ 是 → 相親(青年+帥+中收入曾成功)└─ 否 → 不相親(老年+普通+中收入失敗)
對新數據「青年、帥、中收入」的預測:
-
收入≠高 → 問外貌 → 帥 →?相親!
🛠??代碼實現(Python)
用?scikit-learn
?快速實現:
from sklearn.tree import DecisionTreeClassifier
import pandas as pd# 1. 準備數據(這里簡化特征為數值)
data = {'年齡': ['青年', '青年', '中年', '老年'], # 實際需要轉為數字'外貌': ['帥', '普通', '帥', '普通'],'收入': ['高', '高', '高', '中'],'是否成功': [1, 1, 1, 0] # 1=是,0=否
}
df = pd.DataFrame(data)# 2. 特征編碼(文本轉數字)
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
df['年齡'] = le.fit_transform(df['年齡'])
df['外貌'] = le.fit_transform(df['外貌'])
df['收入'] = le.fit_transform(df['收入'])# 3. 訓練決策樹
X = df[['年齡', '外貌', '收入']]
y = df['是否成功']
model = DecisionTreeClassifier(criterion='entropy') # 用信息增益
model.fit(X, y)# 4. 預測新數據
new_person = pd.DataFrame([['青年', '帥', '中']], columns=['年齡', '外貌', '收入'])
new_person['年齡'] = le.transform(new_person['年齡'])
new_person['外貌'] = le.transform(new_person['外貌'])
new_person['收入'] = le.transform(new_person['收入'])pred = model.predict(new_person)
print("安排相親嗎?", "是" if pred[0] == 1 else "否")
輸出:
安排相親嗎? 是
🌍?決策樹的優缺點
??優點
-
像人類思考:規則直觀易懂(適合向老板解釋!)。
-
無需特征縮放:對數據范圍不敏感。
-
處理混合類型:數值和類別特征都能用。
??缺點
-
容易過擬合:樹太深會死記硬背訓練數據(解決方法:剪枝、限制樹深度)。
-
不穩定:數據微小變化可能導致完全不同的樹(解決方法:用隨機森林)。
🎨?可視化決策樹
安裝?graphviz
?后,可以畫出樹的結構:
from sklearn.tree import export_graphviz
import graphvizdot_data = export_graphviz(model, out_file=None, feature_names=['年齡', '外貌', '收入'], class_names=['否', '是'], filled=True)
graph = graphviz.Source(dot_data)
graph.render("decision_tree") # 保存為PDF
你會看到類似這樣的樹:
收入 <= 1.5? ├─ 是 → 類別: 是 └─ 否 → 外貌 <= 0.5?├─ 是 → 類別: 是└─ 否 → 類別: 否
🤖?實際應用場景
-
醫療診斷:根據癥狀判斷疾病。
-
金融風控:根據用戶信息預測貸款違約。
-
推薦系統:根據用戶行為決定推薦內容。
總結:決策樹就是用一系列問題層層拆解數據,簡單卻強大!試著用它解決你的分類問題吧! 🌟