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