這次我們來說說關于數據預處理中的數據標準化及歸一化的問題。主要以理論+實例的方式為大家展示。
本次實驗也將會展示部分數據以及代碼,有興趣的小伙伴可以自己動手試試~
在本次實例過程中,我們使用的數據是:2010-2018年間廣州市經濟與環境的時間序列資料,數據來源為《廣州市統計年鑒》及《國民經濟和社會發展統計公報》,感興趣的同學也可利用其它數據進行實例操作。(本次實驗的Excel數據附在文后)
一、歸一化(Normalization)
描述:
將數據映射到指定的范圍,如:把數據映射到0~1或-1~1的范圍之內處理。
作用:1、數據映射到指定的范圍內進行處理,更加便捷快速。
2、把有量綱表達式變成無量綱表達式,便于不同單位或量級的指標能夠進行比較和加權。經過歸一化后,將有量綱的數據集變成純量,還可以達到簡化計算的作用。
常見做法:Min-Max歸一化
python實現:
(1)導入數據并刪除我們不要的列:
import numpy as np
import pandas as pd
df=pd.read_excel('C://Users/Administrator/Desktop/data_py.xlsx',sheet_name='廣州',encoding='utf-8')
df.drop(columns="時間",axis=1,inplace=True)
df.set_index([[2010,2011,2012,2013,2014,2015,2016,2017,2018]],inplace=True)
df.drop(columns=['第二產業產值占比','第三產業產值占比','一般工業固體廢物綜合利用率'],axis=1,inplace=True)
(2)查看數據:
可以看到,數據前三列特征的數量級明顯大于后面的特征很多,如果這個時候我們想要利用這個數據表來衡量廣州市的發展情況時,地區生產總值、公共財政收入、人均生產總值這三項特征就會起到主導作用從而遮蓋住其他的特征,這樣的模型效果是很差的,因此我們可以通過歸一化來解決這個問題。
(3)Min-Max歸一化:
for i in list(df.columns):
# 獲取各個指標的最大值和最小值
Max = np.max(df[i])
Min = np.min(df[i])
df[i] = (df[i] - Min)/(Max - Min)
(4)查看歸一化結果:
二、標準化(Normalization)
注:在英文翻譯中,歸一化和標準化的翻譯是一致的,而在實際使用中,我們需要根據實際的公式(或用途)去理解~
數據標準化方法有多種,如:直線型方法(如極值法、標準差法)、折線型方法(如三折線法)、曲線型方法(如半正態性分布)。不同的標準化方法,對系統的評價結果會產生不同的影響。其中,最常用的是Z-Score 標準化。
Z-Score 標準化
其中,
為數據均值(mean),
為標準差(std)。
描述:
將原數據轉換為符合均值為0,標準差為1的標準正態分布的新數據。
作用:1、提升模型的收斂速度(加快梯度下降的求解速度)
2、提升模型的精度(消除量級和量綱的影響)
3、簡化計算(與歸一化的簡化原理相同)
python實現:
(1)(這里我們重置一下數據表df,避免實驗的偶然性)
from sklearn import preprocessing
df=pd.read_excel('C://Users/Administrator/Desktop/data_py.xlsx',sheet_name='廣州',encoding='utf-8')
df.drop(columns="時間",axis=1,inplace=True)
df.set_index([[2010,2011,2012,2013,2014,2015,2016,2017,2018]],inplace=True)
df.drop(columns=['第二產業產值占比','第三產業產值占比','一般工業固體廢物綜合利用率'],axis=1,inplace=True)
(2)Z-Score 標準化,最簡便、也是L推薦的方法是用:sklearn庫里的StandardScaler()。
實例化:
zscore = preprocessing.StandardScaler()
# zscore標準化
zscore = zscore.fit_transform(df)
查看標準化后的數據:
df_zscore = pd.DataFrame(zscore,index=df.index,columns=df.columns)
df_zscore
使用歸一化/標準化會改變數據原來的規律嗎?
歸一化/標準化實質是一種線性變換,線性變換有很多良好的性質,這些性質決定了對數據改變后不會造成“失效”,反而能提高數據的表現,這些性質是歸一化/標準化的前提。比如有一個很重要的性質:線性變換不會改變原始數據的數值排序。
如果是單純想實現消除量級和量綱的影響,用Min-Max還是用Z-Score?
1、數據的分布本身就服從正態分布,使用Z-Score。
2、有離群值的情況:使用Z-Score。
這里不是說有離群值時使用Z-Score不受影響,而是,Min-Max對于離群值十分敏感,因為離群值的出現,會影響數據中max或min值,從而使Min-Max的效果很差。相比之下,雖然使用Z-Score計算方差和均值的時候仍然會受到離群值的影響,但是相比于Min-Max法,影響會小一點。
當數據出現離群點時,用什么方法?
當數據中有離群點時,我們可以使用Z-Score進行標準化,但是標準化后的數據并不理想,因為異常點的特征往往在標準化后容易失去離群特征,此時就可以用RobustScaler 針對離群點做標準化處理。
三、Robust標準化(RobustScaler)
很多時候我們在機器學習中,或是其他模型都會經常見到一個詞:魯棒性。也就是Robust的音譯。
計算機科學中,健壯性(英語:Robustness)是指一個計算機系統在執行過程中處理錯誤,以及算法在遭遇輸入、運算等異常時繼續正常運行的能力。 諸如模糊測試之類的形式化方法中,必須通過制造錯誤的或不可預期的輸入來驗證程序的健壯性。很多商業產品都可用來測試軟件系統的健壯性。健壯性也是失效評定分析中的一個方面。
關于Robust,是這么描述的:
This Scaler removes the median(中位數) and scales the data according to the quantile range(四分位距離,也就是說排除了outliers).
Huber從穩健統計的角度系統地給出了魯棒性3個層面的概念:
一是模型具有較高的精度或有效性,這也是對于機器學習中所有學習模型的基本要求;
二是對于模型假設出現的較小偏差,只能對算法性能產生較小的影響;
主要是:噪聲(noise)
三是對于模型假設出現的較大偏差,不可對算法性能產生“災難性”的影響。
主要是:離群點(outlier)
在機器學習,訓練模型時,工程師可能會向算法內添加噪聲(如對抗訓練),以便測試算法的「魯棒性」。可以將此處的魯棒性理解述算法對數據變化的容忍度有多高。魯棒性并不同于穩定性,穩定性通常意味著「特性隨時間不變化的能力」,魯棒性則常被用來描述可以面對復雜適應系統的能力,需要更全面的對系統進行考慮。
使用方法
(1)和Z-Score一樣,進行實例化:
robust = preprocessing.RobustScaler()
# robust標準化處理
df_robust = robust.fit_transform(df)
(2)查看標準化后的數據:
df_robust = pd.DataFrame(df_robust,index=df.index,columns=df.columns)
df_robust
(在這里我們僅僅是做一個示范,并不是說當前這個數據表必須用Robust進行標準化)
實驗數據表:
鏈接:https://pan.baidu.com/s/1MOmda_0kDbwRNp9jJ0XOgw?pan.baidu.com
提取碼:5ca2
由于時間關系,剩下的內容我會在下次更新中一并補充~
以上便是的內容,感謝大家的細心閱讀,同時歡迎感興趣的小伙伴一起討論、學習,想要了解更多內容的可以看我的其他文章,同時可以持續關注我的動態~