Salesforce開源TransmogrifAI:用於結構化數據的端到端AutoML庫

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

  • GitHub 連接:https://github.com/salesforce/TransmogrifAI
  • TransmogrifAI 官網:https://transmogrif.ai/

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

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

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

下文咱們將介紹 TransmogrifAI 的工做流,討論設計思想,並給出了一些幫助人們使用這個庫或爲其貢獻代碼的連接。算法

TransmogrifAI 的工做流編程

一般來講,構建優秀機器學習模型所需的研究和開發任務是很龐大的工做。數據準備、特徵工程和模型訓練的繁瑣工做是一個迭代的過程,須要花費數據科學家數週甚至數月的時間才能獲得成熟的自動化模型。TransmogrifAI 是一個基於 Scala 語言和 SparkML 框架構建的庫,它剛好能夠實現這一目標。只需短短的幾行代碼,數據科學家就能夠完成自動化數據清理、特徵工程和模型選擇工做,獲得一個性能良好的模型,而後進行進一步的探索和迭代。安全

TransmogrifAI 封裝了 5 個主要的機器學習組件:數據結構

TransmogirifAI 的工做流架構

特徵推斷:任何機器學習工做流程的第一步都是準備數據。數據科學家會收集全部相關的數據,而且對不一樣的數據源進行壓縮、鏈接和聚合處理,從而提取出可能具備預測能力的原始信號。接着,提取出的信號會被轉存到一個靈活的數據結構(一般被稱爲 DataFrame)中,以便在工做流的下游進行進一步的操做。儘管這些數據結構簡單且易於操做,但它們並無保護數據科學家免於下游錯誤,如「關於數據類型的錯誤假設」或者「數據中存在空值」等。所以,數據科學家有可能整夜運行工做流程,而次日早上才發現失敗了,僅僅多是由於她試圖將兩個字符串相乘(該數據類型的乘法操做一般不被容許)。框架

在 TransmogrifAI 中,咱們經過容許用戶爲數據指定一個模式,並自動提取出原始預測器和做爲「特徵」的響應信號來解決這個問題。特徵是強類型的,TransmogrifAI 支持豐富的可擴展特徵類型層次結構。這種層次結構能夠超越原始的類型,支持更細微的數據類型,例如地理位置、電話號碼、郵編等,即數據科學家想要區別對待的數據類型。除了容許用戶指定數據類型以外,TransmogrifAI 還能本身進行推斷。例如,若是它檢測到具備低基數(惟一值較少)的文本特徵其實是潛在的類別特徵,它就會對其進行分類而且進行適當的處理。強類型特徵使開發人員可以在編譯時而不是運行時就發現大部分錯誤。它們也是自動化機器學習工做流程中常見的特定類型下游處理的關鍵。

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)爲完成代碼提出建議。在下圖中,你能夠看到你能爲一個數值特徵執行的全部可能的轉換操做,而且選擇其中之一。

對數值特徵進行轉換的 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 的入門資料,請查看項目連接:https://github.com/salesforce/TransmogrifAI。

原文連接:https://engineering.salesforce.com/open-sourcing-transmogrifai-4e5d0e098da2

相關文章
相關標籤/搜索