CatBoost 是什麼?淺顯易懂地說明與 LightGBM、XGBoost 的差異

image.png

在商業現場中處理的資料,很多都不是只有乾淨的數值所構成。

例如,顧客資料可能包含「顧客區隔」「地區」「產業」「方案」,行銷資料可能包含「活動」「廣告管道」「流入來源」,問卷資料可能包含「回答類別」或「屬性資訊」等,這些都屬於所謂的類別型變數。

近年來,針對這類表格式商業資料建立高精度預測模型的方法,常常會使用 LightGBM 或 CatBoost 這類 boosting 系列的機器學習演算法。

Exploratory 也因應使用者需求,自 v14.5 起支援 LightGBM,並自 v15.5 起支援 CatBoost。

因此,這次要針對特別擅長處理包含大量類別變數資料的 CatBoost,以盡可能淺顯易懂的方式來說明。

CatBoost 是在以下這類包含變數的資料上,特別容易發揮效果的機器學習演算法。

  • 顧客區隔
  • 地區
  • 商品類別
  • 產業
  • 方案種類
  • 活動
  • 廣告管道
  • 問卷回答

本文將說明以下內容:

  • CatBoost 誕生的背景
  • 與 XGBoost、LightGBM 的差異
  • CatBoost 為什麼擅長處理類別變數
  • CatBoost 擅長的資料類型
  • 什麼時候應該使用 CatBoost

另外,如果你想更深入了解 LightGBM,也可以一併參考之前寫的這篇文章。


CatBoost 想解決的問題

例如,假設我們想根據下列資料預測顧客流失(Churn)。

顧客區分地域方案產業月營收流失SMB西日本Starter零售120TRUEEnterprise東日本Business金融2500FALSEMid-Market關西ProSaaS850FALSE在這類資料中,

  • 月營收 → 數值
  • 顧客區分 → 類別
  • 地域 → 類別
  • 產業 → 類別

實務資料中,類別變數比數值變數更多也不罕見。

然而機器學習模型無法直接處理像這樣的字串:

Starter
Business
Pro

因此必須透過某種方式將類別變數轉換成數值。

這就是 CatBoost 的出發點。

隨機森林:許多彼此獨立的樹

隨機森林是由許多決策樹獨立建立,並將結果做平均的模型。

image.png

每一棵樹都會經過以下步驟:

  1. 隨機抽樣資料集
  2. 在分裂時隨機選擇變數(特徵)
  3. 每一棵樹各自輸出預測結果

最後的預測,只是透過這些結果的平均值(回歸)或多數決(分類)來決定。

其中一個重要概念是:透過使用許多彼此獨立的樹,與單一樹(決策樹)相比,可以降低變異並提升穩定性。

不過,每一棵樹彼此之間並不會相互學習。

因此,和較新的 boosting 系列模型相比,通常較不容易達到高精度。

XGBoost:修正錯誤的樹

XGBoost 使用的是 梯度提升(Gradient Boosting) 手法。它不是建立彼此獨立的樹,而是依序建立樹來修正前一棵樹所犯的錯誤。

image.png

首先建立第一棵樹並做預測,接著計算誤差(或損失)。如果是回歸問題,誤差就是實際值與預測值之間的差,也就是「殘差」。這就是所謂的「梯度(Gradient)」。

行實際值預測值梯度(殘差)11073215141389-1下一棵樹不是去預測實際值本身,而是去預測這個梯度值。因為梯度會告訴模型,為了降低損失,預測結果應該往哪個方向調整。

然後,把第一棵樹的預測值與第二棵樹的預測值組合起來,作為新的模型預測值。

新預測值 = 第一棵樹的預測結果 + 學習率 × 第二棵樹的預測結果

概念上,模型會像這樣逐步演進:

第一棵樹 → 最初的預測
第二棵樹 → 修正第一棵樹的預測錯誤
第三棵樹 → 修正目前為止所有樹的預測錯誤
第四棵樹 → 持續修正

透過這個流程,通常可以得到比隨機森林更高精度的模型。

不過,隨著資料集變大,這種 boosting 型學習方法,也就是一棵一棵依序建立大量樹的方式,會產生非常高的計算成本。


LightGBM:追求高速化的模型

這時候就出現了 LightGBM。這個模型同樣是 XGBoost 一樣的 boosting 系列模型,但它是為了「更快、也能處理更大規模的資料」而開發的。

因此,在建立樹的時候,

  • 直方圖分裂
  • Leaf-wise 生長
  • GOSS
  • EFB

等各種技巧都被用上了。

尤其在以下情況中,

  • 資料筆數很多
  • 說明變數很多
  • 學習速度很重要

它在效能上能發揮非常大的優勢,因此目前也是實務上最常使用的機器學習模型之一。

詳細內容請參考這篇文章。


CatBoost 有什麼不同?

接著登場的就是 CatBoost。這個模型和 XGBoost、LightGBM 一樣,也是 boosting 系列模型,因此基本的學習流程也和 XGBoost、LightGBM 相同。

但它最大的特點在於,它是為了「更好地處理類別變數」而設計的。

特別是在以下這類類別數非常多的變數,也就是高基數變數(high cardinality variables)上,效果特別明顯:

  • 商品類別
  • 活動
  • 地區
  • 店鋪
  • 使用者使用的功能

One-Hot Encoding 的問題

處理類別變數最常見的方法是 One-Hot Encoding。

例如,訂閱方案資料原本可能是這樣:

PlanStarterProBusiness透過把每個值展開成欄位,可以轉換成以下資料:

StarterProBusiness100010001當類別數很少時,這通常沒什麼問題。

但是如果:

  • 商品類別有 500 種
  • 地區有 1000 種

就會需要建立大量欄位。

這樣會導致:

  • 記憶體消耗增加
  • 學習速度變慢
  • 更容易過擬合

等問題。

Target Encoding 這種想法

在 CatBoost 出現之前,為了處理這類問題,常使用的是目標編碼(Target Encoding)。

例如,

方案流失率Starter67%Business0%也就是用每個類別對應的目標變數彙總值(比例或平均值)來取代原本的類別。

這樣一來,就能直接把這種資訊提供給模型:

Starter 的顧客比較容易流失

但是這種做法有很大的陷阱。

資訊洩漏(Leakage)問題

例如,假設有以下資料。

顧客方案流失AStarter1BStarter0CStarter1如前面所示,如果彙總各方案的流失率,Starter 的流失率就是 67%(2 / 3 = 66.66...)。

於是替顧客 A 指派:

Starter → 0.67

但問題在這裡。

因為在計算這個 67% 的值時,有使用到「流失」這個變數。這代表這個數值已經包含了模型答案,也就是流失資訊。

換句話說,就是用正解來建立說明變數。

這就是所謂的資訊洩漏(leakage)問題。只要有這個問題,模型在訓練資料上看起來可能很準,但到了正式資料上卻無法好好預測。

Ordered Target Statistics(順序式目標統計量)

CatBoost 為了避免資訊洩漏(leakage)問題,使用了名為「Ordered Target Statistics(順序式目標統計量)」的方法。

簡單來說,就是「只使用排在自己前面的資料列來計算類別統計量」。

我們用剛才的例子來看。

假設資料是以隨機順序排列如下:

順序顧客方案流失1AStarter12BStarter03CStarter14DStarter1另外,假設事前資訊(Prior)是整體平均流失率 50%。

CatBoost 會把這個「方案」類別變數轉換成如下形式:

順序顧客方案流失轉換後的值1AStarter10.502BStarter01.003CStarter10.504DStarter10.67到底發生了什麼事?

顧客 A 的情況

A 前面沒有任何 Starter 顧客。

因此會使用作為事前資訊設定的 50%。

A → 沒有 Starter 的過去資料 → 使用 0.50

顧客 B 的情況

B 前面的 Starter 顧客只有 A。

B → 過去的 Starter 顧客只有 A → 流失率 = 1 / 1 = 1.00

顧客 C 的情況

C 前面有 A 和 B。

C → 過去的 Starter 顧客有 A、B → 流失率 = (1 + 0) / 2 = 0.50

顧客 D 的情況

D 前面有 A、B、C。

D → 過去的 Starter 顧客有 A、B、C → 流失率 = (1 + 0 + 1) / 3 = 0.67

重點在於,計算每一列的轉換值時,沒有使用那一列自己本身的目標變數。

例如:

  • 顧客 C 的轉換值只使用 A 和 B
  • 顧客 D 的轉換值只使用 A、B、C

因此,雖然能夠利用到這樣有用的資訊:

「Starter 方案比較容易流失」

同時也能避免:

「把自己的答案混進說明變數裡」

這就是 CatBoost 的「Ordered Target Statistics(順序式目標統計量)」概念。

Ordered Boosting(順序式提升)

CatBoost 也有一套稱為 Ordered Boosting(順序式提升)的機制。

一般的 Gradient Boosting 會先用整個訓練資料建立模型,然後再對同一份訓練資料做預測、計算誤差,接著再建立下一棵樹來修正這個誤差。

乍看之下很合理,但其中其實有一個微妙的問題。

當你要預測訓練資料中的某一列時,那一列本身也已經被拿去訓練模型了。也就是說,訓練時是在「已經看過那一列」的模型上做預測。

但在正式環境中,預測的是尚未知道答案的未知資料。這時模型並沒有用那一列來訓練。

像這樣,訓練時的預測與正式預測之間條件稍微不同的現象,就稱為 Prediction Shift(預測位移)。

CatBoost 為了減少這種差異,會把資料打亂順序,並在預測每一列時,只使用排在該列前面的資料所建立的模型來進行預測。

例如,若資料順序是 A、B、C、D,那麼在計算 C 的誤差時,會使用只由 A 和 B 建立的模型來預測 C。C 本身的正解不會用在那次預測中。

這樣就能讓訓練時的預測,更接近正式環境中對未知資料做預測的情境。

Ordered Boosting 的優點,是可以抑制模型過度貼合訓練資料,讓它在測試資料或正式資料上更穩定地做出預測。

如果說 Ordered Target Statistics(順序式目標統計量) 是防止「轉換類別變數時的資訊洩漏」,那麼 Ordered Boosting(順序式提升) 就是抑制「以 boosting 學習誤差時的預測位移」。

而這兩種方法,也正是 CatBoost 能在類別變數很多的資料上表現優異的重要原因。

Symmetric Trees(對稱樹)

CatBoost 的另一個特色,是使用 Symmetric Trees(對稱樹)

一般決策樹可以針對不同分支選擇不同的分裂條件。

          Root
         /    \
      條件A   條件B
      /  \     /  \
   條件C 條件D 條件E 條件F

而 CatBoost 的對稱樹,則是在同一深度的節點使用相同的分裂條件。

             Root
            /    \
         條件A    條件A
        /  \      /  \
     條件B 條件B 條件B 條件B

這種設計一開始看起來可能會覺得不夠有效率。的確,只看單棵樹的話,能針對各分支自由選條件的一般決策樹比較靈活。

但 CatBoost 並不是要做出「一棵完美的樹」,而是要透過 許多小樹相加的 boosting 模型 來達成。

也就是說,不需要讓單一棵樹表現全部能力。

第一棵樹先抓住大方向,第二棵樹修正剩下的誤差,第三棵樹以後再補上更細的模式,這才是 boosting 模型的做法。

因此,對稱樹單棵樹彈性較低的缺點,可以透過 把很多棵樹組合起來 來補足。這就是 CatBoost 的設計思路。

而且,採用這種對稱樹後,樹的結構更簡單,預測速度更快,記憶體效率也更好。同時,限制樹的自由度也有助於抑制過度擬合。

也就是說,CatBoost 是以接受對稱樹的限制為代價,換來了:

  • 預測速度快
  • 記憶體效率佳
  • 樹結構簡單且較穩定
  • 較容易抑制過擬合
  • 可透過大量樹的加總來補足表現力

CatBoost 也無法完全避免的資訊洩漏

看到這裡,很容易會想:

「那 CatBoost 不就能完全防止資訊洩漏了嗎?」

但很遺憾,不能這樣說。

因為 CatBoost 能防止的,是 源自 Target Encoding 的資訊洩漏

如果資料本身就包含了只有未來才知道的資訊,那麼 CatBoost 也無法阻止。

例如在顧客流失預測中,若你把以下變數拿來當說明變數:

  • 流失日期
  • 流失後的退款金額
  • 流失後的客服諮詢次數
  • 最終帳單狀態
  • 流失原因

這些都是在流失之後才會知道的資訊。只要使用這些變數,不論是什麼模型,都可能出現異常高的預測準確率。

因此,「只能使用在預測當下可取得的資訊作為說明變數」這個基本原則,在 CatBoost 中也一樣成立。

XGBoost 與 LightGBM 的類別變數處理差異

話說回來,XGBoost 和 LightGBM 在使用類別變數時,也不代表一定會發生資訊洩漏。其實,XGBoost 和 LightGBM 也都有機制,可以在避免這類問題的同時,將類別變數作為說明變數使用。

以下是 R 的實作;在 Exploratory 中使用時也是相同概念。

模型類別變數的轉換XGBoost將類別分組後進行分裂(也可使用 One-Hot)LightGBM將類別分組後進行分裂CatBoost使用 ordered target statistics 與 ordered boosting例如,LightGBM 會在學習分裂時,將類別分組。

Plan in {Starter, Pro}

vs

Plan in {Business, Enterprise}

接著建立如下分支:

if Plan is Starter or Pro:
    go left
else if Plan is Business or Enterprise:
    go right

另一方面,CatBoost 則會利用像這樣的統計量:

Starter

↓

過去 Starter 使用者的平均流失率

重點是,XGBoost、LightGBM 與 CatBoost 對類別變數的處理方式各不相同。

LightGBM 重視學習速度與擴充性,而 CatBoost 則重視類別變數的活用與資訊洩漏對策。

CatBoost 擅長的資料

CatBoost 對以下這類資料特別有效:

顧客資料

  • 顧客區隔
  • 地區
  • 產業
  • 方案

行銷資料

  • 廣告管道
  • 活動 ID
  • 流入來源

商品資料

  • 商品類別
  • 品牌
  • SKU

問卷資料

  • 屬性資訊
  • 回答類別
  • 區隔資訊

該選哪個模型比較好?

最後來看,隨機森林、XGBoost、LightGBM、CatBoost 到底該選哪一個模型?

基本上,通常是先做出模型,再看預測精度並調整參數,選出表現好的模型。不過,第一次要選哪個模型,有時候還是會讓人猶豫。

這種時候,可以用下面這樣的方式來思考:

情境建議先簡單試試看隨機森林想追求高精度XGBoost大規模資料LightGBM類別變數很多CatBoost這個列表沒有把統計學習模型(線性迴歸、邏輯斯迴歸、GLM 等)或決策樹算進去。

另外,再次強調,以下這些資料通常包含很多類別變數,所以如果你正在處理這類資料,CatBoost 很值得一試:

  • 顧客資料
  • 行銷資料
  • 問卷資料
  • SaaS 資料

總結

以下四種模型都是以決策樹為基礎的集成學習,但各自的設計思路不同。

  • 隨機森林 → 重視穩定性
  • XGBoost → 重視預測精度
  • LightGBM → 重視速度與規模
  • CatBoost → 重視類別變數

CatBoost 最大的特點是:

能在活用類別變數資訊的同時,抑制 Target Encoding 常見的資訊洩漏

因此,在顧客分析、行銷分析、問卷分析等類別變數很多的業務資料中,是非常有力的選擇。

如果你只用過 LightGBM 或 XGBoost,不妨也試試看 CatBoost。

說不定會得到比你預期更高的預測表現。


在 Exploratory 中試用 CatBoost

Exploratory 自 v15.5 起新增了對 CatBoost 的支援。

image.png

在分析檢視下,可以透過 UI 輕鬆建立 CatBoost 模型。

  1. 開啟分析檢視
  2. 選擇 CatBoost
  3. 指定目標變數
  4. 指定說明變數
  5. 點擊「執行」按鈕

此外,也可以從「設定」對話框中進行參數調校,在抑制過擬合的同時提升預測精度。

image.png

如果你正在處理大量類別變數的資料,不妨試著用看看。

你可以透過以下連結下載 Exploratory 最新版 v15.5,立即開始使用 CatBoost。

👉 下載 Exploratory 最新版

https://exploratory.io/download

如果你還沒有帳號,也可以從這裡註冊,開始 30 天免費試用

https://exploratory.io/

即使試用期已經結束,只要啟動最新版並點擊「延長試用」,仍然可以繼續體驗。

在資料科學 Bootcamp 中更實務地學習機器學習

像 CatBoost 這樣的機器學習模型,光是知道怎麼使用是不夠的。

更重要的是,要能依據資料特性選擇適當的模型、正確解讀結果,並在需要時調整參數,實際連結到決策上。

在 Exploratory 的「資料科學 Bootcamp」中,不只能學到包含 CatBoost 在內的機器學習模型分析,也能在 3 天內密集學習統計學、資料處理、視覺化、以及分析結果解讀等,資料科學所需的實務技能。

在這個 Bootcamp 中,你會實際動手學會 AI 時代所需的資料科學能力,例如:

  • 統計學素養
  • 科學思維
  • 資料整理與加工能力
  • 透過視覺化掌握資料特徵的能力
  • 使用統計模型與機器學習模型進行分析
  • 解讀分析結果並連結到決策的能力

不只是學工具操作,而是會完整體驗從提出問題、準備資料、視覺化、分析,到如何解讀結果的一整套流程。

如果你希望在實務資料分析中更有信心地使用 CatBoost 或 LightGBM 等機器學習模型,歡迎參考以下頁面。

👉 查看資料科學 Bootcamp 詳情


原文出處:https://qiita.com/KanNishida/items/72a7fd6854e99506cdff


精選技術文章翻譯,幫助開發者持續吸收新知。

共有 0 則留言


精選技術文章翻譯,幫助開發者持續吸收新知。
🏆 本月排行榜
🥇
站長阿川
📝6   💬2  
342
🥈
我愛JS
💬1  
3
評分標準:發文×10 + 留言×3 + 獲讚×5 + 點讚×1 + 瀏覽數÷10
本數據每小時更新一次
📢 贊助商廣告 · 我要刊登