2018年12月7日 星期五

數據準備Data Preparation

AI可以再次興起

其中之一的原因就是有大量數據,但這些數據是原始數據,需要將其轉換為有意義的數據。這就是數據預處理進入圖像的地方。換言之,可以說在將數據提供給機器學習算法之前,我們需要對數據進行預處理。

步驟

Good data preparation can allow even very simple,maybe not so great machine learning algorithms to work well.

Remove Duplicates

Duplicates case are overweighed and bias ML model training
Identify duplicate cases
By unique Id
By value-with caution!
Removal strategies
keep most recent(or oldest)


二值化

這是當需要將數值轉換為布爾值時使用的預處理技術。我們可以用一種內置的方法來二值化輸入數據,比如說用0.5作為閾值,方法如下
import numpy as np
from sklearn import preprocessing

input_data = np.array([[2.1, -1.9, 5.5],
                       [-1.5, 2.4, 3.5],
                       [0.5, -7.9, 5.6],
                       [5.9, 2.3, -5.8]])

data_binarized = preprocessing.Binarizer(threshold = 0.5).transform(input_data)
print("\nBinarized data:\n", data_binarized)

現在,運行上面的代碼後,將得到以下輸出,所有高於0.5(閾值)的值將被轉換為1,並且所有低於0.5的值將被轉換為0。

二值化數據
Binarized data:
 [[1. 0. 1.]
 [0. 1. 1.]
 [0. 0. 1.]
 [1. 1. 0.]]


Treating missing values 

use exploration to detect
how are missing values coded null,

a string or number -9999,0,'NA','?',etc
數據不僅經常丟失,而且往往是不完整的。數據集中缺少的數據元素可以顯示為NULL值,空格或其他佔位符,而不僅僅是在現實世界中經常發生,它們通常是您無法控制的。使問題更加複雜的是,這些缺失值通常與機器學習模型不兼容,或者可能導致不理想的結果。那麼當我們遇到這種情況時我們能做些什麼呢?

第一個也是最明顯的答案是可以刪除數據。當我們談論數據刪除時,這可能意味著消除違規行或數據記錄或消除數據集的整個特徵(列)。但是刪除這些數據是以信息丟失為代價的,並且在每個觀察或記錄都很有價值的較小數據集中尤其成問題。

因此,我們需要一種替代方案,它們以所謂的估算值的形式出現。顧名思義,這種處理缺失值的技術允許我們用缺失值替換有意義的值。使用通常基於集中趨勢度量之一(平均值mean中值median,模式 - 最常見值)的策略生成此有意義的值。

我們可以使用scikit-learn文檔中直接提供的示例來演示使用此技術。

在示例代碼中,下面注意我們使用均值策略創建了imputer並確定了什麼構成了缺失值(在Python中NULL表示為NaN)。接下來,我們將進行一個擬合過程,在此過程中,imputer會學習您為數據集選擇的平均值或任何策略。對imputer的變換調用會替換數據集中的缺失值。示例代碼和輸出如下所示。

運行上述代碼的結果如下所示。
import numpy as np
from sklearn.preprocessing import Imputer

imp = Imputer(missing_values='NaN', strategy='mean', axis=0)
imp.fit([[1, 2], [np.nan, 3], [7, 6]])
X = [[np.nan, 2], [6, np.nan], [7, 6]]

print(imp.transform(X))
[[4.         2.        ]
 [6.         3.66666667]
 [7.         6.        ]]


Treat errors and outliers

檢測和處理異常值
數據集中的異常值是極端的觀察值或點。異常值可以是有效的或無效點(由於測量誤差而發生)並且有可能使您的機器學習模型偏差導致不良或次優結果。

處理異常值的第一步是能夠識別它們,並且首先要通過查找超出可能值範圍的值來開始。這些的例子可以包括不期望它們的負值(即人的身高/體重的負值),不切實際的數字(例如嬰兒體重大於50公斤)或其他不應該或不會發生的值。可以使用基本的匯總統計數據(最小值,最大值等)進行識別。


接下來,如果您的數據遵循正態分佈,您可以使用68-95-99.7規則之後的中位數和標準差來識別異常值。請注意,這並不總是考慮統計上的原因,因為它高度依賴於數據的分佈(這意味著您應該非常謹慎和謹慎)。

最後,由於我們正在討論機器學習,你可以猜測機器學習技術允許我們識別內點和異常值。開箱即用的scikit-learn有一些支持異常值檢測的選項(http://scikit-learn.org/stable/modules/outlier_detection.html)。您還可以使用線性回歸等模型來擬合數據線,然後根據錯誤(預測值與實際值)刪除一定比例的數據。


平均去除

這是機器學習中使用的另一種非常常見的預處理技術。基本上它用於消除特徵向量的均值,以便每個特徵都以零為中心。還可以消除特徵向量中的特徵偏差。為了對樣本數據應用平均去除預處理技術,可以編寫如下Python代碼。代碼將顯示輸入數據的平均值和標準偏差 -

import numpy as np
from sklearn import preprocessing

input_data = np.array([[2.1, -1.9, 5.5],
                       [-1.5, 2.4, 3.5],
                       [0.5, -7.9, 5.6],
                       [5.9, 2.3, -5.8]])

print("Mean = ", input_data.mean(axis = 0))
print("Std deviation = ", input_data.std(axis = 0))
運行上述代碼行後,將得到以下輸出:

Mean = [ 1.75 -1.275 2.2 ]
Std deviation =  [2.71431391 4.20022321 4.69414529]


現在,下面的代碼將刪除輸入數據的平均值和標準偏差 :
data_scaled = preprocessing.scale(input_data)
print("Mean =", data_scaled.mean(axis=0))
print("Std deviation =", data_scaled.std(axis = 0))


運行上述代碼行後,將得到以下輸出:

Mean = [1.11022302e-16 0.00000000e+00 0.00000000e+00]
Std deviation = [1. 1. 1.]


scale the features

#scaling
improper scaling biases ML model training
-features with large numeric range can dominate training
-large mean values skew model parameters
z-score:
-mean=0, standard deviation=1
if distribution is approximately normal
min-maxif distribution far from normal

fails with outliers

這是另一種數據預處理技術,用於縮放特徵向量。特徵向量的縮放是需要的,因為每個特徵的值可以在許多隨機值之間變化。換句話說,我們可以說縮放非常重要,因為我們不希望任何特徵合成為大或小。
import numpy as np
from sklearn import preprocessing

input_data = np.array([[2.1, -1.9, 5.5],
                       [-1.5, 2.4, 3.5],
                       [0.5, -7.9, 5.6],
                       [5.9, 2.3, -5.8]])

data_scaler_minmax = preprocessing.MinMaxScaler(feature_range=(0,1))
data_scaled_minmax = data_scaler_minmax.fit_transform(input_data)
print ("\nMin max scaled data:\n", data_scaled_minmax)



Min max scaled data:
 [[0.48648649 0.58252427 0.99122807]
 [0.         1.         0.81578947]
 [0.27027027 0.         1.        ]
 [1.         0.99029126 0.        ]]



Normalization


Standardization

數據標準化和規範化
我們將研究的最終數據爭論技術涉及將數據集中的特徵引入通用規模。但為什麼這有必要呢?通常,我們的數據集中的功能包括具有各種比例的數據,例如單位的銷售數量和美元的銷售收入。如果這些特徵不具有共同的標度,那麼許多機器學習模型可能會對最大特徵進行權衡,從而更嚴重地偏離模型並給出可能不准確的結果。

這些的兩種常用技術包括標準化和標準化,兩者之間的差異是微妙的。這兩種技術都會將功能帶入一個共同的比例,使用標準化我們將所有值重新調整為0到1之間的新比例。當我們嘗試測量點之間的距離時,例如進行k均值聚類時,這種技術非常有用。

第二種技術,歸一化通過將數據移位到平均值為0和標準差為1來對數據進行縮放。這種技術在重要時保留數據的分佈。

為了演示這些技術,我們可以使用先前文章中的虹膜數據集和scikit-learn中的預處理函數,並比較應用變換之前和之後的最小值和最大值。
請注意,在結果屏幕中,剪切標準化值現在全部在0和1之間,標準化值現在以0為中心。



Data Splitting

split data before training
-independent training, test and evaluation subsets
-failure to split causes information leakage

Transform Features

why transform features?
*improve distribution properties
*more covariate with label
-common transformations
*Log,exponential,square,square root,variance,etc
*difference,cumulative sum,etc.
*Nonlinear transformed features are not colinear

Interaction terms

-example:
*predict number of rider on bus route
*depends on time of day and holiday
*time of day by holiday is an interaction term
-compute interaciton terms
*mean,median,etc

Summarize

There have been several attempts to
make the process of discovering knowledge scientific.
KDD,
CRISP-DM,
CCCBig Data Pipeline
And those attempts are called the KDD process,
the CRISP-DM process, and the CCC Big Data Pipeline.
They all have very similar steps, and
data mining is only one of those steps. important one
知識發現(DD:Knowledge Discovery in Database)是從數據集中識別出有效的,新穎的,潛在有用的,以及最終可理解的模式的非平凡過程。知識發現將信息變為...
CRISP-DM (cross-industry standard process for data mining), 即為"跨行業資料採礦過程標準". 此KDD過程模型于1999年歐盟機構聯合起草. 通過近幾年的發展,CRISP-DM 模型在各種KDD過程模型中佔據領先位置,採用量達到近60%。
Data Pipeline 資料傳遞途徑