1. 程式人生 > >Transmogrify.AI automl 庫

Transmogrify.AI automl 庫

Transmogrify.AI

Introduction

TransmogrifAI 是一個基於 Scala 語言和 SparkML 框架,用於結構化資料的端到端AutoML庫。TransmogrifAI主要是對SparkML做了一些封裝,增加了自動特徵工程、自動模型選擇的功能。由於Spark是個高效能分佈框架,scala 是門高糖語言,基於spark 和scala 的automl 庫TransmogrifAI 在效能和易用性方面都有不錯的表現,尤其是在處理企業級的大資料集和多應用場景的機器學習任務時。

Abstractions

TransmogrifAI設計的目的是用來簡化機器學習工作流。為了達到這個目的,

TranmogrifAI定義了一組抽象概念。 這組抽象概念由Features, Stages, Workflows Readers 組成。下圖展現了這組概念之間的關係。

Features

TransmogrifAI 裡首要的抽象概念是 Feature。用官方文件的話說, A Feature is essentially a type-safe pointer to a column in a DataFrame and contains all information about that column – it’s name, the type of data to be found in it, as well as lineage information about how it was derived.

初始的Features 是由 FeatureBuilders定義:

val name: Feature[Text] = FeatureBuilder.Text[Passenger].extract(_.name.toText).asPredictor
val age: Feature[RealNN] = FeatureBuilder.RealNN[Passenger].extract(_.age.toRealNN).asPredictor 

Features 可以被Stages 操作來產生新的Features。和SparkML一樣, TransmogrifAI 裡有兩類stage– Transformers and Estimators

Stage

Transformers

Transformers 指定一個函式,把一個或多個features 轉化為一個或多個Features。簡單地說,一個feature對應dataframe 一列。transform就是對dataframe map 操作。

以下是一個transformer 的例子:

val nameTokens = new TextTokenizer[Text]().setAutoDetectLanguage(true).setInput(name).getOutput()

輸出nameTokens 是一個型別為 TextList新的feature

Estimators

Estimater 生成transformer. Think of Estimators as learning algorithms, that need to be fit to the data, in order to then be able to transform it.

TransmogrifAI 使用者不需要關心演算法的訓練,訓練一個workflow時,這一切自動發生。下面是一個bucketizing estimator 的例子。這個estimater 使用決策樹對age 進行分桶, 然後把 age 對映到對應的桶, 生成一個 OPVector型別的feature:

val bucketizedAge = new DecisionTreeNumericBucketizer[Double, Real]().setInput(label, age).getOutput() 

Workflows and Readers

 Features Feature transformations 定義好之後,給workflow 傳入一個DataReader以及設定需要輸出的features,最終的結果由workflow計算的出。

訓練Workflow , workflow通過設定的需要輸出的features,推匯出依賴的整個由FeaturesTransformers Estimators組成的DAG圖。Workflow 讀入 DataReader 指定的資料,排程計算這個 DAG圖,中間的Estimater 生成對應的Transformers

AutoML Capabilities

Vectorizers and Transmogrification

這是一個自動化feature engineering stage

TransmogrifAI   (shortcut .transmogrify()) 輸入一系列的features, 基於feature的型別,自動地應用對應型別的預設處理方式 (比如one hot encoding, tokenization, split Emails and pivot out the top K domains) feature 轉化成vector,拼接組合在一起。

val features = Seq(email, phone, age, subject, zipcode).transmogrify()

如果想要對單個feature 進行特徵工程,可以使用如下的方式,每種型別都有對應的vectorize()

val emailFeature = email.vectorize()
val features = Seq(emailFeature, phone, age, subject, zipcode).transmogrify()

Feature Validation

SanityChecker

這是一個自動特徵選擇的stage

The SanityChecker 是一個estimatorSanitychecker 在模型選擇之前,剔除掉無用的列。Sanitychecker 統計feature 的一些資訊,(比如方差,和label的相關係數等),剔除掉對一些無用的列(比如,一個列方差太小、與label的相關性太低、category型別分佈太集中等)。

SanityChecker 的使用方式如下:

// Add sanity checker estimator
val checkedFeatures = new SanityChecker().setRemoveBadFeatures(true).setInput(label, features).getOutput()

RawFeatureFilter

這個stage 剔除在訓練集和測試集合裡分佈差異比較大的特徵。具體地,如果一個特徵在訓練集和測試集合的填充率差異比較大,則剔除這個特徵。如果一個特徵在兩個集合分佈的交叉熵比較大,也剔除該特徵。

// Add raw feature filter estimator
val workflow =
   new OpWorkflow()
      .setResultFeatures(survived, rawPrediction, prob, prediction)
      .withRawFeatureFilter(Option(trainReader), Option(scoreReader), None) 

ModelSelectors

這是模型自動化選擇的stage

基於不同的任務型別(迴歸、二分類、多分類),TransmogrifAI 會自動選擇最好的模型和最好的超引數。

val (pred, raw, prob) = BinaryClassificationModelSelector().setInput(label, features).getOutput()

ModelSelector 是一個用輸入資料來查詢最佳模型的Estimator . BinaryClassificationModelSelector 用來處理binary classification tasks, multi classification tasks 可以用 MultiClassificationModelSelector. Regression task 可以用 RegressionModelSelector

自動模型選擇目前支援的分類模型有LogisticRegressionDecisionTreesRandomForest and NaiveBayes.

支援的迴歸模型有 LinearRegressionDecisionTreesRandomForest and GBTrees.

最佳的模型是通過交叉驗證來選擇最佳的SparkML model 然後做一些封裝得到的。 ModelSelector 也可以通過網格搜尋來選擇最佳的超引數。