文章目錄
- 一、概述
- 1.1 介紹
- 1.2 回歸樹和分類樹區別
- 二、重要參數、屬性及接口
- 2.1 criterion(不純度衡量指標)
- 2.2 回歸樹如何工作(核心流程拆解)
- 三、用回歸樹擬合正弦曲線(實戰案例)
- 3.1 繪制正弦曲線
- 3.2 為正弦曲線添加噪聲
- 3.3 實例化訓練模型
- 3.4 測試集導入模型
- 3.5 繪制圖像(對比真實與預測)
- 總結
一、概述
1.1 介紹
回歸樹是決策樹家族中專攻連續型數值預測的模型,其運作邏輯可理解為 “把復雜回歸難題拆分成簡單小任務” 。打個比方,要預測房價(典型的連續數值),它會依據 “房屋面積>100㎡”“房齡<5 年” 這類規則,將整個數據集像切蛋糕一樣,分割成一個個葉節點。每個葉節點會計算對應子數據集的均值,以此作為該區域的預測輸出。整個過程就像樹狀結構那樣,從根節點開始逐層做決策,既直觀又高效,哪怕是非技術人員,也能輕松看懂模型的大致判斷邏輯。
1.2 回歸樹和分類樹區別
為了更清晰展現回歸樹與分類樹的不同,我們用表格對比:
對比維度 | 回歸樹 | 分類樹 |
---|---|---|
預測目標 | 聚焦連續型數值,像房價、溫度、股票收盤價這類可在一定區間內連續取值的數據預測 | 針對離散型類別,比如貓狗分類、疾病診斷(是 / 否患病)、垃圾郵件識別(是 / 否垃圾郵件)等場景 |
葉節點輸出 | 輸出子數據集的均值,是連續的數值結果,比如某葉節點對應房屋子數據的平均價格 | 輸出子數據集的眾數,也就是出現頻率最高的類別標簽,像某葉節點里貓咪圖片占比最多,就輸出 “貓” 這個類別 |
不純度衡量 | 用平方誤差(最小化預測值與真實值的偏差,公式為∑(yi?yˉ)2\sum(y_i - \bar{y})^2∑(yi??yˉ?)2 ),直接和回歸任務的預測目標掛鉤,清晰反映數值預測的誤差情況 | 借助基尼系數(衡量類別混亂程度,數值越小越純凈)或者信息熵(反映信息不確定性,越小說明類別越集中),目標是降低類別混亂度 |
二、重要參數、屬性及接口
2.1 criterion(不純度衡量指標)
在回歸樹里,criterion
參數起著關鍵作用,它決定了模型如何挑選 “最佳分割特征以及對應的分割閾值” ,常用的參數有以下這些:
mse
(均方誤差):這是默認且最常用的指標!它會計算分割后子節點的平方誤差,也就是把每個數據點的真實值與子節點均值的差做平方后求和(∑(yi?yˉ)2\sum(y_i - \bar{y})^2∑(yi??yˉ?)2)。模型訓練時,會努力找到讓這個誤差最小的分割方式,因為它直接關聯回歸任務的預測目標,計算簡單又高效,大多數常規回歸場景用它準沒錯。mae
(平均絕對誤差):計算方式是把每個數據點真實值與子節點均值的絕對差求和(∑∣yi?yˉ∣\sum |y_i - \bar{y}|∑∣yi??yˉ?∣)。相比mse
,它對異常值更 “寬容”(魯棒性強),因為平方運算會放大異常值的影響,而絕對值運算相對更平和。不過,它的計算速度稍慢一點,適合數據里噪聲大、異常值多的場景,能避免模型被異常值帶偏。
下面用 Python 的 sklearn
庫演示代碼:
from sklearn.tree import DecisionTreeRegressor
# 實例化模型,設置 mse 作為 criterion,追求最小化平方誤差
model_mse = DecisionTreeRegressor(criterion='mse')
# 實例化模型,設置 mae 作為 criterion,應對噪聲數據更穩
model_mae = DecisionTreeRegressor(criterion='mae')
2.2 回歸樹如何工作(核心流程拆解)
回歸樹構建是個層層遞進的過程,就像剝洋蔥一樣,把復雜問題逐步拆解,主要分這 4 步:
- 特征 & 閾值遍歷:模型會逐個遍歷每個特征,比如預測房價時的房屋面積、房齡、樓層等特征。對于每個特征,還會遍歷所有可能的分割閾值,像房屋面積可能嘗試 80㎡、90㎡、100㎡ 等作為分割點,看看怎么分能讓后續預測更準。
- 誤差計算:依靠選定的
criterion
(比如mse
),計算按照當前分割方式,分割后子節點的誤差總和。然后從眾多分割可能里,找出能讓誤差下降最多的那個分割,把它作為當前的最佳分割。 - 遞歸分割:完成一次分割后,會生成新的子節點。接著,對子節點重復前面 “遍歷特征 - 計算誤差 - 找最佳分割” 的流程,不斷細分數據,直到觸發停止條件。常見停止條件有樹的深度達到預設最大值(比如限制樹只能長 5 層深),或者某個節點里的數據樣本太少(比如只剩 10 個數據點就不再分割)。
- 葉節點賦值:當無法再繼續分割(觸發停止條件)時,葉節點就確定下來。葉節點的預測值,就是對應子數據集的均值,用這個均值代表該區域數據的預測結果。
三、用回歸樹擬合正弦曲線(實戰案例)
目標:借助回歸樹學習 y=sin?(x)y = \sin(x)y=sin(x) 這條曲線的規律,處理帶有噪聲的模擬數據,驗證模型在曲線擬合這類回歸任務里的能力,同時看看怎么調整參數優化效果。
3.1 繪制正弦曲線
先通過代碼生成純凈的正弦曲線數據,直觀感受它的形態:
import numpy as np
import matplotlib.pyplot as plt# 設置中文字體,SimHei 為 Windows 下的中文黑體,可根據系統調整(如 macOS 可用 'PingFang SC' 等 )
plt.rcParams['font.sans-serif'] = ['SimHei']
# 解決負號顯示為方塊的問題(可選,若繪圖有負號時需要 )
plt.rcParams['axes.unicode_minus'] = False# 生成 x 數據,在 0 到 2π 區間均勻取 200 個點,構建連續的 x 軸
x = np.linspace(0, 2 * np.pi, 200)
# 根據正弦函數計算對應的 y 值,得到純凈的正弦曲線數據
y = np.sin(x)# 繪制曲線,設置標簽和顏色,方便后續圖例展示
plt.plot(x, y, label='純凈正弦曲線', color='blue')
# 顯示圖例,讓曲線含義清晰
plt.legend()
# 展示繪制的圖像
plt.show()
運行后,會看到一條平滑的、在 -1 到 1 之間周期性波動的藍色正弦曲線,這是理論上純凈無干擾的曲線形態。
3.2 為正弦曲線添加噪聲
實際數據采集時,難免會有各種干擾,所以給純凈數據添加隨機噪聲,模擬真實場景:
# 加噪聲(設置隨機種子為 0,保證每次運行生成相同噪聲,方便復現結果;均值 0,方差 0.1 的正態分布噪聲)
np.random.seed(0)
# 給純凈正弦曲線 y 的每個點,加上隨機噪聲,得到帶噪聲的 y_noise
y_noise = y + np.random.normal(0, 0.1, size=len(x)) # 繪制帶噪聲的數據點,用橙色小散點展示;同時繪制純凈曲線作為參考
plt.scatter(x, y_noise, label='帶噪聲數據', color='orange', s=10)
plt.plot(x, y, label='純凈曲線', color='blue')
# 顯示圖例,區分噪聲點和純凈曲線
plt.legend()
# 展示圖像,能看到噪聲讓原本平滑的曲線變得“凹凸不平”
plt.show()
此時圖像里,藍色平滑曲線是純凈正弦曲線,橙色小點點是疊加噪聲后的模擬真實數據,能直觀看到噪聲對數據的影響。
3.3 實例化訓練模型
用 sklearn
里的 DecisionTreeRegressor
來訓練模型,過程如下:
from sklearn.tree import DecisionTreeRegressor# 數據格式轉換(sklearn 的模型要求特征數據是二維數組,所以把一維的 x 轉成列向量形式)
x_reshape = x.reshape(-1, 1) # 實例化模型,這里設置 max_depth=5 控制樹的深度,criterion 選常用的 'mse';也可調整參數看效果變化
model = DecisionTreeRegressor(max_depth=5, criterion='squared_error')
# 用帶噪聲的數據訓練模型,讓模型學習 x 和 y_noise 之間的關系
model.fit(x_reshape, y_noise)
這里 max_depth
是重要參數,控制樹的深度,深度設置會影響模型對曲線的擬合程度,后續可調整探索。
3.4 測試集導入模型
用訓練好的模型,對測試數據(這里直接用和訓練數據同范圍的 x 生成測試集,也可換新的獨立數據)做預測:
# 用同樣 x 范圍生成測試集(也可準備全新數據;保持和訓練數據同結構,轉成二維)
x_test = np.linspace(0, 2 * np.pi, 200).reshape(-1, 1)
# 用訓練好的模型預測測試集的 y 值
y_pred = model.predict(x_test)
模型會依據訓練時學到的分割規則,對每個測試數據點 x_test
,找到對應的葉節點,用葉節點均值給出預測結果 y_pred
。
3.5 繪制圖像(對比真實與預測)
把純凈曲線、帶噪聲數據、模型預測曲線放一起對比,直觀看擬合效果:
plt.figure(figsize=(10,6))
# 繪制帶噪聲數據點,展示原始數據分布
plt.scatter(x, y_noise, label='帶噪聲數據', color='orange', s=10)
# 繪制純凈正弦曲線,用虛線展示理論形態,方便對比
plt.plot(x, y, label='純凈正弦曲線', color='blue', linestyle='--')
# 繪制回歸樹預測曲線,用紅色實線突出模型預測結果
plt.plot(x_test, y_pred, label='回歸樹預測', color='red', linewidth=2) # 顯示圖例,說明各條線、點的含義
plt.legend()
# 設置標題,清晰展示圖表主題
plt.title('回歸樹擬合正弦曲線')
# 標注 x 軸、y 軸含義
plt.xlabel('x')
plt.ylabel('y')
# 展示圖像
plt.show()
效果說明:
- 當
max_depth
很小時(比如設為 2),曲線會比較 “平”,模型對曲線的擬合不足,出現欠擬合,因為樹太淺,沒辦法捕捉曲線的波動細節。 - 隨著
max_depth
增大(比如設為 10),曲線會越來越貼合帶噪聲的數據,甚至可能過度學習噪聲,出現過擬合,曲線變得 “崎嶇”,在新數據上預測效果變差。
實際應用中,需要調整參數平衡欠擬合和過擬合問題。常用做法是用交叉驗證(比如GridSearchCV
工具),自動篩選合適的max_depth
、criterion
等參數,找到在驗證集上表現最好的模型配置。
總結
現過擬合,曲線變得 “崎嶇”,在新數據上預測效果變差。
實際應用中,需要調整參數平衡欠擬合和過擬合問題。常用做法是用交叉驗證(比如 GridSearchCV
工具),自動篩選合適的 max_depth
、criterion
等參數,找到在驗證集上表現最好的模型配置。