想讓機器學(xué)習(xí)與商業(yè)結(jié)合,最重要的是什么?
純學(xué)術(shù)性地建立機器學(xué)習(xí)模型與為企業(yè)提供端對端的數(shù)據(jù)科學(xué)解決方案(如生產(chǎn)制造、金融服務(wù)、零售、娛樂、醫(yī)療保健)之間存在著巨大差異。
在機器學(xué)習(xí)方面,企業(yè)最常面臨的問題是什么呢?除了培養(yǎng)機器學(xué)習(xí)模型,我們還能做什么?如何準(zhǔn)備數(shù)據(jù)?如何擴大數(shù)據(jù)集?為什么特征工程如此關(guān)鍵?如何將模型運用到生產(chǎn)實踐,成為完全可行的系統(tǒng)呢中?如果能從開源軟件中獲取所有的數(shù)據(jù)科學(xué)工具,數(shù)據(jù)科學(xué)平臺還有存在的意義嗎?
本文將回答以上部分問題,并揭示目前機器學(xué)習(xí)遇到的挑戰(zhàn)和困難,進(jìn)一步通過具體行業(yè)案例提出最佳解決方案。
機器學(xué)習(xí)不僅僅是培養(yǎng)模型
不少數(shù)據(jù)科學(xué)家對機器學(xué)習(xí)還存在普遍誤解。
“假設(shè)你拿到一組有某種特征的數(shù)據(jù)集,并需要推測其中某個變量,你會怎么做?”
很多數(shù)據(jù)科學(xué)家都會做如下回答:
“我會把數(shù)據(jù)集拆分成培養(yǎng)/測試兩部分,運行LogisticRegression, Random Forest, SVM, Deep Learning, XGBoost程序……然后計算精確度、查全率、F1分?jǐn)?shù)……最終挑選出最佳模型。”
但是,還有些問題被忽略了:
“這個過程中你有看過數(shù)據(jù)本身嗎?要是你遺漏了一些數(shù)值怎么辦?如果你拿到錯誤的數(shù)值或是不良數(shù)據(jù)呢?你怎么設(shè)置分類變量?你是怎么做特征工程的?”
本文中將介紹成功創(chuàng)建端對端機器學(xué)習(xí)系統(tǒng)的七個必要步驟,包括數(shù)據(jù)收集、數(shù)據(jù)監(jiān)管、數(shù)據(jù)探查、特征抽取、模型培養(yǎng)、估值和部署。
給我數(shù)據(jù)!
作為數(shù)據(jù)科學(xué)家,主要資源很明顯是數(shù)據(jù)。但有時數(shù)據(jù)采集本身也有困難。一個數(shù)據(jù)科學(xué)團隊可能會花費幾周甚至幾個月的時間來獲取合適的數(shù)據(jù)集。其中的困難包括:
- 獲取途徑:大部門企業(yè)數(shù)據(jù)都很敏感,尤其是政府、醫(yī)療保健和金融領(lǐng)域的相關(guān)數(shù)據(jù)。要共享數(shù)據(jù)集,簽署保密協(xié)議是常規(guī)流程。
- 數(shù)據(jù)分散:數(shù)據(jù)在組織內(nèi)不同部門間散布是很常見的。要拿到整體數(shù)據(jù),需要各部門的同意。
- 專業(yè)指導(dǎo):能獲取數(shù)據(jù)往往還不夠。由于獲取的數(shù)據(jù)太多,需要一位領(lǐng)域?qū)<抑笇?dǎo)團隊從龐大的數(shù)據(jù)庫中挑選出合適的數(shù)據(jù)集。有時專家的缺席也會成為項目瓶頸,因為核心企業(yè)運營已使他們應(yīng)接不暇。
- 隱私:模糊處理和匿名操作已經(jīng)成為兩項獨立的研究領(lǐng)域,在處理敏感數(shù)據(jù)時這二者尤為重要。
- 標(biāo)記:通常了解實際情況或標(biāo)記會很有幫助,因為這讓團隊能夠應(yīng)用很多可監(jiān)控的學(xué)習(xí)算法。然而,有時標(biāo)記數(shù)據(jù)成本高昂,或由于法律限制團隊無法得到標(biāo)記。在這些情況下,可以應(yīng)用數(shù)據(jù)聚類等不可監(jiān)控的方案。
- 數(shù)據(jù)生成器:如無法獲得數(shù)據(jù)或標(biāo)記,可以去模擬它們。了解數(shù)據(jù)結(jié)構(gòu)的相關(guān)信息會對使用數(shù)據(jù)生成器很有幫助,除此以外,還可以了解數(shù)值變數(shù)的可能性分布和名義變量的類別分布。如果數(shù)據(jù)結(jié)構(gòu)比較散亂,可借助湯不熱(Tumblr)平臺,其上有許多標(biāo)記圖像。此外,推特(Twitter)可提供大量自由文本,卡歌網(wǎng)(Kaggle)則擁有特定領(lǐng)域和行業(yè)相關(guān)的數(shù)據(jù)集和解決方案。
大數(shù)據(jù)并不大
近十年,大數(shù)據(jù)供應(yīng)商賣力宣傳,強調(diào)對大數(shù)據(jù)規(guī)模和功能的需求,掀起了一股大數(shù)據(jù)熱潮。也因此,“大數(shù)據(jù)并不大”這一觀點引發(fā)了更大的爭議。然而,我們需要明確區(qū)分原始數(shù)據(jù)(包括對所有對當(dāng)前問題無幫助的數(shù)據(jù))和特征集(機器學(xué)習(xí)算法的輸入矩陣)。將原始數(shù)據(jù)處理成特征集的過程稱為數(shù)據(jù)處理,包含以下步驟:
- 丟棄無效/不完整/臟數(shù)據(jù)。根據(jù)我們的經(jīng)驗,此類數(shù)據(jù)可占所有數(shù)據(jù)的一半。
- 聚合一個或多個數(shù)據(jù)集,包括數(shù)據(jù)連接和組類聚合等操作。
- 特征選取/抽除。比如,除去唯一性標(biāo)識等可能無關(guān)的特征,并應(yīng)用其它降維技術(shù),如主成分分析。
- 使用稀疏數(shù)據(jù)表示法或功能散列法,以減少存在許多零值數(shù)據(jù)集的內(nèi)存占用。
完成數(shù)據(jù)準(zhǔn)備后,不難發(fā)現(xiàn)最終的特征集——即機器學(xué)習(xí)模型的輸入內(nèi)容——比初始的小很多;另一種常見情況是R或scikit-learn等內(nèi)存框架足以培養(yǎng)模型。若特征集規(guī)模仍十分龐大,可以使用ApacheSpark等大數(shù)據(jù)工具,盡管其算法選擇有限。
臟數(shù)據(jù)!
臟數(shù)據(jù)很常見
人們當(dāng)然希望能學(xué)習(xí)一些尚不了解的東西,但這一點非常重要:臟數(shù)據(jù)很常見。在企業(yè)合作中,很多客戶經(jīng)常自豪于他們的數(shù)據(jù)湖泊建設(shè),比如數(shù)據(jù)湖泊有多壯觀、他們可從中得出多少洞見等。因此,作為數(shù)據(jù)科學(xué)家,以下就是我們腦海中的景象:
但是,當(dāng)客戶拿出實際數(shù)據(jù)時,情況更像是這樣:
在這種情況下,Apache Spark等大規(guī)??蚣芫惋@得尤為重要,因為所有的數(shù)據(jù)監(jiān)管轉(zhuǎn)化過程都需要在全部原始數(shù)據(jù)上完成。以下是幾個典型的監(jiān)管案例:
- 異常檢測:負(fù)數(shù)年齡、浮點郵編和零值信用評分等都是無效數(shù)據(jù),不修正這些數(shù)值會在培養(yǎng)模型時產(chǎn)生深刻的偏見。
- 缺失/錯誤數(shù)值填充:顯然,處理錯誤/缺失數(shù)值最常用的方法就是丟棄它們。另一個選擇是填充。比如,用相應(yīng)特征的平均數(shù)、中位數(shù)或眾數(shù)來代替缺失/錯誤數(shù)值。還有一種方法是插值,如建構(gòu)模型來預(yù)測缺失數(shù)值的情況下的特征。另外,填充中也可以運用領(lǐng)域知識。比方說處理病人數(shù)據(jù)時,有一項特征是推斷病人是否患有癌癥。如果缺失此類信息,可以參考其問診數(shù)據(jù),以確定此病人是否曾看過腫瘤科醫(yī)生。
- 虛擬編碼和功能散列:這兩種方法能很有效地把類別數(shù)據(jù)轉(zhuǎn)換成數(shù)值,尤其在基于系數(shù)的算法中。比方說,有一項特征是州名,顯示美國的各州名稱(如FL,CA,AZ)。將FL編碼為1,CA編碼為2,AZ編碼為3,會顯示出秩序感和重量級。這意味著AZ會比FL面積更大,而CA的面積是FL的兩倍大。一位獨熱編碼——也稱虛擬編碼——提供的解決方案是將類別欄映射到多個雙欄中,其中一欄為類別數(shù)值。
- 歸一化:若存在不同等級的特征,系數(shù)相關(guān)的算法就會產(chǎn)生偏見。比方說,特征年齡在[0,100]范圍內(nèi)用年表示,然而工資在[0,100,000]范圍內(nèi)用美元表示。優(yōu)化算法可能僅僅因為工資的絕對數(shù)量級更大而更側(cè)重工資。因此,更推薦常態(tài)化算法以及其他常用方法,如Z值推測、標(biāo)準(zhǔn)化(如果數(shù)據(jù)正常)及min-max特征歸一化。
- 分箱:將實值欄映射到不同類別極為有效,如將一個回歸問題轉(zhuǎn)化為分類問題。比方說,你想推測航班進(jìn)港延誤的分鐘數(shù)。一個選擇是推測該航班是否會提前、準(zhǔn)時抵達(dá)或延誤,并確定各類別的數(shù)值范圍。
特征工程無處不在
總而言之,特征就是機器學(xué)習(xí)算法需要學(xué)習(xí)的特點。正如人們設(shè)想的那樣,干擾或無關(guān)數(shù)據(jù)會影響模型的質(zhì)量,因此掌握好的特征就十分關(guān)鍵。以下是幾個特征工程中可使用的策略:
- 確定預(yù)測內(nèi)容。每一個實例代表什么?顧客?交易?病人?還是票據(jù)?確保特征集的每一行都對應(yīng)一個實例。
- 避免唯一性標(biāo)識。它們不僅在大多數(shù)情況下不起作用,還有可能導(dǎo)致嚴(yán)重的過度擬合,尤其是在使用XGBoost等算法時。
- 運用領(lǐng)域知識來導(dǎo)出幫助衡量成功/失敗的新特征。通過去醫(yī)院的次數(shù)可以推斷醫(yī)患風(fēng)險;上月跨國交易的總量可推斷詐騙的可能性;申請貸款數(shù)額與年收入的比例可推斷信用風(fēng)險。
- 運用自然語言處理技術(shù)從散亂自由文本中導(dǎo)出特征。比如LDA,TF-IDF,word2vec和doc2vec。
- 若存在大量特征,可使用降維方法,如主成分分析和t-分布領(lǐng)域嵌入算法。
異常檢測無處不在
如果要在企業(yè)機器學(xué)習(xí)的應(yīng)用案例中挑選出最常見的一個,那就是異常檢測。無論是否研究詐騙偵查、生產(chǎn)測試、客戶流失、醫(yī)患風(fēng)險、客戶失信抑或是系統(tǒng)崩潰預(yù)測,面臨的問題總是:我們能否大海撈針?這就引出了另一個與非平衡數(shù)據(jù)集有關(guān)的話題。
以下是幾個用于異常檢測的常見算法:
- 自動編碼器
- 一類分類算法,如單類支持向量機。
- 信賴區(qū)間
- 聚類
- 運用過采樣和欠采樣法分類
- 非平衡數(shù)據(jù)很常見
非平衡數(shù)據(jù)
比方說,你有一組數(shù)據(jù)集,標(biāo)記有信用卡交易信息。交易中的0.1%為不實信息,而其余99.9%均為正常交易。如果要創(chuàng)建一個從無虛假交易的模型,會發(fā)生什么呢?這個模型在99.9%的情況下都會給出正確答案,所以其精確度為99.9%。這個常見的精確度謬誤可以通過考慮不同的度量標(biāo)準(zhǔn)來避免,如精準(zhǔn)度、查全率。這些通過真陽性(TP,true positives)、真陰性(TN,true negatives)、假陽性(FP,false positives)、假陰性(FN,false negatives)等術(shù)語來表示:
- 真陽性 = 全部實例正確推斷為正
- 真陰性 = 全部實例正確推斷為負(fù)
- 假陽性 = 全部實例錯誤推斷為正
- 假陰性 = 全部實例錯誤推斷為負(fù)
在一個異常檢測的典型案例中,我們試圖將假陰性最小化——比如,忽略一筆虛假交易,忽略一塊有問題芯片,或?qū)⒁粋€病人視為健康的——同時不會導(dǎo)致大量假陽性實例。
- 精準(zhǔn)度 = 真陽性/(真陽性+假陽性)
- 查全率 = 真陽性/(真陽性+假陰性)
要注意精準(zhǔn)度不利于假陽性,而查全率不利于假陰性。一個從不推測出虛假信息的模型查全率為零,而精準(zhǔn)度則未知。相反,一個總是推測出虛假信息的模型則有著100%的查全率和極低的精準(zhǔn)度——這是由于大量假陽性實例的存在。
非常不推薦在異常檢測中使用受試者工作特征曲線(FPR)。因為假陽性率——FPR的基礎(chǔ)——很大程度上是基于數(shù)據(jù)集中的陰性實例數(shù)量(如假陽性+真陰性),使得在假陽性實例數(shù)量龐大的情況下FPR仍然很小。
受試者工作特征曲線 = 假陽性/(假陽性+真陰性)
相反,錯誤發(fā)現(xiàn)率(FDR)有助于更好理解假陽性實例對于異常檢測模型的影響:
錯誤發(fā)現(xiàn)率 = 1 – 精準(zhǔn)度 = 假陽性/(真陽性+假陽性)
別預(yù)測了,直接解釋原因!
一些項目并不旨在創(chuàng)建一個實時預(yù)測模型,而是解釋假設(shè)或分析哪些因素可以解釋特定行為,因為大多數(shù)機器學(xué)習(xí)算法是基于相關(guān)性,而不是因果性。以下是一些例子:
- 什么因素導(dǎo)致一位病人患病風(fēng)險增加?
- 哪些藥品對血檢結(jié)果影響最大?
- 哪些保險規(guī)劃參數(shù)值可使利益最大化?
- 失信客戶有什么特點?
- 流失客戶的簡況是什么?
處理此類問題的一個可行辦法是計算特征重要度,從Random Forests, Decision Trees和XGBoot等算法中可以得到此數(shù)據(jù)。另外,LIME或SHAP等算法則有助于解釋模型和預(yù)測,即使其源于神經(jīng)網(wǎng)絡(luò)或其它“黑盒”模型。
調(diào)整超參數(shù)
機器學(xué)習(xí)算法有參數(shù)和超參數(shù)兩類參數(shù)。其不同之處在于:前者直接由算法進(jìn)行估測——如,回歸的系數(shù)或神經(jīng)網(wǎng)絡(luò)的權(quán)值——而后者則并非如此,須由用戶手動設(shè)置——如,某片森林的樹木總數(shù),神經(jīng)網(wǎng)絡(luò)的正則化方法,或支持向量機的內(nèi)核功能。
為機器學(xué)習(xí)模型設(shè)置正確的超參數(shù)值十分重要。舉例而言,一個支持向量機的線性內(nèi)核不能對無法線性分離的數(shù)據(jù)進(jìn)行分類。再比如,如果最大深度和分裂數(shù)量設(shè)置得過高,一個樹型分類器可能出現(xiàn)過度擬合的情況;而最大特征數(shù)量設(shè)置過低,其可能無法充分?jǐn)M合。
為超參數(shù)找到最優(yōu)數(shù)值是一個極為復(fù)雜的優(yōu)化問題。以下是幾點建議:
- 了解超參數(shù)的優(yōu)先項。一片森林中,最相關(guān)的參數(shù)可能是樹木的數(shù)量和最大深度。然而,對于深度學(xué)習(xí)而言,優(yōu)先項可能是學(xué)習(xí)率和層次數(shù)量。
- 運用搜索技巧:gridsearch和random search。后者優(yōu)先。
- 運用交叉驗證:設(shè)置一個單獨測試組,將其余數(shù)據(jù)分為k層并將其迭代k次,每一層都進(jìn)行驗證(如,調(diào)整超參數(shù)),其余的進(jìn)行學(xué)習(xí)培養(yǎng)。最終,對全部層級進(jìn)行平均質(zhì)量度量標(biāo)準(zhǔn)的計算。
深度學(xué)習(xí):萬金油?
過去幾年,深度學(xué)習(xí)一直是學(xué)術(shù)研究和行業(yè)發(fā)展的聚焦點。TensorFlow, Keras和Caffe等框架使復(fù)雜的神經(jīng)網(wǎng)絡(luò)通過高層級的應(yīng)用程序接口(API)得以快速運用。應(yīng)用程序不計其數(shù),包括計算機視覺,聊天機器人,無人駕駛汽車,機器翻譯,甚至游戲——同時打敗了全世界最頂級的圍棋手和國際象棋計算機玩家!
深度學(xué)習(xí)最主要的前提之一是數(shù)據(jù)增加后持續(xù)學(xué)習(xí)的能力,而這在大數(shù)據(jù)時代尤為有效(見下圖)。這種持續(xù)學(xué)習(xí)的能力與近來硬件方面的發(fā)展(如圖形處理器)互相結(jié)合,使大型深度學(xué)習(xí)工作的執(zhí)行成為可能。而從前,由于資源限制,這是明令禁止的。
那么,這是否意味著深度學(xué)習(xí)是處理所有機器學(xué)習(xí)問題的萬金油呢?并不是。原因如下:
- 簡潔性:神經(jīng)網(wǎng)絡(luò)模型的結(jié)果十分依賴其結(jié)構(gòu)以及超參數(shù)。大多數(shù)情況下,要正確調(diào)整模型,你需要有網(wǎng)絡(luò)建構(gòu)方面專業(yè)知識。另外,在此方面試錯的步驟也非常重要。
- 可解釋性:如上文提到,相當(dāng)一部分實際案例不僅需要做出預(yù)測,還需要解釋預(yù)測背后的原因:為什么貸款申請被拒絕?為什么保險政策價格提高?盡管基于樹型結(jié)構(gòu)和基于系數(shù)的算法可以解釋,神經(jīng)網(wǎng)絡(luò)卻不行。
- 質(zhì)量:從經(jīng)驗來看,對于大多數(shù)結(jié)構(gòu)化的數(shù)據(jù)集,神經(jīng)網(wǎng)絡(luò)模型的質(zhì)量并不一定比RandomForests和XGBoot的模型質(zhì)量更好。當(dāng)涉及散亂數(shù)據(jù)(如圖像、文本、音頻)時,深度學(xué)習(xí)的優(yōu)勢更為突出。底線是:不要用獵槍去打蒼蠅。RandomForests和XGBoot等機器學(xué)習(xí)算法已經(jīng)足以處理大多數(shù)結(jié)構(gòu)化的可監(jiān)測的問題,而這些算法也更容易調(diào)整、運用和解釋。深度學(xué)習(xí)在散亂數(shù)據(jù)問題和強化學(xué)習(xí)方面的作用不言而喻。
別泄露數(shù)據(jù)
處理一個預(yù)測航班到達(dá)時間延誤的項目時,如果使用數(shù)據(jù)集里所有可用的特征時,模型的精確度可以達(dá)到99%。不過,希望你會意識到,你可能用啟程延誤時間來推測進(jìn)港延誤時間。這是數(shù)據(jù)泄露的典型案例。如果我們使用了任何預(yù)測時不可用或未知的特征,就會造成數(shù)據(jù)泄露。大家要當(dāng)心!
開源軟件里能找到一切資源,平臺還有什么用處?
構(gòu)建機器學(xué)習(xí)模型從未像今天這樣簡單。幾行R語言或Python語言代碼足以建構(gòu)一個模型,在網(wǎng)上甚至還能找到大量培養(yǎng)復(fù)雜神經(jīng)網(wǎng)絡(luò)的資源和課程。如今,Apache Spark十分有助于數(shù)據(jù)準(zhǔn)備,它甚至能對大型數(shù)據(jù)集進(jìn)行歸一處理。另外,docker和plumber等工具通過超文本傳輸協(xié)議(HTTP)簡化了機器學(xué)習(xí)模型的部署。似乎完全依靠開源平臺資源,就能構(gòu)建一個端到端的機器學(xué)習(xí)系統(tǒng)。
就概念驗證而言,可能的確是這樣。一個大學(xué)生完全可以依靠開放源代碼完成畢業(yè)論文。但于企業(yè)而言,事情就沒有這么簡單了。
畢竟開源軟件也存在不少缺陷。以下是幾項企業(yè)選擇大數(shù)據(jù)科學(xué)平臺的原因:
- 開放資源整合:幾分鐘內(nèi)就能開啟運行,支持多種環(huán)境,版本更新信息透明。
- 團隊協(xié)作:易于共享數(shù)據(jù)集、數(shù)據(jù)連結(jié)、代碼、模型、環(huán)境和部署。
- 管理和安全:不僅能管理數(shù)據(jù),還可以對所有分析資產(chǎn)進(jìn)行管理。
- 模型管理、部署和再陪養(yǎng)
- 模型偏見:檢測并修正有性別或年齡偏見的模型。
- 輔助的數(shù)據(jù)管理:通過視覺工具來解決數(shù)據(jù)科學(xué)中最困難的問題。
- 圖形處理器:對深度學(xué)習(xí)框架進(jìn)行快速部署和配置,以促成其最優(yōu)表現(xiàn),如TensorFlow。
- 無代碼建模:專為不會編碼但想建構(gòu)視覺模型的統(tǒng)計學(xué)家、項目專家以及管理人員設(shè)計。