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

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

GitHub 鏈接:https://github.com/salesforce/TransmogrifAITransmogrifAI 官網:https://transmogrif.ai/

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

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

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

下文我們將介紹 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。

相關文章