最全面的數據預處理介紹

郑智慧 2024-05-31 11:48 10次浏览 0 条评论 taohigo.com

寫這篇文章的原因是前段日子看瞭很多機器學習書籍,發現各種書籍對具體機器學習算法介紹非常詳細,而在實際應用中非常重要的一環——數據預處理介紹很少或者不完整。於是整理瞭一下。本文主要介紹詳細處理流程以及這樣處理的原因,對於處理方法的原理介紹較為簡略。當然,想深入瞭解原理可以根據這份框架深入研究思索,將框架和細節一起把握。

數據是機器學習的原料,在把數據投入機器學習模型前,我們需要對數據進行加工。就像榨果汁,得先把水果削皮切小塊瞭才可以投入榨汁機中,否則倒出來的連貓咪也喝不下去(不信試試┓( ´∀` )┏)。同樣的,正確預處理數據對模型輸出結果有非常非常非常(重要的事情說三遍)大的影響。可以說,數據預處理是機器學習落地最麻煩但最具有挑戰的環節。

一、數據可能存在問題

在實際業務處理中,數據通常是臟數據。所謂的臟,指數據可能存在以下幾種問題(主要問題):

  1. 數據缺失 (Incomplete) 是屬性值為空的情況。如 Occupancy = “ ”

2. 數據噪聲 (Noisy)是數據值不合常理的情況。如 Salary = “-100”

3. 數據不一致 (Inconsistent)是數據前後存在矛盾的情況。如 Age = “42” vs. Birthday = “01/09/1985”

4. 數據冗餘 (Redundant)是數據量或者屬性數目超出數據分析需要的情況。

5. 數據集不均衡 (Imbalance)是各個類別的數據量相差懸殊的情況。

6. 離群點/異常值 (Outliers)是遠離數據集中其餘部分的數據。

7. 數據重復(Duplicate)是在數據集中出現多次的數據。

二、數據預處理步驟

數據進行預處理主要有以下步驟,第一部分提及的各種臟數據的處理就在這些步驟中完成:

  1. 數據清洗 Data Cleansing

2. 數據轉換 Data Transformation

3. 數據描述 Data Description

4. 特征選擇 Feature Selection 或特征組合 Feature Combination

5. 特征抽取 Feature Extraction


在數據清洗階段,我們處理第一部分提及的缺失數據、離群點和重復數據。

缺失數據有以下幾類:

a.Missing completely at random: 缺失的概率是隨機的,比如門店的計數器因為斷電斷網等原因在某個時段數據為空。

b.Missing conditionally at random: 數據是否缺失取決於另外一個屬性,比如一些女生不願意填寫自己的體重。

c.Not missing at random: 數據缺失與自身的值有關,比如高收入的人可能不願意填寫收入。

處理方式有以下幾種:

a. 刪數據,如果缺失數據的記錄占比比較小,直接把這些記錄刪掉完事。

b. 手工填補,或者重新收集數據,或者根據領域知識來補數據。

c. 自動填補,簡單的就是均值填充,或者再加一個概率分佈看起來更真實些,也可以結合實際情況通過公式計算,比如門店計數缺失,可以參考過往的客流數據,轉化數據,缺失時段的銷售額,用一個簡單公式自動計算回補。

離群點是遠離數據集中其餘部分的數據,這部分數據可能由隨機因素產生,也可能是由不同機制產生。如何處理取決於離群點的產生原因以及應用目的。若是由隨機因素產生,我們忽略或者剔除離群點,若是由不同機制產生,離群點就是寶貝,是應用的重點。後者的一個應用為異常行為檢測,如在銀行的信用卡詐騙識別中,通過對大量的信用卡用戶信息和消費行為進行向量化建模和聚類,發現聚類中遠離大量樣本的點顯得非常可疑,因為他們和一般的信用卡用戶特性不同,他們的消費行為和一般的信用卡消費行為也相去甚遠。還有購物網站檢測惡意刷單等場景也重點對離群點進行分析。

不論是對離群點提出還是重點研究應用,我們首先需要檢測出離群點。在sklearn(一個python機器學習包)中提供瞭多種方法,如OneClassSVM、Isolation Forest、Local Outlier Factor (LOF)。需要進一步瞭解原理的可以額外看些資料。這裡就不展開瞭。

對重復數據的處理如下:如果高度疑似的樣本是挨著的,就可以用滑動窗口對比,為瞭讓相似記錄相鄰,可以每條記錄生成一個hash key, 根據key去排序。

數據清洗階段結束後,我們得到的是沒有錯誤的數據集瞭~


在數據轉換階段,我們對數據進行采樣處理、類型轉換、歸一化。

采樣是從特定的概率分佈中抽取樣本點的過程。采樣在機器學習中有非常重要的應用:將復雜分佈簡化為離散的樣本點;用重采樣可以對樣本集進行調整以更好地進行調整並適應後期的模型學習;用於隨機模擬以進行復雜模型的近似求解或推理。采樣的一個重要作用是處理不均衡數據集。

最簡單的處理不均衡樣本集的方法是隨機采樣。采樣一般分為過采樣(Over-sampling)和欠采樣(Under-sampling)。隨機過采樣是從少數類樣本集 S_min中有放回地隨機重復抽取樣本,隨機欠采樣是從多數類樣本集S_max中隨機選取較少樣本。兩種方法也存在問題,如隨機過采樣會擴大數據規模,容易造成過擬合;隨機欠采樣可能損失部分有用信息,造成欠擬合。為瞭解決上訴問題,通常在隨機過采樣時不是簡單復制樣本,而是采取一定方法生成新的樣本。如使用SMOTE(Synthetic Minority Oversampling Technique)算法、Borderline-SMOTE、ADASYN等算法。對於欠采樣,可以采用Informed Undersampling來解決數據丟失問題。

PS:當總體數據量不夠時,除瞭簡化模型,我們可以借鑒隨機過采樣的方法,對每個類進行過采樣。具體到圖像任務,還可以直接在圖像空間進行變換,如可以通過對圖像施加一定幅度的變換(旋轉、平移、縮放、裁剪、填充、翻轉、添加噪聲、顏色變換、改變亮度、清晰度、對比度等),得到擴充的數據集。此外,遷移學習也是在小數據集上進行建模的好方法。

PS:整體準確率不適用於不平衡數據集,需要引入新的度量模式比如G-mean, 它會看正類上的準確率,再看負類上的準確率,然後兩者相乘取平方根。另外一種常見的度量如F-score。

在類型轉換處理前,我們先來看下數據的類型。

數據類型可以簡單劃分為數值型和非數值型。數值型有連續型和離散型。非數值型有類別型和非類別型,其中類別型特征中如果類別存在排序問題為定序型,若不存在排序問題則為定類型,非類別型是字符串型。如下所示:

  1. 連續型 Continuous

Real values: Temperature, Height, Weight …

2. 離散型 Discrete

Integer values: Number of people …

3. 定序型 Ordinal

Rankings: {Average, Good, Best}, {Low, Medium, High} …

4. 定類型 Nominal

Symbols: {Teacher, Worker, Salesman}, {Red, Green, Blue} …

5. 字符串型 String

Text: “Tsinghua University”, “No. 123, Pingan Avenue” …

對於非數值型,我們需要進行類別轉換,即將非數值型轉換為數值型,以方便機器學習算法後續處理。

對於定序型,我們可以使用序號編碼,如成績,分為Average, Good, Best三檔,序號編碼可以按照大小關系對定序型特征賦予一個數值ID,例如Average表示為1,Good表示為2,Best表示為3,轉換後依舊保留瞭大小關系。

對於定類型,我們可以使用獨熱編碼,如顏色三原色,為Red, Green, Blue,獨熱編碼可以把三原色變為一個三維稀疏向量,Red表示為(0,0,1),Green表示為(0,1,0),Blue表示為(1,0,0)。需要註意的是,在類別值較多的情況下,可以使用稀疏向量來節省空間,目前大部分算法實現均接受稀疏向量形式的輸入。當然還有很多別的編碼方式,如二進制編碼等,感興趣的可以額外查閱資料瞭解。

對於字符串型,我們有多種表示方式,如詞袋模型(Bag of Words),TF-IDF(Term Frequency-Inverse),主題模型(Topic Model),詞嵌入模型(Word Embedding)。各種表示有不同的適用場景和優缺點,需要進一步瞭解的可以額外查資料。

經過類別轉換後,我們所有的數據均轉為瞭數值型。為瞭消除數據特征之間的量綱影響,我們需要對特征進行歸一化處理,使不同指標之間具有可比性。例如,分析一個人的身高和體重對健康的影響,如果使用米(m)和千克(kg)作為單位,身高在1.6-1.8m的數值范圍內,體重特征在50-100kg的數值范圍內,分析出來的結果會傾向於數值差別較大的體重特征。對數值型特征進行歸一化可以將所有特征都統一到一個大致相同的區間內,以便進行分析。歸一化方式通常有線性函數歸一化(Min-Max Scaling)和零均值歸一化(Z-score Normalization)。當然,不是所有的機器學習算法需要對數值進行歸一化,在實際應用中,通過梯度下降法求解的模型通常需要歸一化,因為經過歸一化後,梯度在不同特征上更新速度趨於一致,可以加快模型收斂速度。而決策樹模型並不需要,以C4.5為例,決策樹在節點分裂時主要依據數據集D關於特征x的信息增益比,而信息增益比跟特征是否經過歸一化是無關的。


在數據描述階段,我們可以根據需要計算統計量和對數據進行可視化。

數據的一般性描述有mean, median, mode, variance.

mean是均值;median是中位數,取數據排序後在中間位置的值,避免因為極端離群點影響客觀評價;mode是出現頻率最高的元素,其實用的比較少;variance是方差衡量數據集與其均值的偏離。

數據之間的相關性可以使用Pearson correlation coefficient和Pearson chi-square進行度量。前者適用與有metric data的情況,後者適用於分類統計的情況。

數據可視化一維數據圓餅圖,柱狀圖;二維數據散點圖;三維數據用三維坐標呈現;高維數據需要先做轉換或映射,比如用matlab的Box Plots,也可以用平行坐標呈現。可使用工具有很多,如matlab和Geph。


當我們做特定分析的時候,可能屬性非常多,但有些屬性是不相關的,有些屬性是重復的,所以我們需要用特征選擇挑選出來最相關的屬性降低問題難度。

我們可以通過熵增益(Entropy Information Gain)、分支定界(Branch and Bound)等方式進行特征選擇。特征選擇還有sequential forward, sequential backward, simulated annealing(模擬退火), tabu search(競技搜索), genetic algorithms(遺傳算法)等方式去優化。

為瞭提高復雜關系的擬合能力,在特征工程中經常會把一些離散特征兩兩組合,構成高階特征。如在點擊率預測問題中,原始數據有語言和類型兩種特征,為瞭提高擬合能力,語言和類型可以組合成二階特征,聯合預測對點擊率的影響。如何找到有意義的組合特征?有一種方法是基於決策樹的組合特征尋找方法。


在機器學習中,數據通常需要表示為向量的形式進行訓練,但是在對高維向量進行處理和分析時,會極大消耗系統資源,甚至產生維度災難。因此,使用低維度的向量來表示高維度的向量就十分必要。特征抽取或降維即使用低緯度向量表示高維度向量的方法。

特征抽取是主要有主成分分析(Principal Component Analysis,PCA)和線性判別分析(Linear Discriminant Analysis,LDA)兩種方式。兩者相同之處為均假設數據服從高斯分佈,都使用瞭矩陣分解的思想。兩者不同之處為PCA是無監督的算法,對降低後的維度無限制,其目標為投影方差最大;LDA是有監督的算法,降維後的維度小於類別數,其目標為類內方差最小,類間方差最大。


以上為數據預處理的步驟,希望對正在進行實操的朋友有所幫助。

Reference

  1. 袁博. 清華大學《數據挖掘:理論與算法》課件,學堂在線。
  2. Jeru_d39e. 數據挖掘:理論與算法筆記.
  3. 諸葛越等.《百面機器學習:算法工程師帶你去面試》.
  4. 胡歡武.《機器學習基礎:從入門到求職》.
  5. 高揚,衛崢, 尹會生等. 《白話大數據與機器學習》.