數據歸一化/標準化
阿新 • • 發佈:2018-09-11
創建 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
# 數據標準化 # (1)0-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.26835372.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 # 查看綜合指標狀況
輸出:
數據歸一化/標準化