機器學習動手做Lesson 22 — 讓提升法的每個基學習器面對的任務都相似

施威銘研究室
6 min readMar 21, 2022

--

集成式學習(Ensemble Learning)中常見的演算法之一是提升法(Boosting):透過加入基學習器(Base Learner),來修正預測誤差,藉此降低集成後模型誤差。因此,每一個基學習器,雖然都是使用同樣的特徵(Feature),但是標籤(Label)是不同的:越晚加入的基學習器,通常標籤值會越接近 0。

有沒有可能隨著標籤的改變,我們應該要使用不同的基學習器,才可以得到更好的集成結果呢?但是,每一次添加基學習器的時候,都要考慮現在的特徵、標籤比較適合哪一種演算法,也是滿麻煩。

因此,有一組研究團隊(Dudek, 2022)用另一種觀點來看問題:如果每一次添加的基學習器,看到的特徵、標籤都相似,那就只需要用同一種演算法即可!

我們來好好研究一下該團隊的做法吧。

一、Ensemble Learning Based on Residuals(EnsR)

首先,我們回顧一下傳統的提升法:

1、使用目前的標籤值減去目前模型的預測值,得到殘差(Residual)

2、使用原始資料的特徵,以及步驟 1 得到殘差為標籤,訓練一個基學習器。

3、將步驟 2 得到的基學習器加入模型,得到新的預測值。

下圖是用決策樹(Decision Tree)來預測一個三角函數,我們可以看到每個基學習器的標籤都不同。

圖一、EnsR 中 5 個基學習器的標籤。

二、Ensemble Learning Based on Corrected Targets(EnsCT)

這是該研究團隊提出的第一個方法,來讓每個基學習器看到的標籤都類似。作法如下:

1、將基學習器的輸出相加

2、將標籤放大 K+1 倍,其中 K 為基學習器個數

3、將步驟 2 的值減去步驟 1 的值,得到殘差

4、使用原始資料的特徵,以及步驟 3得到殘差為標籤,訓練一個基學習器。

5、將步驟 4 得到的基學習器加入模型。

下圖是用決策樹來預測一個三角函數,我們可以看到 EnsCT 的標籤值,還是有一些變化。

圖二、EnsCT 中 5 個基學習器的標籤。

三、Ensemble Learning Based on Opposed Response(EnsOR)

為了讓標籤的變化更小,該研究團隊提出第二個方法:

1、將基學習器的輸出相加取平均

2、將標籤放大 2 倍

3、將步驟 2 的值減去步驟 1 的值,得到殘差

4、使用原始資料的特徵,以及步驟 3得到殘差為標籤,訓練一個基學習器。

5、將步驟 4 得到的基學習器加入模型。

下圖是用決策樹來預測一個三角函數,我們可以看到 EnsOR,可以看到標籤變化小很多喔!

圖三、EnsOR 中 5 個基學習器的標籤。

參考資料

Dudek, Grzegorz. (2022). Boosted Ensemble Learning based on Randomized NNs for Time Series Forecasting.

關於作者

Chia-Hao Li received the M.S. degree in computer science from Durham University, United Kingdom. He engages in computer algorithm, machine learning, and hardware/software codesign. He was former senior engineer in Mediatek, Taiwan. His currently research topic is the application of machine learning techniques for fault detection in the high-performance computing systems.

完整程式

import numpy as np
import matplotlib.pyplot as plt
from sklearn.tree import DecisionTreeRegressor
def plot_ensemble(p, r):
plt.figure(1)
for i in range(5):
plt.plot(x, r[i], label = "learner "+str(i)+" target")
plt.legend()
plt.show()
def base_learner(x, y):
model = DecisionTreeRegressor(max_depth = 2).fit(
x.reshape(-1, 1), y)
return model.predict(x.reshape(-1, 1))
x = np.linspace(start = 0, stop = 10, num = 100)
y = np.sin(x)
ensr_y = [y]
ensr_p = []
for i in range(5):
p = np.zeros(len(y))
ensr_p.append(base_learner(x, ensr_y[-1]))
for j in range(0, len(ensr_p)):
p = p + ensr_p[j]
ensr_y.append(y - p)
plot_ensemble(ensr_p, ensr_y)ensct_y = [y]
ensct_p = []
for i in range(5):
p = np.zeros(len(y))
ensct_p.append(base_learner(x, ensct_y[-1]))
for j in range(0, len(ensct_p)):
p = p + ensct_p[j]
ensct_y.append((len(ensct_p) + 1) * y - p)

plot_ensemble(ensct_p, ensct_y)
ensor_y = [y]
ensor_p = []
for i in range(5):
p = np.zeros(len(y))
ensor_p.append(base_learner(x, ensor_y[-1]))
for j in range(0, len(ensor_p)):
p = p + ensor_p[j]
p = p / len(ensor_p)
ensor_y.append(2 * y - p)

plot_ensemble(ensor_p, ensor_y)

--

--

施威銘研究室
施威銘研究室

Written by 施威銘研究室

致力開發AI領域的圖書、創客、教具,希望培養更多的AI人才。整合各種人才,投入創客產品的開發,推廣「實作學習」,希望實踐學以致用的理想。

No responses yet