Salesforce開源TransmogrifAI:用於結構化資料的端到端AutoML庫

機器之心發表於2018-08-29

選自Medium,作者:Shubha Nabar,機器之心編譯,參與:Geek AI、路。

AutoML 即通過自動化的機器學習實現人工智慧模型的快速構建,它可以簡化機器學習流程,方便更多人利用人工智慧技術。近日,軟體行業巨頭 Salesforce 開源了其 AutoML 庫 TransmogrifAI。Salesforce Einstein 資料科學高階總監 Shubha Nabar 在 Medium 上撰文介紹了該 AutoML 庫,包括工作流程和設計原則等。

在過去的十年中,儘管機器學習取得了巨大的進步,但是建立生產就緒的機器學習系統仍然十分困難。三年前,當我們開始將機器學習功能構建到 Salesforce 平臺上時,我們發現構建企業級的機器學習系統更是難上加難。為了解決我們遇到的問題,我們構建了 TransmogrifAI,一個用於結構化資料的端到端自動機器學習庫。今天,這個庫已經在生產中幫助驅動我們的 Einstein AI 平臺。在這裡,我們很高興與開源社群共享這個專案,使其他開發人員和資料科學家能夠大規模、快速地構建機器學習解決方案。

當我們為消費類產品賦予機器學習能力時,資料科學家往往關注的是大量容易理解的用例和資料集。相反,企業中資料和用例的多樣性使得用於企業級產品的機器學習需要面對另一種挑戰。對於 Salesforce 來說,我們的客戶希望預測一系列結果,從客戶流失情況、銷售預測以及商機轉化率,到電子郵件營銷點選率、網站購物、接受出價、裝置故障、逾期付款等。對於企業客戶來說,確保其資料受保護、不向其他組織或競爭者共享資料是十分關鍵的。這意味著我們必須為任何給定的用例構建使用者定製化的機器學習模型。即使我們可以構建全域性模型,但是由於每個使用者的資料是唯一的,有著不同的模式、形態、由不同的業務流程引入的偏差,構建全域性模型的做法是沒有任何意義的。為了讓機器學習真正服務於客戶,我們必須針對每個用例使用每個客戶的獨特資料,構建和部署數千個個性化的機器學習模型。

在不僱傭大量資料科學家的情況下,唯一實現這一目標的途徑就是自動化。目前,大多數 auto-ML 解決方案要麼非常狹隘地關注整個機器學習工作流的一個小部分,要麼就是為影象、語音和語言這樣的非結構化、同質資料構建的。而我們需要的解決方案應該能夠大規模地為異質結構化資料快速生成資料效率高的模型。在詞典中,「Transmogrification」意為「變換的過程」,這種變換通常以一種令人驚訝或者神奇的方式進行,這也正是 TransmogrifAI 為 Salesforce 所做的——使資料科學團隊將客戶資料轉化為有意義的、可操作的預測。如今,成千成萬的使用者定製化機器學習模型已經部署在了這個平臺上,為每天超過 30 億個預測賦能。

下文我們將介紹 TransmogrifAI 的工作流,討論設計思想,並給出了一些幫助人們使用這個庫或為其貢獻程式碼的連結。


TransmogrifAI 的工作流

通常來說,構建優秀機器學習模型所需的研究和開發任務是很龐大的工作。資料準備、特徵工程和模型訓練的繁瑣工作是一個迭代的過程,需要花費資料科學家數週甚至數月的時間才能得到成熟的自動化模型。TransmogrifAI 是一個基於 Scala 語言和 SparkML 框架構建的庫,它恰好可以實現這一目標。只需短短的幾行程式碼,資料科學家就可以完成自動化資料清理、特徵工程和模型選擇工作,得到一個效能良好的模型,然後進行進一步的探索和迭代。

TransmogrifAI 封裝了 5 個主要的機器學習元件:

Salesforce開源TransmogrifAI:用於結構化資料的端到端AutoML庫

TransmogirifAI 的工作流

特徵推斷:任何機器學習工作流程的第一步都是準備資料。資料科學家會收集所有相關的資料,並且對不同的資料來源進行壓縮、連線和聚合處理,從而提取出可能具有預測能力的原始訊號。接著,提取出的訊號會被轉存到一個靈活的資料結構(通常被稱為 DataFrame)中,以便在工作流的下游進行進一步的操作。儘管這些資料結構簡單且易於操作,但它們並沒有保護資料科學家免於下游錯誤,如「關於資料型別的錯誤假設」或者「資料中存在空值」等。因此,資料科學家有可能整夜執行工作流程,而第二天早上才發現失敗了,僅僅可能是因為她試圖將兩個字串相乘(該資料型別的乘法操作通常不被允許)。

在 TransmogrifAI 中,我們通過允許使用者為資料指定一個模式,並自動提取出原始預測器和作為「特徵」的響應訊號來解決這個問題。特徵是強型別的,TransmogrifAI 支援豐富的可擴充套件特徵型別層次結構。這種層次結構可以超越原始的型別,支援更細微的資料型別,例如地理位置、電話號碼、郵編等,即資料科學家想要區別對待的資料型別。除了允許使用者指定資料型別之外,TransmogrifAI 還能自己進行推斷。例如,如果它檢測到具有低基數(唯一值較少)的文字特徵實際上是潛在的類別特徵,它就會對其進行分類並且進行適當的處理。強型別特徵使開發人員能夠在編譯時而不是執行時就發現大部分錯誤。它們也是自動化機器學習工作流程中常見的特定型別下游處理的關鍵。

Salesforce開源TransmogrifAI:用於結構化資料的端到端AutoML庫

TransmogrifAI 的特徵型別層次圖

Transmogrification(即自動化特徵工程):儘管強型別特徵對資料推理非常有幫助,還能將下游錯誤降到最低,但所有的特徵最終都需要轉換為一種能夠展示資料規律的數值表示形式,以便機器學習演算法可以很容易地利用這些特徵。這個過程被稱為特徵工程。有數不清的方法可以對上圖所示的特徵型別進行轉換,而如何找到最恰當的方法則是資料科學的藝術了。

舉個例子,我們不妨問問自己:如何才能將美國某個州的名稱(例如加利福尼亞 CA、紐約 NY、德克薩斯 TX 等)轉換為一個數字。一種可能的方法是將每個州的名稱對映到區間在 [1, 50] 的數字。而這種編碼的問題是,它沒有儲存關於各個州地理位置鄰近性的資訊。然而,在試圖對購物行為進行建模時,這種地理位置的鄰近性可能是一個很重要的特徵。我們可以嘗試的另一種編碼方法是使用每個州的中心與美國的中心之間的距離。這種方法可以在某種程度上解決上面提到的問題,但它仍然不能對各州位於美國的北部、南部、西部還是東部這類資訊進行編碼。這只是對於一個特徵的簡單例子,想象一下,如果我們面對成百上千個這樣的問題,那該有多複雜!特徵工程之所以極具挑戰性,是因為並沒有一種對於所有需要考慮的因素完全恰當的方法,而成功的方法在很大程度上取決於我們試圖優化的問題。

將數十種不同的特徵型別自動轉換成數值向量,這就是 TransmogrifAI 名字的由來。TransmogrifAI 為所有其支援的特徵型別提供大量的技術支撐,這些特徵包括電話號碼、電子郵件地址、地理位置甚至文字資料。這些轉換不僅僅是將資料轉化為演算法可以使用的格式,TransmogrifAI 還對轉換結果進行優化,使機器學習演算法更容易利用這些資料進行學習。例如,它會將年齡等數值特徵轉化為最適合特定問題的年齡段,就像適用於時尚行業和財富管理行業的年齡段可能是不同的。

但是,即使我們採取了上述措施,特徵工程仍然是一個無止境的遊戲。因此,除了提供這些預設的技術,我們還做了大量的努力,使快速貢獻程式碼和共享特徵工程技術更加容易,以便開發人員能夠以可複用的方式定製和擴充套件預設技術。

自動化特徵驗證:特徵工程可能導致資料維度的爆炸。而對高維資料的處理往往面臨著許許多多的問題!例如,對資料中特定欄位的使用可能隨著時間的推移發生變化,在這些欄位上訓練出的模型可能在新的資料上表現並不好。另一個巨大的(而且經常被忽視的)問題是後視偏差(hindsight bias)或 data leakage(無法正確解釋因果關係)。當預測時實際不會出現的資訊被「洩漏」到訓練樣本中時,就會出現這種情況。其結果是模型在論文中看起來效果十分好,但是實際上卻毫無用處。試想一個包含多項交易資訊的資料集,其任務是預測可能完成的交易。假設這個資料集中有一個欄位為「已完成交易量」(Closed Deal Amount),這個欄位只能在某項交易完成後才能被填充。盲目地應用機器學習演算法會認為這個欄位具有很強的預測性,因為所有已完成的交易都會有一個非零的「已完成交易量」。但實際上,這個欄位不會被仍在進行中的交易所填充,機器學習模型在這些交易上的效能會很差,而預測對於這些交易實際上很重要!這種後視偏差在 Salesforce 尤其造成了很大問題,在 Salesforce 中,未知的自動化的業務流程常常充斥著各種使用者的資料,這使得資料科學家很容易混淆因果關係。

TransmogrifAI 具有一些可以執行自動特徵驗證工作的演算法,它們將被用來刪除掉幾乎沒有預測能力的特徵:這些特徵的使用會隨著時間推移而改變,特徵顯示出來的方差為零,或者在訓練樣本中的分佈與其預測時的分佈具有明顯的差異。TransmogrifAI 使用的這些演算法在處理高維資料和未知資料時十分有用,這些資料原本可能會被後視偏差所擾亂。這些演算法應用了一系列基於特徵型別的統計檢驗,並且利用特徵譜(feature lineage)來檢測並消除這種偏差。

自動化的模型選擇:資料科學家進行資料處理的最後一個步驟是將機器學習演算法應用到準備好的資料上,從而構建預測模型。資料科學家可以嘗試許多不同的演算法,而且可以對每種演算法進行不同程度的微調。找到合適的演算法和引數設定才能成就效能好的模型。

TransmogrifAI 的模型選擇器在資料上執行不同的機器學習演算法,利用平均驗證誤差自動選擇出最好的演算法。它還能通過適當地對資料進行取樣並將預測結果重新校準到與真實先驗匹配,來自動處理資料不平衡的問題。資料科學家在資料上訓練出的最佳模型和最差模型之間的效能差異往往很大,而探索可能的模型空間對於避免留下太大的模型缺陷十分重要。

超引數優化:超引數優化層是以上所有步驟的基礎。在如今的機器學習社群中,超引數特指機器學習演算法中那些可以調節的引數。然而現實是,對以上所有步驟進行有效調節的引數各不相同。例如,在特徵工程中,資料科學家可能會調節從分類預測器中得出的二值變數的數量。而處理不平衡資料的取樣率是另一個可以調整之處。對所有這些引數進行調優是一件非常困難的事情,但它確實可以得出一個很棒的模型,這與隨機產生的模型在效能上有很大的差別。這也正是 TransmogrifAI 提供一些自動超引數調優技術、一個擴充套件更多先進調優技術的框架的原因。

在 Salesforce,這樣的自動化技術已經把訓練模型的總時間從數週或數月減少到了幾個小時。而且將這些複雜的過程封裝起來的程式碼十分簡單。只需要下面的幾行程式碼就可以指定上面的自動化特徵工程、特徵驗證和模型選擇工作:

// Read the Deal data
val dealData = DataReaders.Simple.csvCase[Deal](path = pathToData).readDataset().toDF()

// Extract response and predictor Features
val (isClosed, predictors) = FeatureBuilder.fromDataFrame[RealNN](dealData, response = "isClosed")

// Automated feature engineering
val featureVector = predictors.transmogrify()

// Automated feature validation
val cleanFeatures = isClosed.sanityCheck(featureVector, removeBadFeatures = true)

// Automated model selection
val (pred, raw, prob) = BinaryClassificationModelSelector().setInput(isClosed, cleanFeatures).getOutput()

// Setting up the workflow and training the model
val model = new OpWorkflow().setInputDataset(dealData).setResultFeatures(pred).train()
複製程式碼

使用 TransmogrifAI 預測交易完成的可能性

設計選擇

TransmogrifAI 的設計宗旨是提升機器學習開發者的生產效率,這不僅通過機器學習自動化來實現,還需要通過能夠加強編譯時型別安全、模組化和複用性的 API 得以實現。下面是我們所做的一些值得注意的設計選擇。

Apache Spark:出於很多因素的考慮,我們選擇在 Apache Spark 框架上構建 TransmogrifAI。首先,我們需要處理資料規模的巨大變化。我們的一些使用者和用例需要基於上千萬條需要聚合或連線的記錄來訓練模型,而另外一些使用者和用例則僅僅依賴於幾千條記錄。Spark 具有處理大資料分散式連線和聚合的基本方法,這對我們來說十分重要。其次,我們需要能夠在批處理和流處理這兩種模式下提供我們機器學習模型的服務。當使用 Spark 流時,我們可以很容易地將 TransmogrifAI 擴充套件到這兩種模式中。最後,通過在一個活躍的開源庫上構建 TransmogrifAI,我們可以利用開源社群對該庫進行的持續改進,而不必重新造一個輪子。

特徵抽象:SparkML 工作流引入了轉換 DataFrame 的 Transformer 和 Estimator 的抽象。TransmogrifAI 就是構建在這些抽象(上述 Transmogrification、特徵驗證和模型選擇,它們都由 Estimator 提供支援)之上的。此外,TransmogrifAI 還引入了特徵抽象。特徵本質上是一個指向資料幀(DataFrame,一種資料結構)中某個列的型別安全指標,並且包含關於該列的所有資訊,即它的名稱、它包含的資料型別,以及它是如何產生的譜系資訊。

接著,特徵成為開發人員與之互動的主要原語(primitive),定義和操作特徵更像是在程式語言中處理變數,而不是在資料幀(DataFrame)中處理列。特徵也是可以共享的,它允許開發人員之間的協作和複用。此外,TransmogrifAI 還能夠容易地定義複雜時間序列聚合和連線結果的特徵,但要討論這個主題可能就要再寫一篇博文專門介紹了。

型別安全:特徵是強型別的。這允許 TransmogrifAI 對整個機器學習工作流進行型別檢查,並確保儘早發現錯誤,而不是在一個執行流程中花費幾個小時才找出錯誤。型別安全還帶來了其它有利於提高開發人員生產效率的優點,包括支援智慧化的整合開發環境(IDE)為完成程式碼提出建議。在下圖中,你可以看到你能為一個數值特徵執行的所有可能的轉換操作,並且選擇其中之一。

Salesforce開源TransmogrifAI:用於結構化資料的端到端AutoML庫

對數值特徵進行轉換的 IDE 程式碼完成

型別安全還在機器學習工作流的每個階段提高了預期輸入和輸出的透明度。這大大減少了在任何特別複雜的機器學習工作流中不可避免地積累的知識量。

最後,特徵型別是針對特定型別的下游處理工作的關鍵,尤其是對於自動化特徵工程和特徵驗證。

可定製性和可擴充套件性:儘管開發人員可以使用自動估計器快速地對模型效能進行調優,對於那些希望對模型具有更多控制能力的使用者,每個開箱即用的估計器都是引數化的,這些引數可以由資料科學家直接設定並調優。此外,人們可以很容易地指定定製的轉換器和估計器用。指定一個定製的轉換器就像定義 lambda 表示式一樣簡單,TransmogrifAI 負責維護所有為你進行序列化和反序列化操作的樣板檔案。

val lowerCaseText = textFeature.map[Text](_.value.map(_.toLowerCase).toText)複製程式碼

規模和效能:通過自動化特徵工程,資料科學家可以很容易地擴充套件特徵空間,並最終得到讓 Spark 難以處理的大規模資料幀。TransmogrifAI 的工作流通過推斷出實現這些特徵所需轉換的有向無環圖(DAG)來解決這個問題,並且通過將在 DAG 同一層次上進行的所有轉換壓縮成同一個操作來優化 DAG 的執行。同時,由於 TransmogrifAI 是建立在 Spark 框架之上的,它會自動地從不斷進行的底層 Spark 資料幀的優化中受益。

結果是,我們可以將自動化的機器學習技術應用在上百萬行、上百列的資料上,並且將處理過程中的特徵空間擴充套件到數萬列。

方便所有人使用 TransmogrifAI

TansmogrifAI 為我們帶來了巨大的變革,它使我們的資料科學家在生產中使用最少的手動調參就能部署數千個模型,將訓練一個效能優秀模型的平均時間從數週減少到幾個小時。這種水平的自動化對於我們為企業提供機器學習服務十分重要,我們相信現在每家企業所擁有的機器學習用例超過它們所擁有的資料科學家,自動化是使機器學習技術普及的關鍵。

Salesforce 是 Apache Spark 專案長期的使用者和貢獻者,我們很高興能夠繼續在開源社群中構建 TransmogrifAI。機器學習具有轉變企業運作模式的潛力,我們相信只有思想和程式碼的開放性交流才能降低使用它的門檻。通過在開源的環境中工作,我們可以將不同的視角聚集在一起,繼續推動技術向前發展,讓每個人都能夠使用它。

想要獲取更多 TransmogrifAI 的入門資料,請檢視專案連結:github.com/salesforce/…Salesforce開源TransmogrifAI:用於結構化資料的端到端AutoML庫

原文連結:engineering.salesforce.com/open-sourci…


相關文章