大資料預處理
- 0 前言
- 1 資料标準化
- 1.1 标準化定義
- 1.2 為什麼要進行資料标準化?
- 1.3 執行個體操作
- 2 資料縮放化
- 2.1 0-1縮放
- 2.2 執行個體操作
- 3 資料歸一化
- 3.1 資料歸一化定義
- 3.2 執行個體操作
- 4 二值化
- 4.1 二值化定義
- 4.2 實際操作
- 5 獨熱編碼
- 5.1 獨熱編碼定義
- 5.2 執行個體操作
- 6、标簽編碼
- 6.1 标簽編碼定義
- 6.2 執行個體操作
- 7 缺失值處理
- 7.1 處理方式
- 7.2 執行個體操作
作者:Be_melting
0 前言
在進行資料分析項目案例之前,需要了解資料的情況,有時候拿到的資料并不是想象中的完美資料,那麼就需要進行預處理後才能使用。為了系統的縷清預處理的一般的步驟,這裡進行詳細的梳理,采用sklearn工具包和手寫代碼驗證的方式進行。
1 資料标準化
1.1 标準化定義
标準化的定義:又被稱為均值移除(mean removal),對不同樣本的同一特征值進行處理,最終均值為0,标準差為1,采用此種方式我們隻需要使用如下公式即可。
- 資料均值
- 資料标準差
1.2 為什麼要進行資料标準化?
在機器學習中,很多的算法和評估模型的好壞的方法都是基于距離(殘差)的處理,也就是或者是,是以在進行資料随機采樣的時候應該避免不同距離對模型影響,故需要進行标準化處理,保準随機取的資料是等距離的。說人話,借用圖像舉例,就是要把不同的橢圓,最後處理成為正圓,這樣在圓上取任意值到原點的距離都相等。
1.3 執行個體操作
import numpy as np
from sklearn import preprocessing
data = np.array([[3, -1.5, 2, -5.4], [0, 4, -0.3, 2.1], [1, 3.3, -1.9, -4.3]])
輸出結果為:(資料随機設定的,友善後面進行手動驗證)
按照标準化的公式,要先計算均值和方差,那麼有個問題就來了:計算的資料是橫向(一行資料,axis = 1),還是縱向(一列資料,axis = 0)的呢?每一列(縱向)都代表着一個字段的資料,而每一行卻包含了所有字段中的一個資料,而在計算均值和方差時候應該選取的是某個字段進行,也就是需要計算縱向的資料
print('均值: ',data.mean(axis = 0))
print('标準差: ', data.std(axis = 0))
輸出結果為:
接下來就可以進行手動驗證
import math
math.sqrt(((3-1.33333333)**2+(0-1.33333333)**2+(1-1.33333333)**2)/3)
輸出結果為:1.247219128924647(這裡隻進行第一列的标準差的驗證,其餘列也是一樣的,均值可以口算)
最終标準化後的結果為:(以第一列第一行的資料進行展示)
以上的過程雖然原理很簡單,操作起來也不是很難,但是要是每次進行資料處理之前都得一個資料一個資料的挨個處理,就顯着很浪費時間,是以就可以使用
preprocessing
函數進行處理
核心代碼:
preprocessing.scale()
data_standarized = preprocessing.scale(data)
print('均值: ',data_standarized.mean(axis = 0))
print('标準差: ', data_standarized.std(axis = 0))
輸出的結果為:(一行代碼搞定标準化。由于python計算精度的問題,均值這裡實際上是為0的,10的負17次方,相當于很微小的數值了)
2 資料縮放化
2.1 0-1縮放
對不同樣本的同一特征值,減去其最小值,除以(最大值-最小值), 最終原最大值為1,原最小值為0,這樣在資料分析時可以有效的消除不同機關大小對最終結構的權重影響。(例如股票類資訊,如果股價是5-7元之間浮動,但是每天成交量在100萬上下,在不采用縮放的模式下,成交量的資料權重會比股價高上幾萬倍,導緻最終預測資料出現畸形)
2.2 執行個體操作
如果直接使用numpy進行操作,依據計算的公式求解如下
除了手動計算外,也可以直接調用sklearn中的子產品,也是在
preprocessing
函數中,使用
MinMaxScaler
方法
核心代碼:
preprocessing.MinMaxScaler()
data_scaler = preprocessing.MinMaxScaler(feature_range = (0,2))
data_scaled = data_scaler.fit_transform(data)
輸出結果為:(
MinMaxScaler
括号裡可以進行參數的調整,根據自己的需求進行設定,比如将區間縮放至0-2,得到的結果就是剛剛利用numpy求解的2倍)
3 資料歸一化
3.1 資料歸一化定義
如果要調整特征向量中的值時,可以使用資料歸一化,以便可以使用通用比例尺對其進行測量。機器學習中最常用的規範化形式之一是調整特征向量的值,使其總和為1(友善查找重要特征)。常見的處理方式有如下幾種:L1模式, L2模式。
L1模式:了解就是加了絕對值的,也是常見的一種模式,還有其他很多的名字稱呼,比如熟悉的曼哈頓距離,最小最對誤差等。使用L1模式可以度量兩個向量間的差異,如絕對誤差和(Sum of Absolute Difference)
L2模式:了解就是加了平方的,是最常見最常用的一種模式,也有其他的稱呼,比如使用最多的歐氏距離就是L2模式。通常用來做優化目标函數的正則化項,放置模型為了迎合訓練集而過于複雜造成的過拟合情況,進而提高模型的泛化能力(可以參考一下邏輯回歸進行信用卡欺詐預測案例中,如果懲罰項參數選擇L2,結果會如何)
3.2 執行個體操作
核心代碼:
preprocessing.normalize()
L1 模式
data_normalized = preprocessing.normalize(data,'l1',axis = 0)
print(data_normalized)
data_norm_abs = np.abs(data_normalized)
print(data_norm_abs.sum(axis=0))
輸出的結果為:(可以看出每一列轉化後的資料相加都為1)
L2模式
data_normalized = preprocessing.normalize(data,'l2',axis = 0)
print(data_normalized)
#0.31622777*3 = 0.9486833...
(data_normalized*data_normalized).sum(axis = 0)
輸出的結果為:(每一列轉化後的資料按照公式計算也都為1,比例保持不變)
4 二值化
4.1 二值化定義
當我們要将數字特征向量轉換為布爾向量時,可以使用二值化(就是根據自己指定的門檻值,如果超過這個門檻值就為1,小于這個門檻值就為0)。在數字圖像處理領域,圖像二值化是将彩色或灰階圖像轉換為二進制圖像(即僅具有兩種顔色(通常是黑白)的圖像)的過程。
此技術用于識别對象,形狀,尤其是字元。通過二值化,可以将感興趣的對象與發現對象的背景區分開,比如常見的人物黑白畫像。
4.2 實際操作
核心代碼:
preprocessing.Binarizer()
data_binarized = preprocessing.Binarizer(threshold = 1.4).transform(data)
print(data_binarized)
print(data)
輸出的結果為:(可以設定門檻值,大于該值的資料都為1,不大于的都為0,最後的資料有0和1)
5 獨熱編碼
5.1 獨熱編碼定義
在很多的計算模型中都是隻能進行數值的處理,但是資料中經常會遇到各種 分類資料 的情況,是以就需要将分類資料進行數值編碼。獨熱編碼就是将分類資料轉化為0-1編碼的,獨熱編碼器可以将一鍵編碼視為一種可以強化特征向量的工具。基于該方案對特征向量中的每個特征進行編碼。這有助于我們提高空間效率。編碼過程如下
關于獨熱的了解:經過編碼後,一行資料中,隻有一個資料是1,其餘的都是0,對比紅路燈,在一個時刻,該訓示燈隻能顯示一種顔色
5.2 執行個體操作
核心代碼:
preprocessing.OneHotEncoder()
給出舉例資料
data = np.array([[1, 1, 2], [0, 2, 3], [1, 0, 1], [0, 1, 0]])
print(data)
輸出的結果為:(資料共四行三列,假設這三列的名稱分别為ABC,可以發現A中共有兩個特征0和1,B中有三個特征,C中有四個特征)
那麼接下來進行獨熱編碼,根據上面的設定,經過獨熱編碼後的結果應該有9個特征,前兩個對應A字段,中間三個對應B字段,最後四個對應C字段
encoder = preprocessing.OneHotEncoder()
encoder.fit(data)
encoder_vector = encoder.transform([[0,0,0]]).toarray()
print(encoder_vector)
encoder_vector = encoder.transform([[1,0,3]]).toarray()
print(encoder_vector)
輸出結果為:(這裡以[[0,0,0]]舉例,A中兩個特征,0在前面第一個位置,B中三個特征,0在第一個位置,C中三個特征,0也在第一個位置。對比這種位置關系[[1,0,3]]獨熱編碼後就不難了解了)
如果數字覺得不好了解的話,那這裡進行張三李四帶入
data = np.array([['張三', '張三', '李四'], ['王五', '李四', '趙六'], ['張三', '王五', '張三'], ['王五','張三', '王五']])
print(data)
encoder = preprocessing.OneHotEncoder()
encoder.fit(data)
encoder_vector = encoder.transform([['張三','張三','張三']]).toarray()
print(encoder_vector)
輸出結果為:(這裡就和上面是一個原理,隻不過采用中文文本資料進行展示,友善了解)
6、标簽編碼
6.1 标簽編碼定義
除了進行獨熱編碼外,分類變量可以進行标簽編碼,就是不光隻有0和1,還可以有其它的數值。标簽編碼常見的稱呼就是給資料“貼标簽”和找标簽對應的資料,也可以手動操作
6.2 執行個體操作
核心代碼:
preprocessing.LabelEncoder()
input_classes = ['audi', 'ford', 'audi', 'toyota', 'ford', 'bmw']
label_encoder = preprocessing.LabelEncoder()
label_encoder.fit(input_classes)
for i, item in enumerate(label_encoder.classes_):
print(item, "-->", i)
輸出結果為:(回顧基礎部分講解
for
循環時講到的
for-enumerate
的配合使用,可以直接輸出對應的标簽資訊和标簽值)
經過
fit
訓練之後的标簽資訊,就可以對部分資料甚至全部的資料的标簽資訊甚至逆标簽資訊查詢,比如指定原清單中的部分資料,就可以直接獲得對應資料的編碼
同時也可以逆标簽資訊查詢,指定經過編碼後的數值,輸出對應的标簽資訊
7 缺失值處理
7.1 處理方式
最常見的資料情況就是缺失部分資料,那麼怎麼處理缺失值?有沒有固定的公式呢?處理方式如下:
- 删除:缺失樣本量非常大,删除整個字段;如果缺失量較少,且 難以填充 則删除缺失樣本
- 填充:缺失量小于10%,根據缺失變量的資料分布采取 均值(正态分布) 或 中位數(偏态分布) 進行填充
- 模拟或預測缺失樣本:根據樣本的資料分布,生成随機值填充(插值);使用與缺失相比相關性非常高的特征,建立模型,預測缺失值
在第二章已經詳細介紹了使用pandas對缺失值進行處理,接下來介紹sklearn中如何對大資料樣本進行缺失值處理
7.2 執行個體操作
采用sklearn子產品中的
SimpleImputer
函數進行處理,使用的步驟共四步
- (1)從子產品中導入函數
- (2)設定填充的對象和填充的方式
- (3)選取資料
- (4)處理資料
讀取測試資料,其中
Age
和
Salary
字段有缺失值
提取對應字段,可以使用列的方式進行提取,也可以使用坐标的方式進行提取
#采用坐标的方式進行提取
X = dataset.iloc[:, :-1].values
Y = dataset.iloc[:, -1].values
輸出結果如下:(一般會把所有的特征字段提取後指派為
X
,标簽字段提取後指派為
Y
)
嚴格按照sklearn處理缺失值的步驟進行,代碼如下
#導入處理子產品
from sklearn.impute import SimpleImputer
#設定要處理的對象和處理規則
imputer=SimpleImputer(missing_values=np.nan,strategy='mean')
#選取資料fit訓練
imputer= imputer.fit(X[:,1:3])
#處理資料
X[:,1:3]=imputer.transform(X[:,1:3])
輸出結果如下:
最後補充關于可以設定的規則,通過調用說明文檔,可以發現能夠使用的類型如下:(平均值,中位數,衆數和常量)