1. 程式人生 > >數據歸一化/標準化

數據歸一化/標準化

創建 mat bubuko random ali n) 課程 綜合 標準

‘‘‘
【課程2.3】  數據歸一化/標準化

 數據的標準化(normalization)是將數據按比例縮放,使之落入一個小的特定區間。
 在某些比較和評價的指標處理中經常會用到,去除數據的單位限制,將其轉化為無量綱的純數值,便於不同單位或量級的指標能夠進行比較和加權
 
最典型的就是數據的歸一化處理,即將數據統一映射到[0,1]區間上

0-1標準化 / Z-score標準化

‘‘‘
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
% matplotlib inline
# 數據標準化
# (10-1標準化
# 將數據的最大最小值記錄下來,並通過Max-Min作為基數(即Min=0,Max=1)進行數據的歸一化處理
# x = (x - Min) / (Max - Min)

df = pd.DataFrame({"value1":np.random.rand(10)*20,
                  value2:np.random.rand(10)*100})
print(df.head())
print(------)
# 創建數據

def data_norm(df,*cols):
    df_n = df.copy()
    
for col in cols: ma = df_n[col].max() mi = df_n[col].min() df_n[col + _n] = (df_n[col] - mi) / (ma - mi) return(df_n) # 創建函數,標準化數據 df_n = data_norm(df,value1,value2) print(df_n.head()) # 標準化數據

  輸出:

      value1     value2
0   1.058973  80.176250
1   2.268353
72.748326 2 8.845245 38.677480 3 6.787782 61.089715 4 19.699524 91.723522 ------ value1 value2 value1_n value2_n 0 1.058973 80.176250 0.000000 0.741446 1 2.268353 72.748326 0.064879 0.618601 2 8.845245 38.677480 0.417706 0.055126 3 6.787782 61.089715 0.307330 0.425787 4 19.699524 91.723522 1.000000 0.932418

# 數據標準化
# (2)Z-score標準化
# Z分數(z-score),是一個分數與平均數的差再除以標準差的過程 → z=(x-μ)/σ,其中x為某一具體分數,μ為平均數,σ為標準差
# Z值的量代表著原始分數和母體平均值之間的距離,是以標準差為單位計算。在原始分數低於平均值時Z則為負數,反之則為正數
# 數學意義:一個給定分數距離平均數多少個標準差?

df = pd.DataFrame({"value1":np.random.rand(10) * 100,
                  value2:np.random.rand(10) * 100})
print(df.head())
print(------)
# 創建數據

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)
print(標準化後value1的均值為:%.2f, 標準差為:%.2f % (u_z, std_z))
# 標準化數據
# 經過處理的數據符合標準正態分布,即均值為0,標準差為1

# 什麽情況用Z-score標準化:
# 在分類、聚類算法中,需要使用距離來度量相似性的時候,Z-score表現更好

  輸出:

    value1     value2
0  87.320919  48.352809
1  26.031312   7.175187
2  30.446934  51.214317
3  95.423791  86.417366
4  83.931369  82.795884
------
      value1     value2  value1_Zn  value2_Zn
0  87.320919  48.352809   0.910447  -0.206182
1  26.031312   7.175187  -0.853275  -1.425002
2  30.446934  51.214317  -0.726208  -0.121484
3  95.423791  86.417366   1.143622   0.920495
4  83.931369  82.795884   0.812906   0.813302
5  42.323130  77.843953  -0.384448   0.666730
6  92.152700   2.869294   1.049490  -1.552452
7  15.126391  78.057041  -1.167085   0.673037
8   7.050190  24.868290  -1.399492  -0.901302
9  77.020849  93.592031   0.614043   1.132858
標準化後value1的均值為:0.00, 標準差為:1.00

# 案例應用
# 八類產品的兩個指標value1,value2,其中value1權重為0.6,value2權重為0.4
# 通過0-1標準化,判斷哪個產品綜合指標狀況最好

df = pd.DataFrame({"value1":np.random.rand(10) * 30,
                  value2:np.random.rand(10) * 100},
                 index = list(ABCDEFGHIJ))
#print(df.head())
#print(------)
# 創建數據"

df_n1 = data_norm(df,value1,value2)
# 進行標準化處理

df_n1[f] = df_n1[value1_n] * 0.6 + df_n1[value2_n] * 0.4
df_n1.sort_values(by = f,inplace=True,ascending=False)
df_n1[f].plot(kind = line, style = --.k, alpha = 0.8, grid = True)
df_n1
# 查看綜合指標狀況

  輸出:

技術分享圖片

數據歸一化/標準化