概況起來,常遇到的資料存在噪聲、冗餘、關聯性、不完整性等。本章將考慮這些問題,在使用演算法學習之前,首先需要對資料進行分析,根據資料的不同情況,採用不同的方法對資料進行預處理,資料預處理常見的方法如下:
1. 資料清理:主要是指將資料中缺失的值補充完整、消除噪聲資料、識別或刪除離群點並解決不一致性。主要是達到如下目標:將資料格式標準化,異常資料清除,錯誤糾正,重複資料的清除。
2. 資料整合:主要是將多個資料來源中的資料進行整合並統一儲存。
3. 資料變換:主要是指透過平滑聚集,資料概化,規範化等方式將資料轉換成適用於資料探勘的形式。
4. 資料歸約:資料探勘時往往資料量非常大,因此在少量資料上進行挖掘分析就需要很長的時間,資料歸約技術主要是指對資料集進行歸約或者簡化,不僅保持原資料的完整性,並且資料歸約後的結果與歸約前結果相同或幾乎相同。
這些資料處理技術在資料探勘之前使用,然後才能輸入到機器學習演算法中進行學習。這樣大大提高了資料探勘模式的質量,降低實際挖掘所需要的時間
0x00資料整合
我們日常使用的資料來源於各種渠道,有的是連續的資料,有的是離散資料、有的是模糊資料,有的是定性資料,有的是定量資料。資料整合就是將多檔案或者多資料庫中的異構資料進行合併,然後存放在一個統一的資料庫中進行儲存。在進行資料的整合過程中,一般需要考慮以下問題:
實體識別
主要指資料來源來源不同,其中多的概念定義不一樣
同名異意:資料來源A的某個資料特徵的名稱和資料來源B的某個資料特徵是一樣的但是表示的內容不一樣。
異名同義:資料來源A的某個特徵的名稱和資料來源B的某個特徵名稱不一樣,但是表達的內容不一樣。
單位不統一:不同地資料來源記錄的單位不一樣,比如統計身高、一個資料來源以m為單位,一個使用英尺
冗餘屬性
指資料中存在冗餘,一般分為一下兩種
同一屬性出現多次,比如兩個資料來源都記錄每天的最高溫度和最低溫度,當資料整合時,就出現了兩次。
同一屬性命名不一致而導致資料重複
資料不一致
編碼使用的不一致問題和資料表示的不一致問題,比如舊的***號15位,而新的時18位
0x01資料變換
資料變換是指將資料轉換或統一成適合於機器學習的形式。就像人類學習一樣,需要將採集的外部資料轉換成我們可以接收的形式。
由於實際過程中採集的各種資料,形式多種多樣,格式也不一致,這些都需要採用一定的資料預處理,使得他們符合機器學習的演算法使用。
資料變換常用方法如下:
使用簡單的數學函式對資料進行變換
對採集的原始資料使用各種簡單的數學函式進行轉換,常見的函式包括平方、開方、取對數、差分運算等(壓縮變大或者壓縮變小)。
歸一化
特徵歸一化也叫做資料無量綱化,主要包括:總和標準化、標準差標準化、極大值標準化、極差標準化。這裡需要說明的是,基於樹的方法是不需要進行特徵歸一化的,例如GBDT,bagging、boosting等等,而基於引數的模型或基於距離的模型,則都需要進行特徵歸一化。
總和標準化
總和標準化處理後的資料介於(0,1)之間,並且它們的和為1。總和標準化的步驟和公式也非常簡單:分別求出各聚類要素所定義的資料的總和,以各要素的資料除以該要素的資料總和,即: 經過總和標準化處理後所得的新資料滿足:
標準差標準化
標準差標準化公式如:
其中 標準差標準化處理後所得到的新資料,各要素(指標)的平均值0,標準差為1,即:
極大值標準化
結果極大值標準化的公式如下所示:
極大值標準化後的新資料,各要素的最大值為1,其餘各項都小於1。
對稀疏資料進行中心化會破壞稀疏資料的結構,這樣做沒有什麼意義,但可以對稀疏資料標準化,極大值標準化就是為稀疏資料設計的,同時這也是一種常用的方法,Python中極大值標準化為MaxAbsScaler(),如果要使用Python中標準差標準化(StandardScaler)則需要設定with_centering = False,否則將破壞資料稀疏性。
極差標準化(區間放縮法,0-1標準化)
極差標準化的計算公式如下:
經過極差標準化處理後的新資料,各要素的極大值為1,極小值為0,其餘數值均在0與1之間。這裡的min{x_ij}和max{x_ij}指的是和x_ij同一列的最小值和最大值。
如果資料中有離群點,對資料進行均值和方差的標準化效果並不好,這時候可以使用robust_scale和RobustScaler作為代替,它們有對資料中心化和資料的縮放魯棒性更強的引數。
連續特徵變換
連續特徵變換的常用方法有三種:基於多項式的資料變換、基於指數函式的資料變換、基於對數函式的資料變換。連續特徵變換能夠增加資料的非線性特徵捕獲特徵之間的關係,有效提高模型的複雜度。
#encoding=utf-8
"""
生成多項式特徵與自定義函式(如:log等)
在輸入特徵中增加非線性特徵可以有效提高模型的複雜度,其中最常用的是多項式特徵
matrix =
[[0 1 2]
[3 4 5]
[6 7 8]]
當degree = 2時,以第二行為例:
[1 3 4 5 3*3 3*4 3*5 4*4 4*5 5*5]
當degree = 3時,以第二行為例::
[1 3 4 5 3*3 3*4 3*5 4*4 4*5 5*5 3*3*3 3*3*4 3*3*5 4*4*3 4*3*5 5*5*3 4*4*4 4*4*5 4*5*5 5*5*5]
"""
import numpy as np
from sklearn.preprocessing import PolynomialFeatures
from sklearn.preprocessing import FunctionTransformer
"""生成多項式"""
X = np.arange(9).reshape(3,3)
print(X)
ploy = PolynomialFeatures(2)
print(ploy.fit_transform(X))
ploy = PolynomialFeatures(3)
print(ploy.fit_transform(X))
"""自定義轉換器"""
X = np.array([[0,1],[2,3]])
transformer = FunctionTransformer(np.log1p) #括號內的就是自定義函式
print(transformer.fit_transform(X))
transformer = FunctionTransformer(np.exp)
print(transformer.fit_transform(X))
輸出結果:
(env_default) PS F:\workspace> python .\test.py
[[0 1 2]
[3 4 5]
[6 7 8]]
[[ 1. 0. 1. 2. 0. 0. 0. 1. 2. 4.]
[ 1. 3. 4. 5. 9. 12. 15. 16. 20. 25.]
[ 1. 6. 7. 8. 36. 42. 48. 49. 56. 64.]]
[[ 1. 0. 1. 2. 0. 0. 0. 1. 2. 4. 0. 0. 0.
0.
0. 0. 1. 2. 4. 8.]
[ 1. 3. 4. 5. 9. 12. 15. 16. 20. 25. 27. 36. 45.
48.
60. 75. 64. 80. 100. 125.]
[ 1. 6. 7. 8. 36. 42. 48. 49. 56. 64. 216. 252. 288. 294.
336. 384. 343. 392. 448. 512.]]
[[0. 0.69314718]
[1.09861229 1.38629436]]
[[ 1. 2.71828183]
[ 7.3890561 20.08553692]]
(env_default) PS F:\workspace>
連續屬性離散化
1. 離散化技術分類
連續屬性的離散化方法也可以被稱為分箱法,即將一組連續的值根據一定的規則分別放到其術語的集合中。
離散化技術可以根據如何對資料進行離散化加以分類,可以根據是否使用類資訊或根據進行方向(即自頂向下或自底向上)分類。
如果離散化過程使用類資訊,則稱它為監督離散化(superviseddiscretization);否則是非監督的(unsupervised)。
如果首先找出一點或幾個點(稱作分裂點或割點)來劃分整個屬性區間,然後在結果區間上遞迴地重複這一過程,則稱它為自頂向下離散化或分裂。自底向上離散化或合併正好相反,首先將所有的連續值看作可能的分裂點,透過合併相鄰域的值形成區間,然後遞迴地應用這一過程於結果區間。
2. 無監督離散化與監督離散化
根據資料是否包含類別資訊可以把它們分成有監督的資料和無監督的資料。有監督的離散化要考慮類別資訊而無監督的離散化則不需要。
無監督離散化
假設屬性的取值空間為 ,離散化之後的類標號是 ,則無監督離散化的情況就是X已知而Y未知。以下介紹幾種常用的無監督離散化方法:
(1) 等寬演算法
根據使用者指定的區間數目K,將屬性的值域[Xmin−Xmax]劃分成K個區間,並使每個區間的寬度相等,即都等於Xmax−XminK。缺點是容易受離群點的影響而使效能不佳。
(2) 等頻演算法
等頻演算法也是根據使用者自定義的區間數目,將屬性的值域劃分成K個小區間。他要求落在每個區間的物件數目相等。譬如,屬性的取值區間內共有M個點,則等頻區間所劃分的K個小區域內,每個區域含有MK個點。
(3) K-means聚類演算法
首先由使用者指定離散化產生的區間數目K,K-均值演算法首先從資料集中隨機找出K個資料作為K個初始區間的重心;然後,根據這些重心的歐式距離,對所有的物件聚類:如果資料x距重心Gi最近,則將x劃歸Gi所代表的那個區間;然後重新計算各區間的重心,並利用新的重心重新聚類所有樣本。逐步迴圈,直到所有區間的重心不再隨演算法迴圈而改變為止。
監督離散化
監督離散化就是事先X和Y均為已知,然後找到某個函式,利用X值對Y值做預測。可以建立迴歸或者分類模型。
以下介紹的自下而上或者自上而下的分類方法都屬於監督離散化方法。
3. 齊次性的卡方檢驗
在介紹兩種基於卡方檢驗的離散化演算法之前,先來介紹一下齊次性的卡方檢驗。
資料:有rr個總體。
從每個總體中抽取一個隨機變數,記第ii個樣本含有的觀測數是 , 每個樣本的每個觀測值可以歸為cc個不同類別中的一類。記Oij為樣本ii的觀測值歸入類j的個數,所以, 對於所有的樣本i,將資料排列成以下的r∗c
| 類1 | 類2 | ⋯⋯ | 類c | 總和|
| -------- | -------- | -------- | -------- | -------- |
| 總體1| O11 | O12| ⋯⋯ | O1c | n1|
| 總體2 | O21| O22 | ⋯⋯| O21 | n2|
| ⋯⋯| ⋯⋯| ⋯⋯ | ⋯⋯ | ⋯⋯ | ⋯⋯|
| 總體r | Or1 | Or2 | ⋯⋯| Orc | nr|
| 總和 | C1 | C2 | ⋯⋯ | Cc | N|
假設:
記pijpij為隨機取到第ii個總體劃分為第jj類的機率,j∈[i,c]i∈[1,r],。
H0:同一列中所有的機率相等(即對任意的j,p1j=p2j=⋯=prjp1j=p2j=⋯=prj)。
H1:每列中至少存在兩個機率不相等(即給定j,存在i和k,使得pij≠pkj)。
檢驗統計量χ2為:
零分佈:
| 吸菸 | 不吸菸| 總計|
| -------- | -------- | -------- |
| 男 | 20 | 5 | 25|
| 女 | 10| 15 | 25|
| 總計 | 30| 20 | 50|
首先假設H0:性別和吸菸相關。
根據公式求得χ2=8.33,自由度為1,查表可得p值小於0.005,所以拒絕原假設。
4. 自上而下的卡方分裂演算法
該分裂演算法是把整個屬性的取值區間當做一個離散的屬性值,然後對該區間進行劃分,一般是一分為二,即把一個區間分為兩個相鄰的區間,每個區間對應一個離散的屬性值,該劃分可以一直進行下去,直到滿足某種停止條件,其關鍵是劃分點的選取。
分裂步驟:
依次計算每個插入點的卡方值,當卡方值達到最大時,將該點作為分裂點,屬性值域被分為兩塊。
然後再計算卡方值,找到最大值將屬性值域分成三塊。
停止準則:
當卡方檢驗顯著,即pp值<α<α時,繼續分裂區間;
當卡方檢驗不顯著,即pp值⩾α⩾α時,停止分裂區間;
5. ChiMerge演算法
ChiMerge演算法是一種基於卡方值的自下而上的離散化方法。和上一種演算法正好相反。
分裂步驟:
第一步:根據要離散的屬性對例項進行排序:每個例項屬於一個區間
第二步:合併區間,計算每一對相鄰區間的卡方值
停止準則:
當卡方檢驗不顯著,即pp值⩾α時,繼續合併相鄰區間;
當卡方檢驗顯著,即pp值<α時,停止區間合併;
6. 基於熵的離散化方法
本方法也是一種自上而下的離散化方法。首先,定義一下熵的概念:
其中, 是第i個區間中類jj的機率。
該劃分的總熵e是每個區間的熵的加權平均:
其中 是第i個區間的值的比例,n是區間個數。
劃分過程:
首先將屬性的取值值域按照值得大小排序。 把每個值看作是可能的分割點,依次把區間分成兩部分計算它們的熵值,取熵值最小的作為第一次劃分點。
然後選取一個區間,通常選擇熵值最大的區間重複此過程。
當區間個數達到使用者指定的個數或某個使用者指定的終止條件則停止繼續分裂。
本作品採用《CC 協議》,轉載必須註明作者和本文連結