1. 程式人生 > 其它 >在機器學習中處理缺失資料的方法

在機器學習中處理缺失資料的方法

資料中包含缺失值表示我們現實世界中的資料是混亂的。可能產生的原因有:資料錄入過程中的人為錯誤,感測器讀數不正確以及資料處理管道中的軟體bug等。

一般來說這是令人沮喪的事情。缺少資料可能是程式碼中最常見的錯誤來源,也是大部分進行異常處理的原因。如果你刪除它們,可能會大大減少可用的資料量,而在機器學習中資料不足的是最糟糕的情況。

但是,在缺少資料點的情況下,通常還存在隱藏的模式。它們可以提供有助於解決你正嘗試解決問題的更多資訊。

我們對待資料中的缺失值就如同對待音樂中的停頓一樣 – 表面上它可能被認為是負面的(不提供任何資訊),但其內部隱藏著巨大的潛力。

方法

注意:我們將使用Python和人口普查資料集(針對本教程的目的進行修改)

你可能會驚訝地發現處理缺失資料的方法非常多。這證明了這一問題的重要性,也這證明創造性解決問題的潛力很大。

你要做的第一件事是統計你有多少人,並試著想象他們的分佈。為了使這一步正常工作,你應該手動檢查資料(或者至少檢查它的一個子集),以確定它們是如何被指定的(即確定它們是何種缺失)。可能的情況有哦:“NaN”,“NA”,“None”,“ ”,“?”等等。如果除了NaN以外,你應該使用np.nan來標準化它們。為了視覺化,我們在這裡使用missingno包。

import missingno as msno
msno.matrix(census_data)

缺失資料的視覺化 白色的地方表示NA的欄位

import pandas as pd
census_data.isnull().sum()
age                325
workclass         2143
fnlwgt             325
education          325
education.num      325
marital.status     325
occupation        2151
relationship       326
race               326
sex                326
capital.gain       326
capital.loss       326
hours.per.week     326
native.country     906
income             326
dtype: int64

我們從最簡單的事情開始:刪除。正如前面提到的,雖然這是一個快速的解決方案。但是,除非你的缺失值的比例相對較低(<10%),否則,在大多數情況下,刪除會使你損失大量的資料。想象一下,僅僅因為你的某個特徵中缺少值,你就要刪除整個觀察記錄,即使其餘的特徵都完全填充並且包含大量的資訊!

import numpy as np
census_data = census_data.replace('np.nan', 0)

第二糟糕的方法是用0(或-1)替換。雖然這能夠幫助你順利執行模型,但這種方法可能非常危險的。原因是有時候這個價可能會讓人產生誤解。設想在迴歸問題中出現負值(如預測溫度),在這種情況下,這個值會成為一個實際的資料點。

現在我們已經有了這些,讓我們變得更有創意。我們可以按其父資料型別拆分缺失值的型別:

數字NaN

一個標準的,通常非常好的方法是用均值,中位數或眾數替換缺失值。對於數值,一半來說你應該使用平均值。如果有一些離群值的話,可以試試使用中位數(因為中位數對離群值的不那麼敏感)。

from sklearn.preprocessing import Imputer
imputer = Imputer(missing_values=np.nan, strategy='median', axis=0)
census_data[['fnlwgt']] = imputer.fit_transform(census_data[['fnlwgt']])

分類NaN

分類值可能比較麻煩,所以在編輯之後,你一定要注意模型效能指標(比較之前和之後看看是否有異常情況)。標準的做法是用最常見的條目替換缺失的條目:

census_data['marital.status'].value_counts()
Married-civ-spouse       14808
Never-married            10590
Divorced                  4406
Separated                 1017
Widowed                    979
Married-spouse-absent      413
Married-AF-spouse           23
Name: marital.status, dtype: int64
def replace_most_common(x):
    if pd.isnull(x):
        return most_common
    else:
        return x
census_data = census_data['marital.status'].map(replace_most_common)

結論

我想要表達的關鍵是,你需要尋找到不同的方法從缺失的資料中獲得更多的資訊,更重要的是培養你洞察力的機會,而不是煩惱。要快樂的程式設計。

高階方法和視覺化

你可以理論上通過擬合一個迴歸模型(比如線性迴歸或kNN演算法)來估算缺失值。剩下的實現是留給讀者的示例。

kNN視覺化示例

下面是一些能在missingno包中找到的視覺化的影象,它可以以相關矩陣或樹狀圖的方式幫助你瞭解缺失值之間的關係:

缺失值的相關矩陣 經常同時缺失的值可以幫助你解決問題

缺失值的樹狀圖

或者,你也可以考慮選擇一個處理缺失值的演算法(例如,Boosting演算法)。