1. 程式人生 > >初識TPOT:一個基於Python的自動化機器學習開發工具

初識TPOT:一個基於Python的自動化機器學習開發工具

1. TPOT介紹

一般來講,建立一個機器學習模型需要經歷以下幾步:

  • 資料預處理
  • 特徵工程
  • 模型選擇
  • 超引數調整
  • 模型儲存

本文介紹一個基於遺傳演算法的快速模型選擇及調參的方法,TPOT:一種基於Python的自動機器學習開發工具。專案原始碼位於:https://github.com/EpistasisLab/tpot

下圖是一個機器學習模型開發圖,其中灰色部分代表TPOT將要做的事情:即通過利用遺傳演算法,分析數千種可能的組合,為模型、引數找到最佳的組合,從而自動化機器學習中的模型選擇及調參部分。

使用TPOT(版本0.9.5)開發模型需要把握以下幾點:

  1. 在使用TPOT進行建模前需要對資料進行必要的清洗和特徵工程操作。
  2. TPOT目前只能做有監督學習。
  3. TPOT目前支援的分類器主要有貝葉斯、決策樹、整合樹、SVM、KNN、線性模型、xgboost。
  4. TPOT目前支援的迴歸器主要有決策樹、整合樹、線性模型、xgboost。
  5. TPOT會對輸入的資料做進一步處理操作,例如二值化、聚類、降維、標準化、正則化、獨熱編碼操作等。
  6. 根據模型效果,TPOT會對輸入特徵做特徵選擇操作,包括基於樹模型、基於方差、基於F-值的百分比。
  7. 可以通過export()方法把訓練過程匯出為形式為sklearn pipeline的.py檔案

2. TPOT實現模型訓練

下面是一個使用TPOT對MNIST資料集進行模型訓練的例子:

# -*- coding: utf-8 -*-
""" @author: wangkang @file: start_tpot.py @time: 2018/11/9 11:21 @desc: TPOT 實踐 """ import time from tpot import TPOTClassifier from sklearn.datasets import load_digits from sklearn.model_selection import train_test_split # 載入資料集 digits = load_digits() X_train, X_test, y_train, y_test = train_test_split(digits.data, digits.target, train_size
=0.75, test_size=0.25) start = time.time() """ generations:執行管道優化過程的迭代次數 population_size:在遺傳進化中每一代要保留的個體數量 verbosity: TPOT執行時能傳遞多少資訊 """ # 使用TPOT初始化分類器模型 tpot = TPOTClassifier(generations=5, population_size=20, verbosity=0) # 模型訓練 tpot.fit(X_train, y_train) print(tpot.score(X_test, y_test)) print('找到最優模型與超引數耗時:', time.time() - start) # 分類器其模型儲存為 .py tpot.export('tpot_mnist_pipeline.py')

執行結果如下所示:

 

可以觀察到,經過5次遺傳進化,找到了此範圍內得分最高的模型及引數組合!但觀察程式碼耗時發現,在i5-7500 CPU @ 3.40GHz條件下,這5次迭代,共耗時1297 S。

我們可以開啟生成的 tpot_mnist_pipeline.py 檔案,如下所示:

import numpy as np
import pandas as pd
from sklearn.ensemble import ExtraTreesClassifier, GradientBoostingClassifier
from sklearn.feature_selection import VarianceThreshold
from sklearn.model_selection import train_test_split
from sklearn.pipeline import make_pipeline, make_union
from tpot.builtins import StackingEstimator

"""
# NOTE: Make sure that the class is labeled 'target' in the data file
tpot_data = pd.read_csv('PATH/TO/DATA/FILE', sep='COLUMN_SEPARATOR', dtype=np.float64)
features = tpot_data.drop('target', axis=1).values
training_features, testing_features, training_target, testing_target = \
    train_test_split(features, tpot_data['target'].values, random_state=None)
"""

# 以上程式碼需修改為下面形式以供正確執行
from sklearn.datasets import load_digits

digits = load_digits()
X = digits.data
y = digits.target

training_features, testing_features, training_target, testing_target = \
    train_test_split(X, y, random_state=None)

# 此為由TPOT遺傳演算法得到的最優模型及引數組合
# Average CV score on the training set was:0.9792963424938936
exported_pipeline = make_pipeline(    PolynomialFeatures(degree=2, include_bias=False, interaction_only=False),    ZeroCount(),    LinearSVC(C=0.5, dual=True, loss="squared_hinge", penalty="l2", tol=0.001))
exported_pipeline.fit(training_features, training_target) results = exported_pipeline.predict(testing_features) print(results)

可以發現,訓練好的模型以pipeline的形式儲存(未進行持久化儲存)。這樣,整個關於MNIST資料集的分類器就訓練完成了。

3. 總結

1、通過簡單瀏覽原始碼發現,TPOT是在sklearn的基礎之上做的封裝庫。其主要封裝了sklearn的模型相關模組、processesing模組和feature_selection模組,所以TPOT的主要功能是集中在使用pipeline的方式完成模型的資料預處理、特徵選擇和模型選擇方面。此外,我們還發現了TPOT已經對xgboost進行了支援。

2、雖然TPOT使用遺傳演算法代替了傳統的網格搜尋進行超引數選擇,但由於預設初始值的隨機性,在少量的進化(迭代)次數下,TPOT最終選擇的模型往往並不相同。

3、計算效率問題。作者在程式碼中寫道:進化(迭代)次數和每一代保留的個體數量值越多,最終得模型得分會越高。但這同樣也會導致耗時很長。