文章目錄
機器學習之數據預處理–標準化/歸一化
機器學習籠統的過程可以理解爲:利用樣本集來訓練模型,用生成好的模型來預測新樣本。
完整詳細的過程爲:
- 數據收集
- 數據預處理
- 模型建立及評估
- 模型預測新樣本
數據預處理階段又包括:特徵提取,特徵降維、特徵空值處理、特徵轉換、數值特徵標準化;目標值空值處理
(其中常用的是:降維、空值、特徵轉換、標準化)
本篇博客將着重講解數值特徵標準化。
一、歸一化,標準化,中心化的概念
首先我們先了解一下歸一化、標準化、中心化的概念。
數據歸一化是數據標準化的一種典型做法,即將數據統一映射到[0,1]區間上.數據的標準化是指將數據按照比例縮放,使之落入一個特定的區間。
- 歸一化:
歸一化是將數據映射到 [0,1] 或者 [-1, 1] 區間。一來可以方便計算,二來可以消除不同特徵量綱的影響,無量綱化可以直接純數值計算 - 標準化:
標準化是將數據映射爲均值是0,標準差是1的正態分佈數據。該方法常用於SVM,LR,神經網絡等模型中。 - 中心化:
中心化相比於標準化更簡單一些,只將數據映射到均值爲0的新數據中,無需滿足標準差爲1的條件。
中心化相對較爲簡單,轉化公式爲 x = x - mean,不做詳述,下面主要介紹歸一化和標準化。
歸一化和標準化的區別:
不同點:
- 首先從兩者的定義上可以看出不一樣;
- 其次歸一化後的值只受原樣本數據裏的極值影響,而標準化後映射的值受原數據裏每一個樣本的影響。
- 標準化是對特徵矩陣裏的列數據做處理,通過 z-score 變換轉爲標準正態分佈數據,和整體樣本分佈相關。
相同點:
- 都是對某個特徵(column)進行縮放(scaling)而不是對某個樣本的特徵向量(row)進行縮放
- 都是消除了量綱的影響
- 都是一種線性變換,都是對向量 X 按照比例壓縮再進行平移
二、標準化/歸一化的好處
- 避免過擬合
- 提升模型精度
- 提升收斂速度
三、標準化/歸一化的方法
有兩種常用的數據標準化的方法:min-max標準化,Z-score標準化方法
1、min-max標準化:
-
定義:
也稱爲離差標準化,是對原始數據的線性變換,使得結果映射到0-1之間。 -
公式:
(X - min)/(max - min)
其中:max爲樣本數據的最大值,min爲樣本數據的最小值。 -
缺陷:
當有新數據加入時,可導致max和min的變化,需要重新定義。 -
sklearn代碼實現:
- 通過創建類MinMaxScaler()
from sklearn import preprocessing
# 定義MinMaxScaler標準化類
min_max_scaler = preprocessing.MinMaxScaler()
# 用訓練集數據訓練scaler,並標準化訓練集數據
X_train_minmax = min_max_scaler.fit_transform(data)
- 下面舉個例子方便大家理解:
原始的數據如下,樣本數據中含有兩個特徵:
特徵1 | 特徵2 |
---|---|
90 | 50 |
70 | 40 |
80 | 60 |
標準化的過程如下:
特徵1 | 特徵2 |
---|---|
(90 - 70) / (90 - 70) | (50 - 40 ) / (60 - 40) |
(70 - 70) / (90 - 70) | (40 - 40 ) / (60 - 40) |
(80 - 70) / (90 - 70) | (60 - 40 ) / (60 - 40) |
得到的結果如下:
特徵1 | 特徵2 |
---|---|
1 | 0.5 |
0 | 0 |
0.5 | 1 |
此demo的對應完整代碼:
import numpy as np
from sklearn import preprocessing
# 構建訓練數據
X = np.array([[90, 50], [70, 40], [80, 60]])
# 定義MinMaxScaler標準化類
min_max_scaler = preprocessing.MinMaxScaler()
# 用訓練集數據訓練scaler,並標準化訓練集數據
X_train_minmax = min_max_scaler.fit_transform(X)
print(X_train_minmax)
運行結果:
X_train_minmax:
[[1. 0.5]
[0. 0. ]
[0.5 1. ]]
2、0均值標準化(Z-score standardization)
- 定義:這種方法用原始數據的均值(mean)和標準差(standard deviation)進行數據的標準化。經過處理的數據符合標準正態分佈,即均值爲0,標準差爲1。如果數據的分佈本身就服從,就可以用這個方法。
- 本質:把有量綱表達式變成無量綱表達式。
- 轉換函數:x =(x - μ) / σ
其中,μ爲所有樣本數據的均值。σ 爲所有樣本數據的標準差。 - sklearn代碼實現:
- 通過創建類StandardScaler
# 數據標準化
# 用訓練集數據訓練scaler
scaler = preprocessing.StandardScaler().fit(data)
# 用scaler轉換訓練集
X_scaled = scaler.transform(data)
- 舉個例子:
原始的數據如下,樣本數據中含有兩個特徵:
特徵1 | 特徵2 |
---|---|
90 | 50 |
70 | 40 |
80 | 60 |
標準化的過程如下:
特徵1:
均值 = 80,方差 = 200/3,標準差 = 8.165
特徵2:
均值 = 50,方差 = 200/3,標準差 = 8.165
- 去均值
特徵1 | 特徵2 |
---|---|
(90 - 80) | (50 - 50 ) |
(70 - 80) | (40 - 50 ) |
(80 - 80) | (60 - 50 ) |
- 標準化:
特徵1 | 特徵2 |
---|---|
10 / 8.165 | 0 / 8.165 |
-10 /8.168 | -10 / 8.165 |
0 / 8.165 | 10 / 8.165 |
得到的結果如下:
特徵1 | 特徵2 |
---|---|
1.2247 | 0 |
-1.2247 | -1.2247 |
0 | 1.2247 |
此demo的對應完整代碼:
import numpy as np
from sklearn import preprocessing
# 構建訓練數據
X = np.array([[90, 50], [70, 40], [80, 60]])
scaler = preprocessing.StandardScaler().fit(X)
# 用scaler轉換訓練集
X_scaled = scaler.transform(X)
print(X_scaled)
運行結果:
X_scaled:
[[ 1.22474487 0. ]
[-1.22474487 -1.22474487]
[ 0. 1.22474487]]
四、保存標準化模型:
以上兩種標準化方法都可以把根據訓練集標準化好的標準化模型保存下來,在進行新樣本預測的時候,用保存好的標準化模型去標準化新樣本,標準化之後再進行預測。
爲什麼要進行這一步驟?
因爲使用機器學習訓練得到的模型是在標準化之後的數據上面,即這些數據相比與原始的數據經過了一系列的變換。所以當使用機器學習的模型去預測新樣本,也需要事先用標準化的模型去標準化新樣本。
整體代碼如下:
- 根據訓練集的數據得到標準化的模型
from sklearn import preprocessing
import joblib as jl
# 數據標準化
# 用訓練集數據訓練scaler
scaler = preprocessing.StandardScaler().fit(data)
# 用訓練好的scaler去標準化訓練集的數據
X_scaled = scaler.transform(data)
# 保存數據標準化的模型
jl.dump(scaler, '../../docs/scaler/scaler.pkl')
- 用第一步生成好的標準化模型去標準化新樣本數據:
import joblib as jl
# 加載數據標準化的模型
scaler = jl.load('../../docs/scaler/scaler.pkl')
# 標準化新樣本
sample_scaler = scaler.transform(sample)
# 用機器學習的分類器去預測新樣本
label = clf.predict(sample_scaler)
標準化的Scaler其實也可以理解爲模型:
- 機器學習根據算法學得的模型用來擬合/預測樣本類別
- 標準化的Scaler模型是用來處理變換數據
詳細保存與加載模型用法:
參考博客:https://blog.csdn.net/pentiumCM/article/details/104370401