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






