自動化模型選擇與調參神器:TPOT的使用指南(Tree-based Pipeline Optimization Tool)

TPOT (Tree-based Pipeline Optimization Tool) 是一個自動化機器學習(AutoML)的 Python 工具,主要是希望簡化機器學習模型的建模過程,TPOT利用遺傳編程來自動設計和優化機器學習管道,讓非專業的資料科學研究人員也能輕鬆使用機器學習技術。

TPOT 從2015年開始,由賓夕法尼亞大學的 Dr. Randal Olson 和他的團隊所建立,在最一開始是希望通過自動化機器學習的過程,幫助使用者更有效地尋找最佳的模型和參數配置;TPOT 的核心架構是結合靈活的表達樹表示法和隨機搜索算法,並以自動化機器學習管道的建構

遺傳編程(Genetic Programming, GP)是一種模仿生物進化過程的計算方法,旨在自動生成和優化計算機程序以解決特定任務。當應用於機器學習管道的設計和優化時,這種方法可以自動選擇和組合不同的數據處理和機器學習模型,以達到最佳的預測性能。

TPOT 的核心架構

表達樹表示法(expression tree representation)

圖片來源: Day-22 樹(Tree), 二元搜尋樹(Binary Search Tree)

在遺傳演算法當中,通常會以樹狀結構來表示,這種結構稱為表達樹(Expression Tree),每個節點(node)代表一個操作符(如加法、乘法等)或變量,樹的葉子節點則代表輸入數據的特徵。

而表達樹表示法的優勢在於:

  • 靈活性:可以解釋複雜的數學運算和邏輯關係,方便自動生成和修改。
  • 可解釋性:樹狀結構能讓建構的模型更容易理解和解釋,因為可以直觀地看到資料是如何被處理的。

遺傳編程(Genetic Programming, GP)

圖片來源: 基於圖的遺傳編程示意圖

遺傳編程是屬於隨機搜索算法其中的一種算法,遺傳編程的核心思想是通過模擬自然選擇和基因突變的過程來進行優化。

遺傳編程的基本概念包括以下幾個步驟:

  1. 初始化:隨機生成一組可能的解(程式或者模型)。
  2. 適應度評估:根據特定的性能指標(例如如分類準確率)來評估每個解的表現。
  3. 選擇:根據適應度選擇表現較好的解進行繁殖。
  4. 交叉與變異:通過交叉(組合兩個解的特徵)和變異(隨機改變某些特徵)生成新的解。
  5. 迭代:重複適應度評估、選擇、交叉和變異的過程,一直到達到預定的停止條件(如達到特 定的準確率或經過一定的代數)。

TPOT的機器學習管道介紹

TPOT 可以自動選擇資料預處理方法、特徵選擇技術和機器學習演算法,並調整模型的超參數(Hyperparameter),能夠最大化提升模型的性能。執行TPOT的整個過程不需要手動調整,有效降低資料分析人員對建立機器學習模型專業知識的要求,提高了效率。

TPOT 的基本的工作流程包含:

  • 資料預處理(Data Cleaning):自動選擇適合的資料預處理技術,如標準化、降維等等。
  • 模型選擇(Feature Selection):根據資料特性,自動選擇最適合的機器學習模型。
  • 超參數優化(Parameter Optimization):自動調整模型的超參數,以進一步提升性能。
圖片來源: Tree-based Pipeline Optimization Tool

TPOT的優缺點

對初學者或相關領域的使用者來說,其優點為:

  • 更好的全局搜索能力:隨機搜索算法能夠在較大的空間中進行探索,降低陷入局部最佳解(The problem of local optima)的風險。
  • 自動化生成模型:自動化系統能夠自動生成多種模型和超參數調整,節省了大量的時間和精力。
  • 高效性:TPOT模型的設計和優化過程因為設計成自動化求解,減少了人工調整參數的需求,進一部提高了效率。
  • 持續更新:TPOT的開發團隊不斷進行改進和功能擴展,保持其在自動化機器學習領域的競爭力,同時現在也有推出TPOT2的版本。
  • 易於使用:即使是非專業的人也能夠通過簡單的方式使用TPOT,降低了機器學習的入門門檻。
  • 靈活性:TPOT支援非常多種的機器學習算法,讓使用者可以依據需求進行調整。

缺點

  • 計算資源需求較高:TPOT在進行運算的過程中需要大量的運算資源,特別是對於大型資料集,會需要較長的運算時間。
  • 結果解釋性差:由於TPOT生成的模型都較為複雜,\對不熟悉模型的人來說,模型的解釋性會較為不足。
  • 較依賴於資料品質:TPOT的性能在很大程度上依賴於輸入資料的品質,資料混亂程度或資料的不平衡可能影響最終模型的效果

TPOT進行分類與迴歸分模型的實作

大家可以使用我分享的colab環境來執行以下的程式碼,分類模型的部分會使用手寫數字資料集(load_digits())。

# 首先安裝需要的套件
from tpot import TPOTClassifier
from sklearn.datasets import load_digits
from sklearn.model_selection import train_test_split

# 載入手寫數字資料集
digits = load_digits()

# 進行75%:25%的訓練集:測試集分割
X_train, X_test, y_train, y_test = train_test_split(digits.data, digits.target, train_size=0.75, test_size=0.25, random_state=28)

# 建立TPOTClassifier模型,後面可以使用預設的超參數
tpot = TPOTClassifier(generations=5, population_size=50, verbosity=2, random_state=28)

# 擬合模型
tpot.fit(X_train, y_train)

# 打印出測試集的準確度
print(tpot.score(X_test, y_test))

# 最後將模型的架構導入到'tpot_digits_pipeline.py'這個檔案
tpot.export('tpot_digits_pipeline.py')

我們在colab上要叫出tpot_digits_pipeline.py檔案,需要寫一小段code

# 打開儲存出來的tpot_digits_pipeline.py檔案
with open('/content/tpot_digits_pipeline.py', 'r') as file:
    content = file.read()
    print(content)

tpot_digits_pipeline.py當中輸出的結果會向下圖呈現的樣子,主要就是將最佳化的模型配置寫出來,可以看到在exported_pipeline變數當中就是它找到最好的模型架構,使用的模型是KNeighborsClassifier。

迴歸模型的部分使用的是波士頓房價(load_boston())的預測

# 首先安裝需要的套件
import pandas as pd
import numpy as np
from tpot import TPOTRegressor
from sklearn.model_selection import train_test_split

# 載入波士頓房價資料集
data_url = "http://lib.stat.cmu.edu/datasets/boston"
raw_df = pd.read_csv(data_url, sep="\s+", skiprows=22, header=None)
housing = np.hstack([raw_df.values[::2, :], raw_df.values[1::2, :2]])
target = raw_df.values[1::2, 2]

X_train, X_test, y_train, y_test = train_test_split(housing, target, train_size=0.75, test_size=0.25, random_state=42)

# 進行75%:25%的訓練集:測試集分割
X_train, X_test, y_train, y_test = train_test_split(housing.data, housing.target, train_size=0.75, test_size=0.25, random_state=28)

# 建立TPOTRegressor模型,後面可以使用預設的超參數
tpot = TPOTRegressor(generations=5, population_size=50, verbosity=2, random_state=28)

# 擬合模型
tpot.fit(X_train, y_train)

# 打印出測試集的準確度
print(tpot.score(X_test, y_test))

# 最後將模型的架構導入到'tpot_boston_pipeline.py'這個檔案
tpot.export('tpot_boston_pipeline.py')

我們在colab上要叫出tpot_boston_pipeline.py檔案,需要寫一小段code

# 打開儲存出來的tpot_boston_pipeline.py檔案
with open('/content/tpot_boston_pipeline.py', 'r') as file:
    content = file.read()
    print(content)

tpot_boston_pipeline.py當中輸出的結果會像是下圖呈現的樣子,主要就是將最佳化的模型配置寫出來,可以看到在exported_pipeline變數當中就是它找到最好的模型架構,使用的模型是DecisionTreeRegressor。

麥特主要使用TPOT的時機都是在拿到新資料的時候,可以先使用TPOTClassifier或TPOTRegressor來簡單的跑一遍模型,可以大概知道什麼樣的模型架構有更好的預測能力,之後再將存出來的模型架構進行調整超參數,可以省下不少自己重頭清洗資料、特徵工程、特徵選擇、模型篩選,超參數優化等等的工作,但不表示使用TPOP就一定會是最佳解的模型,還是需要每位開發人員多方面的測試過後才能得到最佳模型唷~

希望大家可以玩玩看TPOP這個套件,使用少少的幾行code就可以建立預測能力不錯的模型!

參考資料

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *