你會用Python做資料預處理嗎?
前戲
在拿到一份資料準備做挖掘建模之前,首先需要進行初步的資料探索性分析(你願意花十分鐘系統瞭解資料分析方法嗎?),對資料探索性分析之後要先進行一系列的資料預處理步驟。因為拿到的原始資料存在不完整、不一致、有異常的資料,而這些“錯誤”資料會嚴重影響到資料探勘建模的執行效率甚至導致挖掘結果出現偏差,因此首先要資料清洗。資料清洗完成之後接著進行或者同時進行資料整合、轉換、歸一化等一系列處理,該過程就是資料預處理。一方面是提高資料的質量,另一方面可以讓資料更好的適應特定的挖掘模型,在實際工作中該部分的內容可能會佔整個工作的70%甚至更多。
01、缺失值處理
由於人員錄入資料過程中或者儲存器損壞等原因,缺失值在一份資料中或多或少存在,所以首先就需要對缺失值進行處理,缺失值處理總的原則是:使用最可能的值代替缺失值,使缺失值與其他數值之間的關係保持最大。具體的常用方法如下:
- 刪除缺失值(缺失值佔比很小的情況)
- 人工填充 (資料集小,缺失值少)
- 用全域性變數填充(將缺失值填充一常數如“null”)
- 使用樣本資料的均值或中位數填充
- 用插值法(如拉格朗日法、牛頓法)
Python缺失值處理例項程式碼:
a、判斷刪除缺失值- -isnull,notnull
- 判斷缺失值可以用來計算缺失值佔比整個資料的大小,如果佔比很小可以刪除缺失值。
b、填充替換缺失值--fillna
- 如果缺失值不可以佔比很多,就不能能夠輕易的刪除缺失值,可以用上述的插值方法填充缺失值。
c、核心程式碼和結果圖
02、異常值處理
異常值是資料集中偏離大部分資料的資料。從資料值上表現為:資料集中與平均值的偏差超過兩倍標準差的資料,其中與平均值的偏差超過三倍標準差的資料(3σ原則),稱為高度異常的異常值。
- 異常值分析方法
- 3σ原則 (資料分佈為正態分佈)
- 箱型圖分析(內限or外限)。
常用處理方法如下:
- 直接刪除 (異常值佔比小)
- 暫且保留,待結合整體模型綜合分析
- 利用現有樣本資訊的統計量填充(均值等)
Python異常值處理例項程式碼:
- 檢驗是否符合正態分佈,符合用3σ原則判斷並處理,核心程式碼結果如下:
2. 當不符合正態分佈時可用箱型圖分析處理,核心結果程式碼如下:
03、資料標準化處理
資料的標準化(normalization)是將資料按比例縮放,使之落入一個小的特定區間。在某些比較和評價的指標處理中經常會用到,去除資料的單位限制,將其轉化為無量綱的純數值,便於不同單位或量級的指標能夠進行比較和加權,最典型的就是資料歸一化處理就是將資料統一對映到[0,1]區間上 。
常用資料標準化方法:
- MIN- MAX標準化(x - x_min)/(x_max-x_min)
- z-score標準化(x-x_mean)/x_std
- 小數定標標準化
- 向量歸一化
- 線性比例變換法
- 平均值法
- 指數轉換法
歸一化的目的:
- 使得預處理的資料被限定在一定的範圍
- 消除奇異樣本資料導致的不良影響
在大佬Ng的視訊課中聽過一句話,歸一化會加快梯度下降的求解速度。
應用場景說明:
- SVM、線性迴歸之類的最優化問題需要歸一化,是否歸一化主要在於是否關心變數取值;
- 神經網路需要標準化處理,一般變數的取值在-1到1之間,這樣做是為了弱化某些變數的值較大而對模型產生影響。一般神經網路中的隱藏層採用tanh啟用函式比sigmod啟用函式要好些,因為tanh雙曲正切函式的取值[-1,1]之間,均值為0;
- 在K近鄰演算法中,如果不對解釋變數進行標準化,那麼具有小數量級的解釋變數的影響就會微乎其微。
注意:沒有一種資料標準化的方法,放在每一個問題,放在每一個模型,都能提高演算法精度和加快演算法的收斂速度。所以對於不同的問題可能會有不同的歸一化方法。在分類、聚類演算法中,需要使用距離來度量相似性的時候、或者使用PCA技術進行降維的時候,Z-score standardization表現更好。
04、資料連續屬性離散化
一些資料探勘演算法,特別是分類演算法,要求資料是分類屬性形式。常常需要將連續屬性變換成分類屬性,即連續屬性離散化。 常用的離散化方法:
- 等寬法:將屬性值域分成具有相同寬度的區間,區間的個數由資料本身的特點決定,或者由使用者指定,類似於製作頻率分佈表。
- 等頻法:將相同數量的記錄放進每個區間。
- 基於聚類分析的方法。 通過分箱離散化、通過直方圖分析離散化、通過聚類、決策樹和相關分析離散化、標稱資料的概念分層產生。
05、總結
本文是筆者在學習資料分析過程中記錄下來的一些通用的資料預處理步驟,並且用Numpy、Pandas、Matplotlib等實現了每一種處理方法並可視化了處理結果。