資料預處理——歸一化標準化
阿新 • • 發佈:2018-12-19
資料的標準化(normalization)是將資料按比例縮放,使之落入一個小的特定區間。
去除資料的單位限制,將其轉化為無量綱的純數值,便於不同單位或量級的指標能夠進行比較和加權
最典型的就是資料的歸一化處理,即將資料統一對映到[0,1]區間上
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn import preprocessing
% matplotlib inline
0-1標準化
又叫Max-Min標準化,公式:
# 建立資料
df = pd.DataFrame({'value1' :np.random.rand(100)*10,
'value2':np.random.rand(100)*100})
print(df.head())
print('---------------')
def maxmin (df,*cols):
df_m = df.copy()
for col in cols:
ma = df[col].max()
mi = df[col].min()
df_m[col + '_m'] = (df[col] - mi) / (ma - mi)
return df_m
df1 = maxmin(df,'value1','value2')
print(df1.head())
value1 value2
0 7.363287 15.749935
1 5.713568 33.233757
2 6.108123 21.522650
3 0.804442 85.003204
4 6.387467 21.264910
---------------
value1 value2 value1_m value2_m
0 7.363287 15.749935 0.740566 0.151900
1 5.713568 33.233757 0.574296 0.329396
2 6.108123 21.522650 0.614062 0.210505
3 0.804442 85.003204 0.079521 0.854962
4 6.387467 21.264910 0.642216 0.207888
# 使用 sklearn中的 scale 函式
minmax_scaler = preprocessing.MinMaxScaler() # 建立 MinMaxScaler物件
df_m1 = minmax_scaler.fit_transform(df) # 標準化處理
df_m1 = pd.DataFrame(df_m1,columns=['value1_m','value2_m'])
df_m1.head()
value1_m | value2_m | |
---|---|---|
0 | 0.740566 | 0.151900 |
1 | 0.574296 | 0.329396 |
2 | 0.614062 | 0.210505 |
3 | 0.079521 | 0.854962 |
4 | 0.642216 | 0.207888 |
Z-Score
也叫z分數,是一種具有相等單位的量數。它是將原始分數與團體的平均數之差除以標準差所得的商數,是以標準差為單位度量原始分數離開其平均數的分數之上多少個標準差,或是在平均數之下多少個標準差。
- 它是一個抽象值,不受原始測量單位的影響,並可接受進一步的統計處理
- 處理後的數值服從均值為0,方差為1的標準正態分佈。
- 一種中心化的方法,會改變原資料的資料分佈,不適用於對稀疏資料做處理
def data_Znorm(df, *cols):
df_n = df.copy()
for col in cols:
u = df_n[col].mean()
std = df_n[col].std()
df_n[col + '_Zn'] = (df_n[col] - u) / std
return(df_n)
# 建立函式,標準化資料
df_z = data_Znorm(df,'value1','value2')
u_z = df_z['value1_Zn'].mean()
std_z = df_z['value1_Zn'].std()
print(df_z.head())
print('標準化後value1的均值為:%.2f, 標準差為:%.2f' % (u_z, std_z))
# 標準化資料
# 經過處理的資料符合標準正態分佈,即均值為0,標準差為1
# 什麼情況用Z-score標準化:
# 在分類、聚類演算法中,需要使用距離來度量相似性的時候,Z-score表現更好
value1 value2 value1_Zn value2_Zn
0 7.363287 15.749935 0.744641 -1.164887
1 5.713568 33.233757 0.196308 -0.550429
2 6.108123 21.522650 0.327450 -0.962008
3 0.804442 85.003204 -1.435387 1.268973
4 6.387467 21.264910 0.420298 -0.971066
標準化後value1的均值為:-0.00, 標準差為:1.00
# Z-Score標準化
zscore_scale = preprocessing.StandardScaler()
df_z1 = zscore_scale.fit_transform(df)
df_z1 = pd.DataFrame(df_z1,columns=['value1_z','value2_z'])
df_z1.head()
value1_z | value2_z | |
---|---|---|
0 | 0.748393 | -1.170755 |
1 | 0.197297 | -0.553202 |
2 | 0.329100 | -0.966855 |
3 | -1.442619 | 1.275366 |
4 | 0.422416 | -0.975959 |
MaxAbs
最大值絕對值標準化,和MaxMin方法類似,將資料落入一定的區間[-1,1],但是MaxAbs具有不破壞資料結構的特點,可以用於稀疏資料,或者
是係數的CSR(行壓縮)和CSC(列壓縮)矩陣(為矩陣的兩種儲存格式)
# MaxAbs標準化
maxbas_scaler = preprocessing.MaxAbsScaler()
df_ma = maxbas_scaler.fit_transform(df)
df_ma = pd.DataFrame(df_ma,columns=['value1_ma','value2_ma'])
df_ma.head()
value1_ma | value2_ma | |
---|---|---|
0 | 0.740969 | 0.158626 |
1 | 0.574957 | 0.334715 |
2 | 0.614661 | 0.216766 |
3 | 0.080951 | 0.856112 |
4 | 0.642772 | 0.214170 |
RobustScaler
在某些情況下,假如資料中有離群點,我們可以使用Z-Score進行標準化,但是標準化後的資料並不理想,因為異常點的特徵往往在標準化後容易失去離群特徵,此時就可以用RobustScaler 針對離群點做標準化處理。
此方法對資料中心話和資料的縮放健壯性有更強的引數控制能力
————《Python資料分析與資料化運營》
# RobustScaler標準化
robustscaler = preprocessing.RobustScaler()
df_r = robustscaler.fit_transform(df)
df_r = pd.DataFrame(df_r,columns=['value1_r','value2_r'])
df_r.head()
value1_r | value2_r | |
---|---|---|
0 | 0.360012 | -0.644051 |
1 | 0.055296 | -0.303967 |
2 | 0.128174 | -0.531764 |
3 | -0.851457 | 0.703016 |
4 | 0.179770 | -0.536777 |
繪製標準化散點圖
data_list = [df, df_m1, df_ma, df_z1, df_r]
title_list = ['soure_data', 'maxmin_scaler',
'maxabs_scaler', 'zscore_scaler',
'robustscaler']
fig = plt.figure(figsize=(12,6))
for i,j in enumerate(data_list):
# 對於一個可迭代的(iterable)/可遍歷的物件(如列表、字串),enumerate將其組成一個索引序列,
# 利用它可以同時獲得索引和值,enumerate多用於在for迴圈中得到計數'''
plt.subplot(2,3,i+1)
plt.scatter(j.iloc[:,:-1],j.iloc[:,-1])
plt.title(title_list[i])