機器學習基本流程整理 - 這一篇就夠啦

機器學習基本流程

流程圖鏈接

衆所周知,ML是一個流程性很強的工作(所以很多人後面會用PipeLine),數據採集、數據清洗、數據預處理、特徵工程、模型調優、模型融合、模型驗證、模型持久化;

而在這些基本的步驟內,又存在很多種方式,比如數據採集可以是爬蟲,可以是數據庫拉取,可以是通過API獲取等等,數據清洗要注意缺失值處理,異常值處理,特徵工程更是複雜多樣,因此根據Kaggle上的一些大佬們的分享,整理了一張基本流程以及對應細分的步驟操作圖給大家,算是對各個步驟做了比較詳細的分析,應付Kaggle上的入門項目是完全夠的了,希望能夠對大家有一點幫助;

流程介紹

數據採集

所有的機器學習算法在應用場景、優勢劣勢、對數據要求、運行速度上都各有優劣,但有一點不變的是都是數據貪婪的,也就是說任何一個算法,都可以通過增加數據來達到更好的結果,因此第一步數據採集也是最基礎,最終的一步;

幾種方式介紹:

  • 爬蟲:這種通常在個人項目、公司資源不足以提供數據、原始數據不足需要擴展數據情況下使用較多,比如根據時間獲取天氣數據,一般都是通過爬蟲爬來的;
  • API:現在有很多公開的數據集,一些組織也提供開放的API接口來獲取相關數據,比如OpenDota提供Dota2相關數據,好處是通常數據更加規範;
  • 數據庫:這種算是最常見,也最理想的狀態,通過公司自身的數據庫保存數據,更加可控,也更加自由靈活;

數據清洗

更多是針對類似爬蟲這種方式獲取的數據,這種數據通常沒有一個非常固定規範的格式,數據非常不穩定,因此需要進行前期的清洗工作,工作量巨大。。。。

幾種清洗方向:

  • 檢查數據合理性:比如爬到的數據是否滿足需求;
  • 檢查數據有效性:爬到的數據量是否足夠大,以及是否都是相關數據;
  • 檢查工具:爬蟲工具是否有bug;

數據預處理

即便數據都在手上,但是因爲人爲軟件業務導致的異常數據還是比較多的,比如性別數據的缺失、年齡數據的異常(負數或者超大的數),而大多數模型對數據都有基本要求,比如不能缺失,而異常數據對模型是有影響的,因此通常都需要進行預處理;

預處理問題類型:

  • 缺失處理:
    • bug導致缺失:因爲程序bug導致缺失,這種缺失通常是少數的,一般都需要進行某種方式的填充;
    • 正常業務情況導致缺失:比如性別字段本身就是可以不填的,那麼性別就存在缺失,且這種缺失可能是大量的,這裏就要首先評估該字段的重要性以及缺失率,再考慮是填充,還是丟棄;
  • 異常處理:
    • 絕對異常:比如人的年齡200歲,這個數據放到什麼場景下都是異常;
    • 統計異常:比如某個用戶一分鐘內登陸了100次,雖然每一次登陸看着都是正常的,但是統計起來發現是異常的(可能是腳本在自動操作);
    • 上下文異常:比如冬天的北京,晚上溫度爲30攝氏度,雖然但看數據是正常,但是跟當前的日期、時間一關聯,發現是異常;

特徵工程

特徵工程決定了機器學習的上限,模型只是逼近這個上限;

這絕對不是一句空話,以目前在Kaggle上看到的各個比賽的情況,基本勝負都是出在特徵工程上,這一點也是我認爲機器學習中最重要,也最難的部分,它難並不是技術上的,而是經驗上的,一個經驗豐富的Kaggler在看到項目、數據的同時,腦子裏已經有了特徵工程的雛形,這可以幫助他很快的得到一個不錯的分數,而後續的優化上,經驗也是最重要的參考;

基本步驟:

  • 特徵構建:
    • 特徵組合:例如組合日期、時間兩個特徵,構建是否爲上班時間(工作日的工作時間爲1,其他爲0)特徵,特徵組合的目的通常是爲了獲得更具有表達力、信息量的新特徵;
    • 特徵拆分:將業務上覆雜的特徵拆分開,比如將登陸特徵,拆分爲多個維度的登陸次數統計特徵,拆分爲多個的好處一個是從多個維度表達信息,另一個多個特徵可以進行更多的組合;
    • 外部關聯特徵:例如通過時間信息關聯到天氣信息,這種做法是很有意義的,首先天氣數據不是原始數據集的,因此這樣想當於豐富了原始數據,通常來講會得到一個比僅僅使用原始數據更好的結果,不僅僅是天氣,很多信息都可以這樣關聯(比如在一個Kaggle上的房屋預測問題上,可以通過年份關聯到當時的一些地方政策、國際大事等等,都是有影響的,比如金融危機);
  • 特徵選擇:
    • 特徵自身的取值分佈:主要通過方差過濾法,比如性別特徵,1000個數據,999個是男的,1個是女的,這種特徵由於自身過於偏斜,因此是無法對結果起到足夠的幫助;
    • 特徵與目標的相關性:可以通過皮爾遜係數、信息熵增益等來判斷,思路是如果一個特徵與目標的變化是高度一致的,那麼它對於預測目標就是具有很大指導意義的;

模型調優

同一個模型不同參數下的表現依然是天差地別,通常在特徵工程部分結束後就進入到模型參數調優的步驟,這一步也是最無聊最耗時間的(反正我家電腦經常跑一晚上),由於Kaggle上個人項目一般都是在家做,因此個人電腦的性能大家都懂的,因此一個好的技巧還是比較實用的;

調參方式與工具:

  • 首先工具選擇上一般GridSearch沒得跑了,也確實比較方便;
  • 調參順序上,建議是先重要的影響大的參數,後沒那麼重要的,影響小的參數;
  • 舉例隨機森林:作爲集成方法中最常用的模型之一,通常第一個調的是n_estimator即樹的個數,其次是學習率,再其次是max_feature,會發現這三個都是隨機森林自身的參數,後面可以細調每棵樹的參數,比如最小分裂樣本數等等;

模型融合

一般來講,任何一個模型在預測上都無法達到一個很好的結果,這是因爲通常來說單個模型無法擬合所有數據,及不具備對所有未知數據的泛化能力,因此需要對多個模型進行融合,這一點在Kaggle上體現的也很明顯,好的排名中基本都用了模型融合;

融合方式:

  • 簡單融合:
    • 分類問題:投票法融合,不考慮單個模型自身的得分;
    • 迴歸問題:假設每個模型權重一致,計算融合結果;
  • 加權融合:基本同上,區別是考慮每個模型自身得分,得分高的權重大;
  • 使用模型進行融合:即將多個單模型的輸出作爲輸入送入到某個模型中,讓模型去做融合,通常可以達到最好的效果,但是由於用到了模型,因此要注意過擬合問題;

模型驗證

通過交叉驗證對模型性能進行檢驗,這裏通常都是一致的做法,需要注意的是在時間序列數據預測上,不能直接隨機的劃分數據,而是要考慮時間屬性,因爲很多特徵都依賴於時間的前後關係,利用了趨勢;

模型持久化

最後,最好將得到的模型持久化到磁盤,方便後續使用、優化時,不需要從頭開始;

流程圖

小結

機器學習任務是非常重流程的,一步一步非常嚴謹和固定,因此可以做一些總結、歸納,提取出適合自己的基本框架,基本可以套用到所有相關項目中,後面會分享一個最簡單機器學習入門項目,也展示一個最簡單的流程下,機器學習是如何工作,如何達到目的的,大家敬請期待;

最後

大家可以到我的Github上看看有沒有其他需要的東西,目前主要是自己做的機器學習項目、Python各種腳本工具、數據分析挖掘項目以及Follow的大佬、Fork的項目等:https://github.com/NemoHoHaloAi

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章