資料預處理-資料清理

娃哈哈店長發表於2020-01-19

主要是針對資料之中包含缺失的資料,存在異常資料和資料包含噪聲的情況。當出現這些情況的時候,需要對資料進行過濾清洗清理。

概況起來,常遇到的資料存在噪聲、冗餘、關聯性、不完整性等。本章將考慮這些問題,在使用演算法學習之前,首先需要對資料進行分析,根據資料的不同情況,採用不同的方法對資料進行預處理,資料預處理常見的方法如下:

1. 資料清理:主要是指將資料中缺失的值補充完整、消除噪聲資料、識別或刪除離群點並解決不一致性。主要是達到如下目標:將資料格式標準化,異常資料清除,錯誤糾正,重複資料的清除。 

2. 資料整合:主要是將多個資料來源中的資料進行整合並統一儲存。

3. 資料變換:主要是指通過平滑聚集,資料概化,規範化等方式將資料轉換成適用於資料探勘的形式。

4. 資料歸約:資料探勘時往往資料量非常大,因此在少量資料上進行挖掘分析就需要很長的時間,資料歸約技術主要是指對資料集進行歸約或者簡化,不僅保持原資料的完整性,並且資料歸約後的結果與歸約前結果相同或幾乎相同。

這些資料處理技術在資料探勘之前使用,然後才能輸入到機器學習演算法中進行學習。這樣大大提高了資料探勘模式的質量,降低實際挖掘所需要的時間

 0x00異常資料分析和處理

- MAD法:

MAD又稱為絕對值差中位數法(Median Absolute Deviation)。MAD 是一種先需計算所有因子與平均值之間的距離總和來檢測離群值的方法。

處理的邏輯:第一步,找出所有因子的中位數 Xmedian;第二步,得到每個因子與中位數的絕對偏差值 Xi−Xmedian;第三步,得到絕對偏差值的中位數 MAD;最後,確定引數 n,從而確定合理的範圍為 [Xmedian−nMAD,Xmedian+nMAD],並針對超出合理範圍的因子值做如下的調整:

資料預處理

- 3σ法

    又稱為標準差法。標準差本身可以體現因子的離散程度,是基於因子的平均值 Xmean而定的。在離群值處理過程中,可通過用 Xmean±nσ來衡量因子與平均值的距離。

標準差法處理的邏輯與MAD法類似,首先計算出因子的平均值與標準差,其次確認引數 n(這裡選定 n = 3),從而確認因子值的合理範圍為 [Xmean−nσ,Xmean+nσ],並對因子值作如下的調整:

資料預處理

- 百分位法:

    計算的邏輯是將因子值進行升序的排序,對排位百分位高於97.5%或排位百分位低於2.5%的因子值,進行類似於 MAD 、 3σ 的方法進行調整。

- 箱型圖分析

箱型圖提供了一個識別異常值的標準,即大於或小於箱型圖設定的上下界的數值即為異常值,箱型圖如下圖所示:

資料預處理

首先我們定義下上四分位和下四分位。

上四分位我們設為 U,表示的是所有樣本中只有1/4的數值大於U

同理,下四分位我們設為 L,表示的是所有樣本中只有1/4的數值小於L

那麼,上下界又是什麼呢?

我們設上四分位與下四分位的插值為IQR,即:IQR=U-L

那麼,上界為 U+1.5IQR ,下界為: L - 1.5IQR

異常值的處理方法常用有四種

1.刪除含有異常值的記錄

2.將異常值視為缺失值,交給缺失值處理方法來處理

3.用平均值來修正

4.不處理

需要強調的是,如何判定和處理異常值,需要結合實際

 0x01缺失值處理

造成資料缺失的原因是多方面的,主要可能有以下幾種:

1.  有些資訊暫時無法獲取,致使一部分屬性值空缺出來。

2.  有些資訊因為一些人為因素而丟失了。

3.  有些物件的某個或某些屬性是不可用的。如一個未婚者的配偶姓名。

4.  獲取這些資訊的代價太大,從而未獲取資料。

空值的存在,造成了以下影響:

1.  系統丟失了大量的有用資訊;

2.  系統的不確定性更加顯著,系統中的確定性成分更難把握;

3.  包含空值的資料會使挖掘過程陷入混亂,導致不可靠的輸出。

處理缺失值的方法有很多,如忽略存在缺失資料的記錄、

  手工填寫缺失值、使用預設值代替缺失值、使用屬性平均值  去掉包含缺失資料的屬性、使用同類樣本平均值代替缺失值、預測最可能的值代替缺失值等。(中位數或眾數)代替缺失值、

  其中,經常使用資料補插方法來代替缺失值,這些方法又可以細分為以下幾種。

  (1)最近鄰補插:使用含有缺失值的樣本附近的其他樣本的資料替代:或者前後教據的平均值替代等。

  (2)迴歸方法:對含有缺失值的屬性,使用其他樣本該屬性的值建立擬合模型, 然後使用該模型預測缺失值。

  (3)插值法:和迴歸法類似,該方法使用已知資料建立合適的插值函式,缺失值使用該函式計算出近似值代替。常見的插值函式有拉格朗日插值法、牛頓插值法、分段插值法、樣條插值法、Hermite 插值法等。

 0x02噪聲資料處理 

1.噪聲是什麼?資料集中的干擾資料(對場景描述不準確的資料)

2.噪聲怎麼產生的?舉個例子:手機訊號來自於基站發射的電磁波,有的地方比較強,有的地方比較弱。運營商的工程師會負責統計不同區域訊號強弱來進行網路規劃,工程師採集訊號的方法就是將一個訊號接受終端固定到車上,然後開車繞著基站轉,訊號終端就會自動採集不同區域的訊號強度,生成一份資料。但是如果車在採集過程中遇到了突發事件、急剎車,就可能會對訊號採集造成一定的影響,生成噪聲資料。

3.噪聲對模型訓練有什麼影響?很多演算法,特別是線性演算法,都是通過迭代來獲取最優解的,如果資料中含有大量的噪聲資料,將會大大的影響資料的收斂速度,甚至對於訓練生成模型的準確也會有很大的副作用。

 0x03去除噪聲方法1-正態分佈

根據不同的業務場景有不同的處理方法,這裡只提出正態分佈3σ原則。正態分佈也叫常態分佈,是連續隨機變數概率分佈的一種,自然界、人類社會、心理、教育中大量現象均按正態分佈,如能力的高低、學生成績的好壞都屬於正態分佈,我們可以把資料集的質量分佈立傑成一個正態分佈。它會隨著隨機變數的平均數、標準差與單位不同而有不同的分佈形態。正態分佈可以表示成一種概率密度函式。

正態分佈公式

其中,σ可以表示成資料集的標準差,μ代表資料集的均值,x代表資料集的資料。相對於正常資料,噪聲資料可以理解為小概率資料。

資料預處理

正態分佈具有這樣的特點:x落在(μ-3σ,μ+3σ)以外的概率小於千分之三。根據這一特點,我們可以通過計算資料集的標準差,把三倍於資料集的標準差的點設想為噪聲資料排除。

資料預處理

示例


from __future__ import division

mat = [[19, 26, 63], [13, 62, 65], [16, 69, 15], [14, 56, 17], [19, 6, 15], [11, 42, 15], [18, 58, 36], [12, 77, 33],

       [10, 75, 47], [15, 54, 70], [10017, 1421077, 4169]]

       # 獲得矩陣的欄位數量

def width(lst):

    i = 0;

        for j in lst[0]:

            i += 1

            return i

    # 得到每個欄位的平均值

def GetAverage(mat):

    n = len(mat)

        m = width(mat)

        num = [0] * m

        for i in range(0, m):

            for j in mat:

                    num[i] += j[i]

                    num[i] = num[i] / n

            return num

    # 獲得每個欄位的標準差

def GetVar(average, mat):

    ListMat = []

        for i in mat:

            ListMat.append(list(map(lambda x: x[0] - x[1], zip(average, i))))

            n = len(ListMat)

        m = width(ListMat)

        num = [0] * m

        for j in range(0, m):

            for i in ListMat:

                    num[j] += i[j] * i[j]

                    num[j] /= n

            return num

    # 獲得每個欄位的標準差

def GetStandardDeviation(mat):

    return list(map(lambda x:x**0.5,mat))

    # 對資料集去噪聲

def DenoisMat(mat):

    average = GetAverage(mat)

        variance = GetVar(average, mat)

        standardDeviation=GetStandardDeviation(variance)

        section = list(map(lambda x: x[0] + 3*x[1], zip(average, standardDeviation)))

        n = len(mat)

        m = width(mat)

        num = [0] * m

        denoisMat = []

        noDenoisMat=[]

        for i in mat:

            for j in range(0, m):

                    if i[j] > section[j]:

                            denoisMat.append(i)

                                break

                            if j==(m-1):

                            noDenoisMat.append(i)

                    print("去除完噪聲的資料:")

        print(noDenoisMat)

        print("噪聲資料:")

        return denoisMat

    if __name__ == '__main__':

    print("初始資料:")

        print(mat)

        print(DenoisMat(mat))

 0x04去除噪聲方法2-分箱

分箱方法是一種簡單常用的預處理方法,通過考察相鄰資料來確定最終值。所謂“分箱”,實際上就是按照屬性值劃分的子區間,如果一個屬性值處於某個子區間範圍內,就稱把該屬性值放進這個子區間所代表的“箱子”內。把待處理的資料(某列屬性值)按照一定的規則放進一些箱子中,考察每一個箱子中的資料,採用某種方法分別對各個箱子中的資料進行處理。在採用分箱技術時,需要確定的兩個主要問題就是:如何分箱以及如何對每個箱子中的資料進行平滑處理。

分箱的方法:有4種:等深分箱法、等寬分箱法、最小熵法和使用者自定義區間法。

統一權重,也成等深分箱法,將資料集按記錄行數分箱,每箱具有相同的記錄數,每箱記錄數稱為箱子的深度。這是最簡單的一種分箱方法。

統一區間,也稱等寬分箱法,使資料集在整個屬性值的區間上平均分佈,即每個箱的區間範圍是一個常量,稱為箱子寬度。

使用者自定義區間,使用者可以根據需要自定義區間,當使用者明確希望觀察某些區間範圍內的資料分佈時,使用這種方法可以方便地幫助使用者達到目的。

例:客戶收入屬性income排序後的值(人民幣元):800 1000 1200 1500  1500 1800 2000 2300 2500 2800 3000 3500 4000 4500 4800 5000,分箱的結果如下。

統一權重:設定權重(箱子深度)為4,分箱後


箱1:800 1000 1200 1500

箱2:1500 1800 2000 2300 

箱3:2500 2800 3000 3500

箱4:4000 4500 4800 5000   

統一區間:設定區間範圍(箱子寬度)為1000元人民幣,分箱後


箱1:800 1000 1200 1500 1500 1800

箱2:2000 2300 2500 2800 3000

箱3:3500 4000 4500

箱4:4800 5000 

使用者自定義:如將客戶收入劃分為1000元以下、1000 ~ 2000、2000 ~ 3000、3000 ~ 4000和4000元以上幾組,分箱後


箱1:800 

箱2:1000 1200 1500 1500 1800 2000 

箱3:2300 2500 2800 3000  

箱4:3500 4000 

箱5:4500 4800 5000 

分箱後需要對每一個資料求平均值處理

資料平滑方法:按平均值平滑、按邊界值平滑和按中值平滑。

⑴按平均值平滑 

對同一箱值中的資料求平均值,用平均值替代該箱子中的所有資料。 

⑵按邊界值平滑 

用距離較小的邊界值替代箱中每一資料。 

⑶按中值平滑 

取箱子的中值,用來替代箱子中的所有資料。 

 0x05聚類方法

將物理的或抽象物件的集合分組為由類似的物件組成的多個類。

找出並清除那些落在簇之外的值(孤立點),這些孤立點被視為噪聲。

 0x06迴歸方法

試圖發現兩個相關的變數之間的變化模式,通過使資料適合一個函式來平滑資料,即通過建立數學模型來預測下一個數值,包括線性迴歸和非線性迴歸。

本作品採用《CC 協議》,轉載必須註明作者和本文連結

文章!!首發於我的部落格Stray_Camel(^U^)ノ~YO

相關文章