標籤:

利用TPOT完成自動化機器學習

首先,什麼是自動化機器學習?

正如Sebastian Raschka描述的那樣,假如說計算機程序是關於自動化的,那麼機器學習可以看做是「關於自動化的自動化」。那麼自動化機器學習就是關於自動化的自動化的自動化。程序通過管理重複的任務來減輕我們的壓力;機器學習幫助計算機如何最好的處理這些重複的任務;自動化機器學習幫助計算機學習如何優化上面的結果。

這種思想很有用處,儘管我們之前會擔心調超參數。自動化機器學習通過嘗試一些列不同的方法,最終會採用最好的方式來調參,從而得到最優的結果。


TPOT是一種基於遺傳演算法優化機器學習管道(pipeline)的Python自動機器學習工具。簡單來說,就是TPOT可以智能地探索數千個可能的pipeline,為數據集找到最好的pipeline,從而實現機器學習中最乏味的部分。

從下圖中我們可以看到,TPOT可以自動地完成特徵工作(特徵選擇,特徵預處理,特徵構建等),同時也可以進行模型的選擇和參數的調優。

機器學習pipeline

更重要地是,一旦TPOT完成搜索,TPOT同時也提供了Python代碼。通過這個代碼,我們可以具體地知道TPOT獲得最優性能時的具體pipeline的內容,這對於後續修改是十分方便的!

TPOT——pipeline


使用TPOT

?TPOT代碼

在官方文檔的基礎上,自己整理出了如下的內容。

TPOT的介面,與scikit-learn很類似。

TPOT可以像任何常規的Python模塊一樣導入:

from tpot import TPOTClassifier

然後創建一個TPOT實例如下:

pipeline_optimizer = TPOTClassifier()

當然,TPOTRegressor()也可以。

一些帶有定製TPOT參數的示例代碼可能如下:

pipeline_optimizer = TPOTClassifier(generations=5, population_size=20, cv=5, random_state=42, verbosity=2)

現在,可以利用fit函數來尋找最優的管道:

pipeline_optimizer.fit(X_train, y_train)

fit函數初始化了遺傳演算法,以找到基於平均k倍交叉驗證的最高評分管道,然後對整個提供的樣本進行訓練,TPOT實例可以作為一個合適的模型使用。

然後,可以使用score函數來評估測試集中的最終管道:

print(pipeline_optimizer.score(X_test, y_test))

最後,可以把TPOT將相應的Python代碼導出到文本文件中:

pipeline_optimizer.export(tpot_exported_pipeline.py)

下面是一個完整的示例腳本,使用TPOT優化管道,對其進行評分,並將最好的管道導出到文件中。

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)

pipeline_optimizer = TPOTClassifier(generations=5, population_size=20, cv=5,
random_state=42, verbosity=2)
pipeline_optimizer.fit(X_train, y_train)
print(pipeline_optimizer.score(X_test, y_test))
pipeline_optimizer.export(tpot_exported_pipeline.py)

?評估函數

TPOT允許自定義評分函數。具體例子可以參看Scoring Functions。

?內置TPOT配置

TPOT提供了一些默認的操作符和參數配置,它可以很好地優化機器學習管道。下面是TPOT當前內置配置的列表。它有4種:

  • Default TPOT:默認的參數,在一些大數據集上可能需要較長時間。
  • TPOT light:與Default TPOT相比,使用了更簡單、快速運行的操作符,因此TPOT light對於查找用於分類或回歸問題的快速簡單的管道非常有用。
  • TPOT MDR:專門用於全基因組關聯研究(GWAS)
  • TPOT sparse:帶有one-hot編碼,且支持稀疏矩陣。

?定製TPOT的操作符和參數

除了TPOT所帶來的默認配置之外,在某些情況下,限制TPOT所考慮的演算法和參數是很有用的(用於減少尋優的時間等)。出於這個原因,TPOT允許用戶為TPOT提供其操作符和參數的自定義配置。

自定義TPOT配置必須採用嵌套字典格式,舉一個例子

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)

tpot_config = {
sklearn.naive_bayes.GaussianNB: {
},

sklearn.naive_bayes.BernoulliNB: {
alpha: [1e-3, 1e-2, 1e-1, 1., 10., 100.],
fit_prior: [True, False]
},

sklearn.naive_bayes.MultinomialNB: {
alpha: [1e-3, 1e-2, 1e-1, 1., 10., 100.],
fit_prior: [True, False]
}
}

tpot = TPOTClassifier(generations=5, population_size=20, verbosity=2,
config_dict=tpot_config)
tpot.fit(X_train, y_train)
print(tpot.score(X_test, y_test))
tpot.export(tpot_mnist_pipeline.py)

這樣,TPOT尋找最優的pipeline,就只會在tpot_config中尋找了,無疑大大減少了時間複雜度,當然,準確性能會下降。

?NOTE

搜索整個管道空間是特別耗時的。認識到原因是必要的,在默認的TPOT參數下(100 generations with 100 population size),TPOT將在完成前評估1萬個管道配置。考慮一個網格搜索1萬個超參數組合用於機器學習演算法以及網格搜索需要多長時間。用10倍的交叉驗證來評估這1萬個模型,這意味著大約有10萬個模型在一個網格搜索的訓練數據中被匹配和評估。這是一個耗時的過程,即使對於像決策樹這樣的簡單模型也是如此。

典型的TPOT運行將需要數小時到數天才能完成(除非是一個小數據集),但是可以中斷運行,並看到目前為止最好的結果。TPOT還提供warm_start參數,可以從中斷的地方重新啟動之前運行的TPOT。


TPOT API

以TPOTRegressor為例,分類問題一樣。

class tpot.TPOTRegressor(generations=100, population_size=100,

offspring_size=None, mutation_rate=0.9,

crossover_rate=0.1,

scoring=neg_mean_squared_error, cv=5,

subsample=1.0, n_jobs=1,

max_time_mins=None, max_eval_time_mins=5,

random_state=None, config_dict=None,

warm_start=False,

memory=None,

periodic_checkpoint_folder=None,

early_stop=None,

verbosity=0,

disable_update_check=False)

在默認情況下,TPOTRegressor將搜索廣泛的監督的回歸模型,包括預處理,特徵選擇,學習器和它們的超參數。當然,TPOTRegressor可以完全自己定製。

參數,屬性和方法的詳情可以參考如下。

下面列出主要的參數和方法:

參數:

  • generations: int, optional (default=100),運行管道優化過程的迭代次數。一定是正數。

一般來說,值越大,性能越好。

TPOT將評估population_size+generations×offspring_size的規模。

  • population_size: int, optional (default=100),在每一代遺傳中保留的個體數。一定是正數。

一般來說,值越大,性能越好。

  • offspring_size: int, optional (default=100),在每一次遺傳過程中產生的後代數量。一定是正數。
  • mutation_rate: float, optional (default=0.9),變異率,採用默認值即可。
  • crossover_rate: float, optional (default=0.1),交叉率,採用默認值即可。
  • scoring: string or callable, optional (default=neg_mean_squared_error),回歸問題中用於評估給定管道的質量的函數。可以使用以下內置評分函數:

neg_median_absolute_error, neg_mean_absolute_error, neg_mean_squared_error, r2

  • cv: int, cross-validation generator, or an iterable, optional (default=5)
  • subsample: float, optional (default=1.0),在TPOT優化過程中使用的訓練樣本的比例。必須在0到1之間。
  • n_jobs: integer, optional (default=1)
  • max_time_mins: integer or None, optional (default=None),TPOT需要多少分鐘來優化管道。
  • max_eval_time_mins: integer, optional (default=5),TPOT需要多少分鐘來評估一個管道。
  • random_state: integer or None, optional (default=None),使用這個參數來確保TPOT每次運行時都會有相同的結果。
  • config_dict: Python dictionary, string, or None, optional (default=None),用於定製TPOT在優化過程中搜索的操作符和參數的配置字典。
  • warm_start: boolean, optional (default=False),表明TPOT實例是否會重用以前調用fit()的入口。
  • early_stop: integer, optional (default: None)
  • verbosity: integer, optional (default=0),

0,TPOT將不會列印任何東西,

1,將列印很少的信息,

2,TPOT將會列印更多的信息並提供一個進度條

3,TPOT將列印所有內容,並提供一個進度條

方法:

  • fit(features, target, sample_weight=None, groups=None),在給定的訓練數據上運行TPOT優化過程。
  • predict(features),使用優化的管道來預測測試集的目標值。
  • score(testing_features, testing_target),使用用戶指定的評分函數在給定的測試數據上返回優化的管道的得分。
  • export(output_file_name),將優化的管道導出為Python代碼。

參考文獻

【1】TPOT官方文檔

【2】TPOT github


Q&A

1、如果在導出的python文件中,pipeline是這麼定義的:

exported_pipeline = make_pipeline(

StackingEstimator(estimator=RidgeCV()),

PolynomialFeatures(degree=2, include_bias=False, interaction_only=False),

StackingEstimator(estimator=LassoLarsCV(normalize=True)),

StackingEstimator(estimator=XGBRegressor(learning_rate=0.1, max_depth=2, min_child_weight=4, n_estimators=100, nthread=1, subsample=0.5)),

ExtraTreesRegressor(bootstrap=True, max_features=0.45, min_samples_leaf=6, min_samples_split=15, n_estimators=100)

)

那麼具體執行的順序是什麼呢?

A:

raw attributes -> RidgeCV -> 1st prediction

raw attributes + 1st predictions-> PolynomialFeatures -> 1st transformed attributes --> LassoLarsCV -> 2nd predictions

1st transformed attributes + 2nd predictions -> XGBRegressor -> 3rd predictions

1st transformed attributes + 2nd predictions + 3rd predictions -> ExtraTreesRegressor -> final predictions

參考

推薦閱讀:

TAG:機器學習 |