主要内容:
一、Z标準化:實現中心化和正态分布;
二、Min-Max:歸一化;
三、MaxAbs:最大絕對值标準化;
四、RobustScaler。
- Python實例
z-score;
Min-Max;
MaxAbs;
RobustScaler。
數據标準化是數據預處理中非常重要的一步。在實際應用過程中,我們經常會遇到含有多種特征的數據集,這些特征常常有着不同的分布形态和區間,有着不同的量級(量綱),這很容易對我們的模型訓練産生影響。而數據标準化,就是為了消除規模、特征和分布差異對模型的影響而存在。
另外,将各特征标準化之後,我們可以對其進行加權組合,從而生成新的指标,而原始數據往往不支持我們直接進行加權計算。
那麼今天我們就來看一下,有哪些數據标準化的方法,以及它們分别如何在Python中實現。
一、Z标準化:實現中心化和正态分布
Z-Score标準化是基于原始數據的均值和标準差進行的标準化,其轉化公式為:
其中,z是轉化後的數據,x為轉化前的數據,μ是整組數據的均值,σ是整組數據的标準差。
這種方法适合大多數類型的數據,其應用非常廣泛。從公式裡我們就可以看出來,轉化之後其均值将變為0,而方差和标準差将變為1(考慮方差的公式),這部分如果不明白那就不妨在本子上推理一下哦。
二、Min-Max:歸一化
Min-Max标準化方法會對原始數據進行線性變換,它的轉換公式為:
很明顯,當x為最大值時,會被轉換為1;當x為最小值時,對應的新值為0;整組數據會分布在從0到1的區間内,而數據的分布形态并不會發生變化。
三、MaxAbs:最大絕對值标準化
在數據科學中,我們經常需要應對稀疏數據,MaxAbs方法對于稀疏數據有着良好的支持。MaxAbs标準化方法與Min-Max方法有些相似,其公式為:
即用每一個值除以整組數據中的絕對值的最大值,這樣保留了原有數據的正負屬性,且使數據落在了[-1,1]閉區間内。需要注意的是,先進行絕對值操作,然後選最大值,而不是先選擇最大值,再求絕對值。我已經看到過很多文章把這裡弄錯了。舉個例子,有一組數據[-0.01, -1, -2],如果我們先求最大值再求絕對值,别說歸一化了,數據簡直要鑽到地縫裡去了。
四、RobustScaler
有些時候,數據中會存在離群點(異常值)。這時如果我們使用z-score标準化就會導緻數據很容易失去離群特征。這時我們就可以使用RobustScaler方法,它對于數據中心化和數據的縮放健壯性有着更強的參數調節能力。
Python實例
多說無益,放碼過來,我們先導入必要的庫、iris數據集,并進行一些必要的設置。
import numpy as np import pandas as pd from sklearn import preprocessing import matplotlib.pyplot as plt import matplotlib as mpl import seaborn as sns from seaborn import load_dataset sns.set() mpl.rcParams['font.family'] = 'sans-serif' mpl.rcParams['font.sans-serif'] = 'SimHei' iris = load_dataset('iris').drop('species', axis=1) iris.head()
我們先觀察下前兩列數據的原始分布情況:
sns.jointplot(data=iris, color='m', x='sepal_length', y='sepal_width');
Z-score
我們先來演示z标準化。
z_scaler = preprocessing.StandardScaler() iris_z = z_scaler.fit_transform(iris) iris_z = pd.DataFrame(iris_z) sns.jointplot(data=iris_z, color='m', x=0, y=1);
可以看到,數據分布形态變化不大,但是數據收斂到了0軸周圍。
我們看一下轉換後數據的均值和标準差:
可以看到,雖然有一點點小誤差(量級非常小),但是數據基本上是符合均值為0、标準差為1的。
Min-Max标準化
然後是Min-Max歸一化方法:
mm_scaler = preprocessing.MinMaxScaler() iris_mm = mm_scaler.fit_transform(iris) iris_mm = pd.DataFrame(iris_mm) sns.jointplot(data=iris_mm, color='m', x=0, y=1);
這次我們在保持原有數據分布特性的同時,将數據收斂到了0到1之間。
MaxAbs标準化
ma_scaler = preprocessing.MaxAbsScaler() iris_ma = ma_scaler.fit_transform(iris) iris_ma = pd.DataFrame(iris_ma) sns.jointplot(data=iris_ma, color='m', x=0, y=1);
由于iris數據集裡沒有負值,所以這裡不能體現出[-1,1]的數據範圍。我們為數據增加一些負值來看看:
iris_ma = pd.concat([iris_ma, iris_ma.applymap(lambda x: -x)]) sns.jointplot(data=iris_ma, color='m', x=0, y=1);
果然是[-1,1]呢,不過我們這裡的操作隻是為了演示,沒有額外的意義。
RobustScaler
r_scaler = preprocessing.RobustScaler() iris_r = ma_scaler.fit_transform(iris) iris_r = pd.DataFrame(iris_r) sns.jointplot(data=iris_r, color='m', x=0, y=1);
嗯……看起來跟MaxAbs沒什麼區别,這是因為這裡不存在什麼異常值。這個就留給你們自己來練習一下了!
以上是使用sklearn提供的标準化工具進行數據标準化的操作,事實上,我們也完全可以自己創造一些标準化工具,實際操作起來并不難哦,大家可以嘗試一下。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!