在我們平時進行數據挖掘建模時,一般首先得對數據進行預處理,其中常用的方法包括缺失值處理、共線性處理、異常值處理、數據標準化、數據歸一化等。
缺失值處理
有時樣本的數據獲取不全,部分特征可能存在缺失值或無效值。對于這種情況,需要對數據進行缺失值處理,否則可能會導致模型訓練失敗。
對于缺失值的處理,需要用一個有效的數據來填補上,通常做法是用每一個特征的全局平均值來代替無效值。
在Python/ target=_blank class=infotextkey>Python中,有一個專門的 Imputer 類來處理缺失值。
from sklearn.preprocessing import Imputer
import numpy as np
#導入要進行缺失值處理的數據文件
data = np.genfromtxt('input.csv', skip_header=True, delimiter=',')
#無效值在數據文件中的標識是'NAN', strategy='mean'表示用全局平均值代替無效值,axis=0表示對列進行處理
imp = Imputer(missing_values='NAN', strategy='mean', axis=0)
#訓練一個缺失值處理模型
imp.fit(data)
outfile = imp.transform(data)
#存儲到本地
np.savetxt('output.csv', outfile, delimiter=',')
數據標準化
數據標準化是將數據按比例縮放,使之落入一個小的特定區間,目的在于去除數據的單位限制,轉化為無量綱的純數值,便于不同單位或量級的指標能夠進行比較和加權。歸一化處理也是數據標準化處理的一種特殊形式。
下面的代碼展示了z-score標準化,preprocessing 模塊的 scale() 方法可實現標準化。經過處理后,數據的均值為0,標準差為1。
from sklearn import preprocessing
import numpy as np
data = np.genfromtxt('input.csv', skip_header=True, delimiter=',')
#對一個數據集進行Z標準化
zdata = preprocessing.scale(data)
np.savetxt('z_core_out.txt', zdata, delimiter=',')
數據歸一化是把每個特征都縮到0-1之間時,可以用如下代碼。
min_max_scale = preprocessing.MinMaxScaler()
min_max_data = min_max_scale.fit_transform(data)
np.savetxt('min_max_out1.csv', min_max_data, delimiter=',')
多重共線性
當自變量之間存在共線性時, 模型的參數會變得極其不穩定, 模型的預測能力會下降。很難確切區分每個自變量對因變量的影響, 因此增加了對于模型結果解釋的成本。
導致出現變量間共線性的原因可能包括:
- 數據樣本不夠,導致共線性存在偶然性。
- 多個變量都基于時間有共同或相反的演變趨勢。
- 多個變量間存在一定的推移關系,但總體上變量間的趨勢一致,只是發生的時間點不一致。
- 多個變量間存在近似線性相關的關系。
解決共線性問題的常用方法包括:
- 增大樣本量:通過增加樣本量,來消除由于數據量不足而出現的偶然共線性現象。
- 嶺回歸分析(Ridge Regression):嶺回歸分析是一種專用于共線性問題的有偏估計回歸方法,通過放棄最小二乘法的無偏性,以損失部分信息、降低精度為代價來獲得更實際和可靠性更強的回歸系數。
- 逐步回歸法(Stepwise Regression):逐步回歸法是每次引入一個自變量并進行統計檢驗,然后逐步引入其他自變量,同時對所有變量的回歸系數進行檢驗。如果原來引入的變量由于后面變量的引入而變得不再顯著,那么就將其剔除,逐步得到最優回歸方程。
- 主成分回歸(Principal Components Regression):通過主成分分析,將原始參與建模的變量轉換為少數幾個主成分,每個主成分是原變量的共線性組合。然后基于主成分做回歸分析,這樣也可以在不丟失重要數據特征的前提下避開共線性問題。
- 人工去重:直接結合人工經驗,對參與回歸模型計算的自變量進行刪減,也是一個較為常用的方法,但這種方法需要操作者對于業務、模型和數據都有相對深入的理解。
分類變量處理
分類變量是指一個變量只能取到有限數量的值。比如一項關于健身產業的市場調查,日常鍛煉的頻率提供了四個選項:“從不”、“偶爾”、“每周一次”或“每周多次”。在這種情況下,數據是分類的,因為答案屬于一組固定的類別。再如汽車品牌的調查,汽車品牌的數據也是分類的。
如果將分類變量的數據直接輸入到機器學習模型而不首先對其進行預處理的話,就會出現錯誤。處理分類變量數據的常用預處理方法是:序數編碼和One-Hot 編碼。
序數編碼(Ordinal Encoding):將每個唯一值分配給不同的整數。如下例:關于是否吃早餐的調查,包括了每天、從不、偶爾和經常幾個不同的類別。
序數編碼
這些類別本身具有天然的排序關系,因此可以用序數編碼來定義類別:“從不”(0)<“偶爾”(1)<“經常”(2)<“每天”(3)。
One-hot 編碼(One-hot Encoding)
對于本身不具有排序關系的分類變量,可以采用One-hot編碼。下面舉一個One-hot編碼的例子。
One-hot編碼
在原始數據集中,“顏色”是一個分類變量,具有“紅色”、“黃色”和“綠色”三個類別。對應的 one-hot 編碼的每一列代表著每個可能值。如果原始值為“紅色”,在“紅色”列中輸入 1,其他列為0;其他顏色的原始值依此類推。
與序數編碼相比,one-hot 編碼不假設類別的排序。因此,如果分類數據中沒有明確的順序,可以期望one-hot編碼是行之有效的。
不平衡性處理
數據不平衡經常出現在分類問題上,數據不平衡指的是在數據集中不同類別的樣本數量差距很大。對于很多實際業務場景,不同類別的樣本先天就是不平衡的。
樣本類別分布不均衡從數據規模上可以分為大數據分布不均衡和小數據分布不均衡。大數據分布不均衡整體數據規模大,只是小樣本類占比比較少,比如1000W:50W,但小樣本還是可以覆蓋大部分或者全部的特征。小數據分布不均衡是小樣本包含特征過少,機器難以取得規律,即使取得也會出現過擬合,模型的準確性和健壯性會很差。對于嚴重的樣本不均衡,也沒有合適的解決辦法。
對于大數據分布不均衡,可以通過數據預處理或者模型上面想辦法解決。在模型上可以通過參數調整,或者集成學習的方法解決。本文主要說下數據預處理的辦法。
1. 過采樣
對少數數據進行有放回的過采樣,使原本的數據變得均衡,這樣就是對少數數據進行了復制,容易造成過擬合。
2. 欠采樣
對多數數據進行有放回/無放回的欠采樣,這樣會丟失一些樣本,損失信息,模型只學會了整體模式的一部分,容易欠擬合。
3.SMOTE算法
概括來說SMOTE算法是通過“插值”來為少數類合成新的樣本,來彌補少數類樣本的不足。主要過程如下。
- 采用最近鄰算法,計算每個少數樣本的K個近鄰
- 從K個近鄰中隨機選擇一些樣本進行線性插值
- 構造新的少數樣本
- 新樣本與原數據結合,形成新的訓練集
在數據挖掘前的預處理非常重要,會直接影響到模型的訓練效果,本文列出了主要的數據預處理要解決的問題以及對應方法,希望大家都能取得好的效果。