数据科学竞赛-数据挖掘赛流程
本文主要介紹數據挖掘類比賽的流程,文章教程,大部分都是原理性總結,文章較長但干貨滿滿。另附一句很喜歡的話,數據和特征決定了機器學習的上限,而模型和算法只是逼近這個上限而已。
簡介
數據挖掘的一般任務就是從已有數據中發現一些人類難以發現的規律,進而應用這些規律,如房價預測、用戶標注等。數據挖掘比賽的流程,本文主要使用很簡單的Boston數據集進行操作說明。常見的數據挖掘項目工作的流程大體上也與描述相差不大。其中最核心的步驟為特征工程,數據探索是為特征工程,特征工程是為了更好的建模。
數據獲取
說明
數據是一切工作的開端,合理的數據源在數據挖掘中十分重要。
方式
- 官方提供
- 一般數據挖掘比賽會給出很合適的表格化數據(csv格式),以此為基礎工作即可。
- 數據采集
- 采集的手段多種多樣,其中為了數據的真實性一般有兩種主要方式。
- 公開數據庫
- 為了科研事業的發展,很多科研機構都公開了采集到的人工標注的數據集,如本文的Boston數據集。
- 爬蟲采集
- 網絡上充斥著各種格式不一的數據,利用爬蟲可以采集并存儲標注這些數據,從而供機器學習工作者使用。
探索性數據分析(EDA)
說明
EDA思路較多,但大多數是以圖表方式發現數據的一些定性的特性,如離群點分析,相關性分析等,其核心目的是為特征工程提供一些思路。我曾經寫過兩篇關于簡單EDA的文章,一篇是關于PUBG數據集的文章,另一篇是關于天池新人賽“挖掘幸福感”的文章。
pandas_profiling
關于利用pandas結合matplotlib進行EDA的教程谷歌可以搜索到很多,這里過多贅述確實篇幅過長,這里推薦一個工具pandas_profiling(使用pip安裝即可),該工具可以針對DataFrame生成十分詳細的EDA結果報表。
特征工程
說明
本文最核心要講的部分,由于篇幅限制,這里只介紹一些概念和簡單操作,特征工程是一門數據科學很重要的學科,想要深入了解建議閱讀這本《特征工程入門與實踐》。一般認為,特征工程主要分為三大步驟數據預處理、特征選擇和數據降維。其中,數據預處理是三個步驟中最為繁瑣復雜且最重要的步驟。這一階段的絕大多數任務都可以通過scikit-learn包實現,上述三個任務分別對應sklearn.preprocessing、sklearn.feature_selection和sklearn.decomposition(具體可查看scikit-learn官方教程)。
數據預處理
缺失值處理
針對缺失值處理由多種方式,其中最為暴力也是最不可取的方式就是刪除存在空值的記錄(刪除存在空值的行),這會導致大量數據的丟失。比較常見的做法是缺失值填充,可以使用該列的均值、眾數等簡單填充,也可以使用拉格朗日插值法等數學方法進行填充,只要填充的方式對該列屬性來說合理即可。
數據規范化
數據規范化又叫做無量綱化,最簡單的理解是不同屬性的數據范圍可能差異巨大(如A屬性在1000-8000之間,B屬性在0-1之間,兩者對模型的貢獻在不加權時理當等同,而量綱的不同使該條件不能滿足)。常見的規范化手段有下述三種,幾種方式的取舍常常是個問題,建議如下。在需要使用距離來度量相似性的時候或者使用PCA或LDA這些需要使用協方差分析進行降維時,且數據分布近似為正態分布,標準化方法表現更好;在不涉及距離度量、協方差計算、數據不符合正太分布時,區間縮放和歸則化效果較好。如圖片像素從0-255歸一到0-1之間就是典型的歸一化方法。
標準化
又叫做Z-score標準化,數學原理為x′=x?X ̄Sx^{\prime}=\frac{x-\overline{X}}{S}x′=Sx?X?。將服從正態分布的特征值轉換為標準正態分布。
區間縮放
區間縮放的思路其實很多,但是最容易理解的就是根據最值進行縮放,數學原理為x′=x?MinMax?Minx^{\prime}=\frac{x-M i n}{M a x-M i n}x′=Max?Minx?Min?。上式縮放結果為[0-1],通過上式添加倍數或者偏移,可以調整縮放范圍。
歸一化(針對行向量)
上述兩種方法均是針對列向量的規范化處理,歸一化則是針對列向量的處理。其目的在于樣本向量在點乘運算或者其他核函數計算相似性時,擁有統一的標準,也就是都轉化為單位向量,L2規一化數學原理為x′=x∑jmx[j]2x^{\prime}=\frac{x}{\sqrt{\sum_{j}^{m} x[j]^{2}}}x′=∑jm?x[j]2?x?。
注意,標準化和歸一化(規則化)容易混淆,只需要明確標準化是使同一特征下(同一列)的數值在一定范圍浮動,如將特征變為0-1之間或者變為均值為0、方差為1的數據;規則化是指將同一樣本下(同一行)的不同特征進行規范化,這樣一個數據的不同特征具有相同的量綱及表現力,如身高為1.2而體重為120,兩種相差很大,前者根本無法起到決定作用。
定量特征二值化
定量特征二值化是因為有些特征不需要過于復雜,間斷值即具有不錯的效果了。定量特征二值化的手段一般是設置閾值進行處理。
定性特征onehot編碼
有些特征是無法用數值表達的,用字符串進行標記,但是不同字符之間是沒有大小距離之別的,但是數字有,為了保留這種無區別,onehot編碼應運而生,它是一種向量表示。
定性特征目標編碼
如果只有少量的幾個類別,那么one-hot編碼可能是個還不錯的選擇,但是隨著類別的增加,使用高維的one-hot編碼可能就不太合適了。這是我們可以考慮目標編碼(Target encoding),它也是表示定性分類特征列的一種非常有效的方法,它只占用一個特征列,該列中每個值就是該類別的均值,因此也被稱為均值編碼。它可以更加直接地表示分類變量和目標變量地關系,在數據科學競賽中是一種常用手段。
數據變換
常見的數據變換有基于多項式的、基于指數函數的、基于對數函數的等。4個特征,度為2的多項式變換公式為(x1′x2′x3′x4′x5′x6′x7′x8′x9′x10′x11′x12′x13′x14′x15′)=(1,x1,x2,x3,x4,x12,x1?x2,x1?x3,x1?x4,x22,x2?x3,x2?x4,x32,x3?x4,x42)\left(x_{1}^{\prime} x_{2}^{\prime} x_{3}^{\prime} x_{4}^{\prime} x_{5}^{\prime} x_{6}^{\prime} x_{7}^{\prime} x_{8}^{\prime} x_{9}^{\prime} x_{10}^{\prime} x_{11}^{\prime} x_{12}^{\prime} x_{13}^{\prime} x_{14}^{\prime} x_{15}^{\prime} \right)=\left(1, x_{1}, x_{2}, x_{3}, x_{4}, x_{1}^{2}, x_{1} * x_{2}, x_{1} * x_{3}, x_{1} * x_{4}, x_{2}^{2}, x_{2} * x_{3}, x_{2} * x_{4}, x_{3}^{2}, x_{3} * x_{4}, x_{4}^{2}\right)(x1′?x2′?x3′?x4′?x5′?x6′?x7′?x8′?x9′?x10′?x11′?x12′?x13′?x14′?x15′?)=(1,x1?,x2?,x3?,x4?,x12?,x1??x2?,x1??x3?,x1??x4?,x22?,x2??x3?,x2??x4?,x32?,x3??x4?,x42?),這在scikit-learn中是封裝的。同時,基于單變元函數的數據變換可以使用同一接口完成,即可以使用FunctionTransformer定制。
特征選擇
- Filter
- 過濾法,不考慮后續學習器,按照發散性或者相關性對各個特征進行評分,設定閾值或者待選擇閾值的個數,選擇特征。
- 方差選擇法
- 計算各個特征的方差,根據閾值,選擇方差大于閾值的特征。
- 單變量特征選擇
- 單變量特征選擇能夠對每一個特征進行測試,衡量該特征與目標變量之間的關系,根據得分丟棄不好的特征。對于有監督學習如分類和回歸問題,可以采用卡方檢驗等方式對特征進行測試。其中卡方檢驗適合y離散的分類問題,pearson系數適合y連續的回歸問題。
- 互信息和最大信息系數
- 距離相關系數
- Wrapper
- 包裝法,需考慮后續學習器,根據目標函數(通常為預測效果得分),每次選擇或者排除若干特征。其主要思想為,根據目標函數,每次選擇或者排除若干特征。也可以將特征子集的選擇看做一個搜索尋優問題,生成不同的組合,對組合進行評價,再與其他的組合進行比較。這樣就將子集的選擇看做是一個優化問題,這里有很多的優化算法可以選擇,尤其是一些啟發式的算法,如GA(遺傳算法),PSO(粒子群算法)和ABC(人工蜂群算法)算法。
- 遞歸特征消除法
- Embedded
- 嵌入法,是Filter和Wrapper方法的結合,先使用某些機器學習模型訓練,得到各個特征的權值系數,根據系數從大到小選擇特征。其主要思想理解來就是在確定模型的過程中,挑選出那些對模型的訓練意義重大的特征。
- 基于懲罰項的特征選擇法
- 基于樹模型的特征選擇法
降維
經過前面的步驟,得到訓練數據的維度是相當高的,一方面高維特征導致矩陣運算量大,訓練時間長;另一方面,過于冗余的特征對模型的效果是會產生一定程度的負面影響,干擾模型的擬合。因此,降維大多數時候是必要的手段,常用的降維方法有PCA(主成分分析)和LDA(線性判別分析),前者無監督,后者有監督,后者的本質是一個分類模型。上述兩種方法都是將原本的樣本空間映射到低維的樣本空間內,但是兩者目標不同:PCA是為了讓映射后的樣本具有最大的發散性;LDA是為了讓映射后的樣本具有最好的分類性能。
特征構造
往往,篩選更有價值的特征有利于模型的擬合,但是很多時候輸入模型的數據其特征對于模型來說是遠遠不夠的,體現在比賽中最常見的手段則是特征構造,這和數據變換操作上是類似的,但是實際目的是不同的,往往,特征構造是利用多個已有特征進行組合(如加權高次組合,注意不能線性組合),產生新的特征。在實際比賽中,利用傅里葉變換,高次組合等進行特征構造是常見提高score的手段,但是若想構造非常合理有效的特征則需要對賽題背景及每個特征的含義有充分的理解。
模型構建
說明
一般到這個階段,已經得到了較為完美的可用于模型訓練和預測的數據,根據任務選擇合適的模型就是這一步的關鍵了。一般,比賽中比較常見的是兩類問題即分類和回歸,其余的一些非監督問題不方便量化衡量好壞,出現不多。
基礎模型
常用的機器學習基礎模型有KNN(K近鄰)、DT(決策樹)、NB(樸素貝葉斯)、SVM(支持向量機)、LR(線性回歸)等。不同的基礎模型的使用場合見我這篇詳細分析的文章。為了追求較好的結果,單純的某個機器學習模型的應用領域已經越來越窄,現在的一般思路都是將這些模型作為基模型,利用集成方法進行模型集成,繼而得到較為合適的強模型。
集成模型
為了追求更強的模型效果,通常會將多個模型集成,集成的思路很多,簡單的有多模型投票法、加權平均法等,隨著集成學習的研究深入,大題上形成了三種主流集成方法Bagging(隨機森林)、Boosting(AdaBoosting)、Stacking(Blending長被認為與Stacking類似)。
XGBoost和Lightgbm都是在樹模型基礎上基于Boosting策略形成的算法,該兩者的代碼實現庫被稱為Kaggle利器。
當然,也可以自己進行模型的集成,設計集成思路,方便的mlxtend和ML-ensemble庫都提供了很方便的集成模型接口,兼容scikit-learn。關于Stacking和mlxtend的使用可以參考我的博客,這里不多贅述。
模型應用
比賽刷分固然是很有成就感的事情,但是各類企業發布真實數據提供巨額獎金給參賽者,目的當然是找到合適的可落地應用的模型,這就要求模型的優化達到一定程度,再準確率的前提下不可太過冗余。
一般,模型的部署是個生產環境比較常見的操作,只要研究人員提供較為完美的訓練后的模型文件即可,有興趣可以查閱相關資料,這里不多說明了。
補充說明
本文較為簡略的說明了數據挖掘類比賽的主要流程及方法,由于篇幅限制沒有過細展開,具體的相關問題可以查看我的其他博客。博客同步至我的個人博客網站,歡迎查看。如有錯誤,歡迎指正。
總結
以上是生活随笔為你收集整理的数据科学竞赛-数据挖掘赛流程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Kaggle平台
- 下一篇: TensorFlow2-基础操作