掌握這六步,搭建機器學習項目
上圖白板展示了一系列機器學習項目啟動
機器學習覆蓋的范圍十分廣泛。這篇文章將整體描述機器學習適用的典型問題,提供實現機器學習項目雛形的框架。
首先厘清一些定義。
機器學習、人工智能和數據科學區別何在?
這三個主題沒有明確的定義,因而有些難以理解。為防止誤解,我們將問題簡化。讀者可以認為本文提到的機器學習就是發現數據中的規律,以理解某些問題或者預測未來事件。
希望讀者在閱讀以下步驟時能邊學邊做,檢驗結果。在實踐中學習。
一條機器學習管道可以被分解成三個主要步驟:數據收集、數據建模和模型運用。這三個步驟相互影響、環環相扣。
啟動項目時,你可能走入如下循環:收集數據,對其建模,發現收集到的數據質量較差,重新收集數據,建模,運用這一模型,發現它并不管用,重新建模,運用,發現新模型仍然沒用,再次收集數據……
等等,模型是什么?運用又是什么?如何收集數據?
好問題。
收集數據的方式取決于問題。下文將展示一些例子,讀者也可以看看電子表中的顧客購買記錄。
建模就是運用機器學習算法從收集到的數據中尋找知識。
普通算法和機器學習算法的區別是什么?
普通的算法就像菜譜,是把原料轉換為美味菜肴的一系列指令。
機器學習的特殊之處在于,原始條件是材料和菜肴,而非指令。機器學習算法研究原料和菜肴,給出轉換所需的指令。
機器學習算法多種多樣,不同算法解決不同問題的性能不同,但是它們的目標一致,即尋找數據中的模式或者指令集。
運用就是實際應用找到的指令集。運用的形式多種多樣,既可以是在網絡商店中向顧客推薦商品,也可以是為醫療機構尋找更好的疾病檢測方案。
不同項目中每個步驟的具體細節不盡相同,但是原理基本相似。
本文重點講解數據建模。假設讀者已經收集到了數據,正準備用它構建一個機器學習模型。這個過程可以分為以下幾步:
機器學習項目可以分為三步,數據收集,建模和模型運用。本文主要關注建模階段,并假設讀者已經擁有數據。
1. 問題定義——要解決的商業問題是什么?如何把它轉化為機器學習問題?
2. 數據——既然機器學習是在數據中洞察規律,那么數據是什么類型的?它如何與問題產生關聯?數據是結構性的還是無結構的?靜態的還是動態的?
3. 模型評估——怎么樣才算成功?準確率95%的機器學習模型夠好嗎?
4. 變量——需要使用哪一部分數據?已知信息如何影響數據使用?
5. 建模——選擇哪個模型?如何改進?如何比較不同模型的性能?
6. 實驗——還可以做什么嘗試?模型的表現符合預期嗎?已知信息如何影響其他步驟?
下面深入討論上述問題。
1. 問題定義——把商業問題改寫成機器學習問題
判斷能否運用機器學習,第一步是把待解決的商業問題轉化為機器學習問題。
有監督學習、無監督學習、遷移學習和強化學習是四種主要的機器學習技術(此處為了行文簡單,省略了半監督學習)。其中監督學習、無監督學習和遷移學習最常應用于商業項目。
有監督學習
- 已知數據和類標的機器學習稱為監督學習。機器學習算法旨在研究影響類標的因素。監督發生在訓練階段。如果算法猜錯了類標,它會嘗試自我修正。
- 比如,如果試圖檢測某人是否患有心臟病,可以把100份匿名病歷作為數據,是否患有心臟病作為類標。
- 機器學習算法可以研究病歷(輸入)以及病人是否患有心臟病(輸出),然后判斷病歷中的哪些指標導致心臟病。
- 訓練好算法之后,就可以把新病歷(輸入)傳給算法,算法將預測患者是否患有心臟病(輸出)。算法返回的結果只是患病概率的大小,它并不絕對。
- 算法會告訴你:“基于觀察,這個人的病歷和心臟病人的病歷相似度達到70%。”
無監督學習
有數據而沒有類標的機器學習稱為無監督學習。以在線電子游戲商店的顧客支付記錄為例。可能希望使用這些數據將顧客分組,從而提供個性化服務。可以使用機器學習算法來完成這一任務。
觀察分組之后人為給出類標。有些組可能對電腦游戲感興趣,有些組則更喜歡獨立游戲,還有的組只購買打折游戲。這一過程稱為聚類。
一定要記住算法不提供類標,它只是尋找相似顧客間的規律。類標需要專業人士運用專業知識給出。
遷移學習
遷移學習改進已有機器學習模型發現的規律,將其用于學習新問題。
從零開始訓練機器學習模型可能浪費大量金錢和時間。好在并不總是需要自己搭建模型。有時機器學習算法在一類數據中找到的規律可以用于另一類數據。
比如一家汽車保險公司想要搭建一個文本分類模型,以判斷保險申請人是否需要承擔事故責任。
可以使用一個通讀過維基百科并且記住了單詞間規律(比如哪些詞可能搭配出現)的已有模型。使用保險申請書(數據)及其結果(類標)對模型進行微調,就可以把它運用于你的問題。
商業項目中所用到的機器學習技術很可能屬于以上三個類別。
接下來再把它們細分為分類、回歸和推薦。
- 分類——預測事物所屬的類別。比如顧客是否會購買某種商品,或者某人是否患有心臟病。注意,類別可以多于兩種。把事物分為兩類稱為二元分類,分為三類及以上稱為多元分類。多標簽指的是同一事物可以同時屬于多類。
- 回歸——預測具體數值。比如房屋的售價,或者下個月訪問網站的人數。
- 推薦——向某人推薦某物。比如基于購買記錄為顧客推薦商品,或者基于閱讀記錄向讀者推薦書目。
了解了這些,下一步就是用機器學習術語描述商業問題。
沿用剛才的汽車保險案例。保險公司的員工每天需要閱讀成千上萬的申請書,并判斷申請人是否應該承擔事故責任。
但現在申請的數量逐漸超出員工處理能力。而公司擁有成千上萬的申請書記錄,每一份都標注了申請人是否應負事故責任。
機器學習能派上用場嗎?
讀者想必已經知道答案。但還是來驗證一下。這一問題能歸到上述的三類問題——分類、回歸或者聚類之中嗎?
重新描述這一問題。
一家汽車保險公司希望把收到的保險申請分為申請人應負責任和申請人無責任兩類。
看到分類這個關鍵詞了嗎?
分析結果是,這可能是個潛在的機器學習分類問題。“潛在”是因為機器學習也可能無法解決這個問題。
把商業問題轉化為機器學習問題時,盡量由淺入深。在起始階段,超過一個句子的問題描述都是多余的。必要時再把問題復雜化。
2. 數據——數據是什么類型的?它如何與問題產生關聯?
已擁有或者需要收集的數據取決于待解決的問題。
已有的數據可能是結構數據或者非結構數據。這兩種數據又可以分別分為靜態或動態數據。
- 結構數據——比如由許多行和列構成的表格,記錄顧客交易信息的電子表,存儲病歷的數據庫。數據可能是數值,比如平均心率;也可能是類別,比如性別;或者等級,比如胸痛程度。
- 非結構數據——無法被簡單地制成表格的數據,比如圖片、音頻文件和自然語言文本。
- 靜態數據——現存的、無法改變的歷史數據。比如顧客購買記錄。
- 動態數據——經常更新的數據,可能更改舊紀錄或不斷添加新紀錄。
這四類數據可能彼此重疊。
靜態的結構化信息表也可能包含不斷更新的文本和照片。
用于預測心臟病的數據表中可能包含性別、平均心率、平均血壓和胸痛程度。
在保險申請書的例子中,可能有一項數據是發送的文本,另一項是照片,最后是申請結果。隨著新申請的輸入和舊申請的更改,表格將不斷更新。
兩種不同類型的結構數據。表格1.0包含數值和類別數據。表格2.0以結構化形式包含圖片和自然語言文本等非結構數據。
兩種不同類型的結構數據。表格1.0包含數值和類別數據。表格2.0以結構化形式包含圖片和自然語言文本等非結構數據。
盡管數據種類不同,原則都是一致的,那就是使用數據以獲取知識或者預測事件。
有監督學習使用特征變量來預測目標變量。預測心臟病可能需要用到性別這一特征變量,目標變量可能是病人是否患有心臟病。
表格1.0分成ID欄(黃色部分,不用于構建機器學習模型),特征變量(橘色部分)和目標變量(綠色)。機器學習模型識別出特征變量中的規律,用它來預測目標變量。
無監督學習沒有類標,但仍然需要發現規律。這意味著把相近的樣本分為一類,并找出離群值。
遷移學習和有監督學習需要解決相同的問題,除非要自行改變從別處得到的機器學習算法。
記住,使用客戶數據來改進商業模式或者服務質量時,一定要讓他們知情。這就是為什么到處都能看到“本網站使用cookies”的提示。這些網站研究用戶的瀏覽習慣,使用機器學習來改進服務。
3. 評估——如何定義成功的機器學習模型?準確率95%足夠好嗎?
已經把商業問題轉化成機器學習問題,也已經擁有數據。接下來考慮如何判斷模型是否成功。
分類、回歸和推薦問題的評價標準不同。選擇何種標準取決于問題類別。
要讓這個項目成功,模型的準確率至少需要達到95%。
用準確率95%的模型分析保險申請的責任人或許綽綽有余。但是心臟疾病檢測可能需要更精確的結果。
下面是分類問題中需要考慮的其他事項。
- 假陰性——模型預測結果為陰性,但結果實際上為陽性。對于預測垃圾郵件這樣的問題來說,假陰性可能無關緊要。但如果自動駕駛車輛的計算機視覺系統沒有檢測到行人,就可能釀成大禍。
- 假陽性——模型預測結果為陽性,但結果實際上為陰性。某人被診斷患有心臟病而實際上并未患病。只要沒有對病人的生活習慣造成不良影響或者進行無謂的治療,這樣的錯誤可能無關緊要。
- 真陰性——模型預測結果為陰性,真實結果也為陰性。這是理想的結果。
- 真陽性——模型預測結果為陽性,真實結果也為陽性。這也是理想的結果。
- 準確率——符合真實結果的陽性預測的比例。一個沒有產生假陽性結果的模型準確率為1.0。
- 查全率——檢測出的陽性結果占所有陽性結果的比值。一個沒有產生假陰性結果的模型查全率為1.0。
- F1值——準確率和查全率的綜合結果,數值越接近1越好。
- 接收者操作特征(ROC)曲線和曲線下面積(AUC)——ROC曲線的圖像用于比較真陽性和假陽性率。AUC是ROC曲線下的區域。完全錯誤的模型AUC為0.0,完全正確的模型AUC為1.0。
回歸問題(關于數值預測)需要降低預測結果和真實值之間的誤差。預測房屋售價時,模型的預測結果越接近實際價格越好。使用MAE或者RMSE來度量這一誤差。
- 平均絕對誤差(MAE)——模型預測結果和實際值間的平均誤差。
- 根均方誤差(RMSE)——模型預測結果和實際值間的平均方差
如果想讓數值大的錯誤更加顯著就使用RMSE來度量。比如預測為20萬美元的房子實際價格為30萬美元,差值為10萬比差值為5萬的結果要壞一倍以上。如果差值為10萬比差值為5萬壞一倍,那就使用MAE來度量。
推薦問題的解決方案更難測試。一種方式是在建模時隱藏部分數據。建模完成后再預測這部分數據的推薦結果,觀察它與實際結果的相關性。
比如為顧客推薦網店商品時,已知2010至2019年度的購買記錄。可以使用2010至2018年的數據來構建模型,然后用模型來預測2019年的情況。這樣就把問題轉化為了分類,因為目標變為了確認某人是否可能購買某件商品。
然而,傳統的分類方法并不是推薦問題的最優解。準確率和查全率沒有級別區分。
如果機器學習模型推薦了十個商品,你肯定希望頁面上首先顯示最符合顧客需求的商品,對吧?
- 準確率@k——和一般的準確率原理相同,但只在符合要求的項目中選擇k個。比如,k取5意味著只選出最好的五個推薦項。可能有10000種商品,但不可能把它們全部推薦給顧客。
特征——數據有哪些特征?哪些特征可以用來搭建模型?
數據各不相同。特征指的是數據集中不同種類的數據。
特征主要可以分為類別型,連續型(數值型)和衍生型。
- 類別型特征——特征值可以被劃分為不同的種類。比如心臟病預測問題中患者的性別。或者網店問題中某人是否購買了商品。
- 連續型(或數值型)特征——平均心率或者登錄次數這類可以用數值度量的特征。
- 衍生特征——從數據中派生出的特征,常被稱為特征工程。特征工程就是某個領域的專家運用知識生成數據。比如把登錄次數和時間戳結合起來,計算出距上次登錄時間這一新特征。或者把日期轉換為是否為工作日這一新特征。
文本、圖像,任何東西都可能是特征。任何特征都需要轉換成數值才能被機器學習算法用于構建模型。
以下是一些關于特征的注意事項。
- 保證特征在訓練和測試過程中一致——應該盡量使用接近真實系統中的特征來訓練模型。
- 和該領域的專家合作——已知信息有哪些,它們如何影響選擇使用的特征?與機器學習工程師和數據科學家分享這些信息。
- 特征是否有價值?——如果只有10%的樣本含有這一特征,它適合用于建模嗎?優先選擇覆蓋面最廣的特征,也就是說,大多數樣本都包含這些特征的對應數據。
- 完美意味著錯誤——準確率百分之百的模型往往是錯把訓練數據用于測試產生的。沒有十全十美的模型。
可以簡單地使用特征設立基本標準。客戶流失方面的專家可能知道,三周沒有登錄的顧客有80%的幾率會注銷會員。
或者,房產中介可能知道,臥室多于5個并且衛生間多于5個的房屋售價高于50萬美元。
這些標準經過了簡化,而且無需太精確。但你可以嘗試用它們來改進機器學習模型。
5. 建模——應該選擇哪個模型?如何改進模型?如何比較不同模型?
定義好問題、確定好數據、評價標準和特征之后,就可以開始建模了。
建模分為三部分,選擇模型,改進模型和比較模型。
選擇模型
選擇模型時需要考慮可讀性,可維護性,數據量以及訓練和預測方面的限制。
- 可讀性和可維護性——模型如何做出決策?如何修復錯誤?
- 數據量——數據的規模有多大?數據規模會改變嗎?
- 訓練和預測方面的限制——這一項與上兩項息息相關,有多少時間和資源可投入訓練和預測?
首先,簡化這些問題。一個藝術品般完美的模型可能很有誘惑力。但是如果2%的性能改善需要耗費10倍的計算資源和5倍的時間,或許不做改進為好。
邏輯回歸之類的線性模型通常易于理解,訓練和預測速度也比神經網絡等深度模型要快。
但是真實世界中獲取的數據不總是線性的。
那怎么辦?
決策樹集成和梯度提升算法用于處理excel表和數據幀之類的結構數據效果最好。了解隨機森林、XGBoost和CatBoost算法。
神經網絡之類的深度學習模型適用于圖片、音頻文件和自然語言文本。代價是它們需要更長的訓練和預測時間,并且更難調試。但這不意味著不應該使用它們。
遷移學習結合了深度學習模型和線性模型的優點。它使用預先訓練好的深度學習模型,將其識別出的模式輸入線性模型。這將極大節約訓練時間。
哪里可以找到預先訓練好的模型?
預訓練模型可以在PyTorch hub, TensorFlow hub, model zoo和fast.ai framework等網站上找到。
那其他種類的模型呢?
搭建模型雛形時無需自行搭建機器學習模型。前人已經留下了模型代碼。
重要的是處理輸入和輸出,使其適應已有模型。這意味著嚴格定義模型和類標,理解需要解決的問題。
首先,主要工作是確保輸入(數據)和已有模型相匹配。下一步是確保輸出符合問題定義和評價標準。
微調和改進模型
模型的最初結果并不意味著一切。可以像調試一輛汽車一樣調試并改進機器學習模型。
微調模型需要改變超參數,比如調整學習率或者優化器。或者是其他特定模型中的建構因素,比如隨機森林中樹的數量以及神經網絡的層數。
這一調整過程曾經是人工的,如今逐漸走向自動化,并將無處不在。
通過遷移學習調用預訓練模型能夠綜合前述步驟的優勢。
調試模型時應優先考慮可復制性和效率。其他人應該能夠重現你的步驟來改進他們的模型。由于主要目標是減少訓練時間而不是提出新的思路,調試過程應該是效率導向的。
比較模型
把蘋果與蘋果比較。
使用數據X訓練模型1,使用數據Y來評測
使用數據X訓練模型2,使用數據Y來評測
必須使用同樣的數據訓練和評測不同模型。模型1和2是可變的,而數據X, Y則不然。
6. 實驗——還可以嘗試什么方法?我們的發現如何影響其他步驟?模型是否表現得符合預期?
這一步包含了其他所有步驟。因為機器學習是個高度迭代的過程,必須確保實驗可以執行。
首要目標是要盡量縮小線下實驗和線上實驗間的時間差。
線下實驗發生在項目還沒有向用戶開放時。線上實驗發生在機器學習模型開始批量生產之后。
每一次實驗必須使用數據的不同部分。
- 訓練數據集——使用它來訓練模型,一般占整個數據集的70%-80%。
- 驗證/開發數據集——使用它來微調模型,一般占整個數據集的10%-15%。
- 測試數據集——使用它來測試和比較模型,一般占整個數據集的10%-15%。
這些數據集的數據量可以根據問題和數據的類型略微浮動。
如果模型在訓練集上表現不佳,意味著它沒有很好地學習。解決方案是嘗試不同的模型、改進現有的模型或者收集更多高質量數據。
如果模型在測試集上表現不佳,意味著它難以推廣。模型可能發生了過擬合。使用一個更簡單的模型或者收集更多數據。
如果模型在真實數據上表現不佳,意味著真實數據和訓練集與數據集之間差異較大。重復前面兩步。確保數據與待解決的問題相符。
嘗試大幅改變時,記錄內容和原因。記住,就像在模型微調中一樣,所有人,包括未來的你自己,都應該能夠重復你的操作。
這意味著需要定期保存最新的模型和數據集。
結合上述步驟,做出項目雛形
許多企業對機器學習略知一二,但不知道如何開始運用。最好通過上面六步做出概念模型。
此類嘗試的目的不在于從根本上改變商業運營模式,只是探索使用機器學習為公司增添商業價值的可能性。
畢竟,目標并非追趕華而不實的潮流,而是獲得真正有價值的解決方案。
規定好搭建項目雛形的期限,兩周、六周和十二周都是比較合適的。有了高質量的數據,一個優秀的機器學習和數據科學從業者可以在短時間內實現最終建模成果的80%-90%。
行業專家、機器學習工程師和數據科學家應該協同合作。否則可能搭建出一個用于錯誤對象的優秀模型,這是非常糟糕的結果。
如果可能的話,通知網絡設計師改進在線商店的布局,以幫助機器學習實驗。
由于項目雛形的特性,你的企業可能無法從機器學習中獲利。項目經理必須清楚這一點。機器學習工程師或者數據科學家也要做好白費努力的心理準備。
但無法獲利并不意味著滿盤皆輸。
無用的模型也有價值,你能從中得知什么是無用的,然后把精力花在別處。這就是為實驗設定期限的原因。時間總是不夠用,但ddl就是生產力。
如果機器學習模型表現很好,繼續下一步,否則就回到上一步。在實踐中學習比空想要快得多。
注意
數據是核心。沒有高質量的數據,任何機器學習模型都將徒勞無功。運用機器學習應該從收集高質量數據開始。
應用會改變一切。離線表現很好的模型可能在上線時表現不佳。本文的重點是數據建模。模型一旦投入使用,就會面臨架構管理、數據驗證、模型再訓練和分析等諸多問題。云服務商會提供這些服務,但把它們結合起來仍然是黑科技。如果你是老板,給你的數據工程師開出高薪。如果你是數據工程師,和老板分享你所掌握的。
數據收集和模型運用是機器學習管道中耗時最長的部分。本文僅討論了建模,但仍然遺漏了數據預處理的細節。
商業工具多種多樣。機器學習是一個由許多小工具組成的大工具。從代碼庫和框架到不同的應用架構。每一個問題都有許多不同的解決方案。最佳的實現方法總在不斷更新。但本文所討論的話題萬變不離其宗。