數(shù)據(jù)預(yù)處理之缺失值

如今火熱的機(jī)器學(xué)習(xí)大致分為兩類(lèi):監(jiān)督學(xué)習(xí)和非監(jiān)督學(xué)習(xí)。監(jiān)督學(xué)習(xí)主要是分類(lèi),通過(guò)訓(xùn)練已知樣本數(shù)據(jù)得出最優(yōu)模型,然后據(jù)此對(duì)待測(cè)試數(shù)據(jù)進(jìn)行預(yù)測(cè)或分類(lèi),典型算法有KNN、SVM。而非監(jiān)督學(xué)習(xí)沒(méi)有原始數(shù)據(jù),把相似的聚集起來(lái),不關(guān)心這一類(lèi)具體是什么,如K-Means。
對(duì)于監(jiān)督學(xué)習(xí),當(dāng)我們獲取客觀數(shù)據(jù)之后,第一步就是對(duì)數(shù)據(jù)進(jìn)行清洗。因?yàn)樵紨?shù)據(jù)有可能很粗糙,數(shù)據(jù)缺失、屬性冗余等問(wèn)題會(huì)直接影響后續(xù)模型的性能。因此大家說(shuō),數(shù)據(jù)處理和特征工程決定了機(jī)器學(xué)習(xí)的上限,而模型的調(diào)優(yōu)則是在盡力接近這個(gè)上限。



本文主要討論對(duì)缺失數(shù)據(jù)的處理。

由于scikit-learn只支持對(duì)數(shù)值類(lèi)型的處理,所以只處理數(shù)值型缺失值。非數(shù)值型數(shù)據(jù)需要轉(zhuǎn)換成數(shù)值型數(shù)據(jù),這部分內(nèi)容后文會(huì)提到。還有,TensorFlow支持非數(shù)值型數(shù)據(jù)。

方法1:直接丟棄

frame.dropna(axis=1)
# or 
cols_with_missing = [col for col in frame.columns if frame[col].isnull().any()]
frame.drop(cols_with_missing, axis=1)

方法2:填充

  • 簡(jiǎn)單粗暴型: frame.fillna(value=5) 直接填充指定值
  • 柔和型:
from sklearn.preprocessing import Imputer
my_imputer = Imputer()
# fill the missing with mean value of corresponding column
my_imputer.fit_transform(data)

----------------------------------------------------
## 改進(jìn)版,告訴模型哪些列的數(shù)據(jù)是缺失,填充而來(lái)的
for col in cols_with_missing:
    frame[col+'_was_missing'] = frame[col].isnull()

Imputation...
  • 體貼型
from sklearn.tree import RandomForestRefressor
from sklearn.model_selection import train_test_split
cols_with_missing = [col for col in frame.columns if frame[col].isnull().any()]
# 選擇隨機(jī)森林回歸預(yù)測(cè)缺失值
rfr = RandomForestRegressor(random_state=1)


for col in cols_with_missing:
  unkown = frame[frame.col.isnull()]
  known = frame[frame.col.notnull()]
  
  train_y = known[col]
  train_X = konwn.drop(col, axis=1)
  
  test_X = unkown.drop(col, axis=1)
  rfr.fit(train_X, train_y)
  predictions = rfr.predict(test_X)
  frame.loc[(frame.col.isnull()), col] = predictions 

注意: 有的模型本身提供缺失值處理流程,<font color='red'>但我們 不應(yīng)該過(guò)分依賴(lài)模型,缺失值應(yīng)該由我們處理。</font>因?yàn)槟P吞峁┑娜笔е堤幚硗ㄓ眯詮?qiáng),而不同問(wèn)題的特征數(shù)據(jù)應(yīng)該根據(jù)內(nèi)在邏輯進(jìn)行具體分析和修正。下面介紹兩種填充缺失值的常見(jiàn)模型。

  1. 決策樹(shù)
    以隨機(jī)森林為例

    • 用對(duì)應(yīng)列的中位數(shù)填充,非數(shù)值型用眾數(shù)填充
    • 先進(jìn)行相似性度量,然后賦予權(quán)重。
  2. XGBoost
    把缺失值視為稀疏矩陣,構(gòu)建樹(shù)時(shí)先不考慮數(shù)據(jù)缺失,把缺失的數(shù)據(jù)放到左右子樹(shù),分別計(jì)算損失(loss function),擇優(yōu)處理。如果訓(xùn)練集沒(méi)有缺失數(shù)據(jù),預(yù)測(cè)時(shí)出現(xiàn)缺失數(shù)據(jù),則將其默認(rèn)分到右子樹(shù)。

  3. 數(shù)據(jù)缺失時(shí),選擇模型小結(jié):
    a. 數(shù)據(jù)量?。簝?yōu)先使用樸素貝葉斯
    b. 數(shù)據(jù)量適中: 樹(shù)模型,偏用XGBoost
    c. 數(shù)據(jù)量較大:神經(jīng)網(wǎng)絡(luò)
    d. 使用距離來(lái)度量相似性: KNN, SVM

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容