[機器學習二部曲] Python實作—資料預處理 : 如何將特徵規模拉到同一基準? 特徵縮放 Feature Scaling

今天,我們要來談談資料預處理的一個重要環節,特徵縮放(Feature Scaling)。當我們蒐集好所有特徵後,往往急著把資料餵入模型建模,卻忽略了一些小細節。以股價預測為例,我們的特徵資料可能同時包含市值與PE ratio, 想像一下,各個股票市值的差異動輒上億,一定遠遠大於PE ratio的差異。而除了決策樹及隨機森林等少數模型外,多數模型背後的計算方式都會因為scale的差異而給予市值因子更大的影響力。除非我們本身就是希望給予市值因子更高的權重,不然在建模前都應該要將各個特徵因子進行特徵縮放以規格化,避免因為scale而產生的偏誤。另一方面,特徵縮放還有一個好處就是能夠讓我們在做梯度下降時更快收斂。

特徵縮放的方法

在我們常用的sklearn模組裡面提供了多種特徵縮放的工具,以下我們簡單分享2種常用的方法。

1. Rescaling

$$X^*=\frac{X-X_{min}}{X_{max}-X_{min}}$$

這個方法主要是重新刻畫刻度,分母為全距,透過刻度轉換讓所有特徵資料都縮放到[0,1]之間。

FS_1=sp.MinMaxScaler().fit(df)
result_minmax=FS_1.transform(df)

Recaling適合用在數值資料較集中的情況,因為這樣的計算方式會用到最大值與最小值。若最大值或最小值為outlier的情況下容易使的結果變得較不穩定,實務上有時會利用去除outlier的最大值及最小值作為替代。

3. Standardization

$$X^*=\frac{X-\mu}{\sigma}$$

其中$\mu 為平均數, \sigma 為標準差$

這就是我們常說的標準化啦!將特徵資料的平均值拉到0,變異數為1。

FS_2=sp.StandardScaler().fit(df)
result_std=FS_2.transform(df)

特徵縮放的方法其實有非常多種,比方說把特徵集中在[-1,1]的normalization,或是一些非線性的作法如mapping to a uniform distribution, gaussian distribution等等。

總結來說,特徵縮放讓每個特徵具有大致相同的重要性,因此很有可能提高模型的準確程度,並且加快梯度下降求解的速度。

今天,我們學會了如何做feature scaling。下次在建模前,如果沒有希望給予scale大的特徵比較高的權重,別忘了先進行特徵縮放唷!

程式檔案,歡迎下載github

Share

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *