日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

【python數據預處理筆記】——特征縮放(標準化 & 歸一化)

系統 2402 0

目 錄

  • 一、Q&A
    • Q1 什么是標準化、歸一化、規范化、正則化?
    • Q2 為什么需要做標準化或者歸一化?
    • Q3 什么樣的模型需要輸入標準化或者歸一化的特征,什么樣的模型不需要?
    • Q4 哪些數據不能做特征縮放?
  • 二、特征標準化/方差放縮
  • 三、特征歸一化
    • 1. min-max縮放
    • 2. L2歸一化
    • 3. 十進制歸一化
  • 四、實例——不同縮放方法的對比

一、Q&A

Q1 什么是標準化、歸一化、規范化、正則化?


A 在特征縮放中,標準化和歸一化是特征縮放的兩種形式,一個是減去均值后再除以方差,一個是把數據壓縮到 [ 0 , 1 ] [0, 1] [ 0 , 1 ] 或者 [ ? 1 , 1 ] [-1, 1] [ ? 1 , 1 ] 區間上。規范化是線性代數中的名詞,在數據科學中也有人把特征縮放稱為特征規范化或者特征歸一化,不過為了避免混淆不建議這樣做。而正則化是一種防止過擬合的手段,用來對模型的復雜度或者特征維度進行懲罰,嚴格來說不屬于數據預處理的內容。

Q2 為什么需要做標準化或者歸一化?


A 當模型是輸入特征的平滑函數時,那么它對輸入的尺度是非常敏感的,取值范圍大的特征被無意中賦予了更大的權重,它會壓縮取值范圍小的特征對結果的影響。例如 y = x 1 + x 2 + 7 y = x_1 + x_2 +7 y = x 1 ? + x 2 ? + 7 是一個簡單的線性函數,如果 x 1 x_1 x 1 ? 的尺度為 [ 0 , 1 ] [0,1] [ 0 , 1 ] x 2 x_2 x 2 ? 的尺度為 [ 0 , 10000 ] [0, 10000] [ 0 , 1 0 0 0 0 ] ,那么 x 2 x_2 x 2 ? 的變動將會產生更大的影響。這個時候就要對特征進行縮放,也就是標準化或者規范化。目的是使其不同尺度之間的特征具有可比性,同時不改變原始數據的分布。

Q3 什么樣的模型需要輸入標準化或者歸一化的特征,什么樣的模型不需要?


A 正如前一問提到的,需要對特征進行標準化的模型是輸入的平滑函數,比如線性回歸模型、邏輯回歸模型或者包含矩陣的模型。此外,k-均值聚類、k近鄰法、徑向基和函數,以及所有使用歐式距離的方法都屬于這種情況。相對地,基于空間分割樹的模型(決策樹、梯度提升樹、隨機森林)對尺度是不敏感的。除非輸入的尺度是隨時間變化的,也就是說如果特征是某種累計值,那么它最終可能會超出訓練樹的取值范圍。如果出現了這種情況,就必須定期地對輸入尺度進行調整,或者使用區間計數法。

Q4 哪些數據不能做特征縮放?


A 稀疏數據不能進行特征縮放,因為特征縮放相當于對原數據進平移和縮放。而對于稀疏數據來說,數據中含有大量的0,一旦進行平移,那么稀疏特征將會變為密集特征,這會產生很大的影響,比如特征向量中包含沒有在文章中出現的所有單詞,那么當它變為密集向量的時候,特征的意義會發生巨大的改變。

二、特征標準化/方差放縮

??特征標準化可用下面的公式來定義:

x ′ = x ? μ σ x' = \frac{x - \mu}{\sigma} x = σ x ? μ ?

其中 μ \mu μ σ \sigma σ 是數據的均值和標準差。縮放后的特征均值為0,方差為1,尺度為原來的 1 σ \frac{1}{\sigma} σ 1 ? 標準化依據相同的標準調整特征使之能互為參考有可比性

好處

  1. 不改變原始數據的分布,保持各個特征維度對目標函數的影響權重
  2. 對目標函數的影響體現在幾何分布上
  3. 在已有樣本足夠多的情況下比較穩定,適合現代嘈雜大數據場景

三、特征歸一化

1. min-max縮放

??min-max縮放的公式如下:

x ′ = x ? m i n ( x ) m a x ( x ) ? m i n ( x x' = \frac{x - min(x)}{max(x) - min(x} x = m a x ( x ) ? m i n ( x x ? m i n ( x ) ?

min-max縮放可以將數據壓縮(或擴展)到 [ 0 , 1 [0, 1 [ 0 , 1 區間中。 消除量綱對結果的影響,使不同特征之間具有可比性

應用

  1. 無量綱化

??例如房子數量和收入,從業務層知道這兩者的重要性一樣,所以把它們全部歸一化,這是從業務層面上作的處理。

  1. 避免數值問題

??不同的數據在不同列數據的數量級相差過大的話,計算起來大數的變化會掩蓋掉小數的變化。

  1. 一些模型求解的需要

??例如梯度下降法,如果不歸一化,當學習率較大時,求解過程會呈 Z 字形下降。學習率較小,則會產生直角形路線,不管怎么樣,都不會是好路線。具體參考 神經網絡為什么要歸一化

  1. 時間序列

??進行log分析時,會將原本絕對化的時間序列歸一化到某個基準時刻,形成相對時間序列,方便排查。

  1. 收斂速度

??加快求解過程中參數的收斂速度。

特點

  1. 對不同特征維度進行伸縮變換
  2. 改變原始數據的分布(不改變 單特征 分布的形狀),使得各個特征維度對目標函數的影響權重歸于一致(使得扁平分布的數據伸縮變換成類圓形)
  3. 對目標函數的影響體現在數值上
  4. 把有量綱表達式變為無量綱表達式

好處

  1. 提高迭代求解的收斂速度
  2. 提高迭代求解的精度

缺點

  1. 最大值與最小值非常容易受異常點影響
  2. 魯棒性較差,只適合傳統精確小數據場景

2. L2歸一化

l 2 \mathcal{l}^2 l 2 歸一化的公式如下:

x ′ = x ∣ ∣ x ∣ ∣ 2 x' = \frac{x}{||x||_2} x = x 2 ? x ?

其中 ∣ ∣ x ∣ ∣ 2 = ( x 1 2 + x 2 2 + ? + x m 2 ) ||x||_2 = \sqrt{(x_1^2 + x_2^2 + \cdots + x_m^2)} x 2 ? = ( x 1 2 ? + x 2 2 ? + ? + x m 2 ? ) ? l 2 \mathcal{l}^2 l 2 歸一化使得縮放后數據的尺度變為原來的 1 ∣ ∣ x ∣ ∣ 2 \frac{1}{||x||_2} x 2 ? 1 ? ,在 [ ? 1 , 1 ] [-1, 1] [ ? 1 , 1 ] 之間。

3. 十進制歸一化

??十進制歸一化與L2-歸一化類似,都是把數據規范到 [ ? 1 , 1 ] [-1, 1] [ ? 1 , 1 ] 區間內,其公式如下:

x ′ = x 1 0 j x' = \frac{x}{10^j} x = 1 0 j x ?

其中 j j j 是使得 m a x ( x ′ ) < 1 max(x') \lt 1 m a x ( x ) < 1 的最小整數。

四、實例——不同縮放方法的對比

??我們對在線新聞流行度數據集中的文章單詞量特征進行特征縮放,并觀察其結果。

            
              
                import
              
               pandas 
              
                as
              
               pd

              
                import
              
               sklearn
              
                .
              
              preprocessing 
              
                as
              
               preproc

onp_df 
              
                =
              
               pd
              
                .
              
              read_csv
              
                (
              
              
                'data/OnlineNewsPopularity/OnlineNewsPopularity.csv'
              
              
                )
              
              
                # 標準化
              
              
onp_df
              
                [
              
              
                'standardized_n'
              
              
                ]
              
              
                =
              
               preproc
              
                .
              
              StandardScaler
              
                (
              
              
                )
              
              
                .
              
              fit_transform
              
                (
              
              onp_df
              
                [
              
              
                [
              
              
                ' n_tokens_content'
              
              
                ]
              
              
                ]
              
              
                )
              
              
                # min-max縮放
              
              
onp_df
              
                [
              
              
                'minmax_n'
              
              
                ]
              
              
                =
              
               preproc
              
                .
              
              minmax_scale
              
                (
              
              onp_df
              
                [
              
              
                [
              
              
                ' n_tokens_content'
              
              
                ]
              
              
                ]
              
              
                )
              
              
                # L2-歸一化
              
              
onp_df
              
                [
              
              
                'l2_normalized_n'
              
              
                ]
              
              
                =
              
               preproc
              
                .
              
              normalize
              
                (
              
              onp_df
              
                [
              
              
                [
              
              
                ' n_tokens_content'
              
              
                ]
              
              
                ]
              
              
                ,
              
               axis 
              
                =
              
              
                0
              
              
                )
              
            
          
            
              
                import
              
               matplotlib
              
                .
              
              pyplot 
              
                as
              
               plt

fig
              
                ,
              
              
                (
              
              ax1
              
                ,
              
               ax2
              
                ,
              
               ax3
              
                ,
              
               ax4
              
                )
              
              
                =
              
               plt
              
                .
              
              subplots
              
                (
              
              
                4
              
              
                ,
              
              
                1
              
              
                ,
              
               figsize 
              
                =
              
              
                (
              
              
                7
              
              
                ,
              
              
                12
              
              
                )
              
              
                )
              
              
plt
              
                .
              
              subplots_adjust
              
                (
              
              wspace 
              
                =
              
              
                0
              
              
                ,
              
               hspace 
              
                =
              
              
                0.5
              
              
                )
              
              

ax1
              
                .
              
              hist
              
                (
              
              onp_df
              
                [
              
              
                ' n_tokens_content'
              
              
                ]
              
              
                ,
              
               bins 
              
                =
              
              
                100
              
              
                ,
              
               color 
              
                =
              
              
                'g'
              
              
                )
              
              
ax1
              
                .
              
              set_xlabel
              
                (
              
              
                ''
              
              
                )
              
              
ax1
              
                .
              
              set_ylabel
              
                (
              
              
                '分享次數'
              
              
                )
              
              
ax1
              
                .
              
              set_title
              
                (
              
              
                '原始單詞量數據'
              
              
                )
              
              

ax2
              
                .
              
              hist
              
                (
              
              onp_df
              
                [
              
              
                'standardized_n'
              
              
                ]
              
              
                ,
              
               bins 
              
                =
              
              
                100
              
              
                ,
              
               color 
              
                =
              
              
                'g'
              
              
                )
              
              
ax2
              
                .
              
              set_xlabel
              
                (
              
              
                ''
              
              
                )
              
              
ax2
              
                .
              
              set_ylabel
              
                (
              
              
                '分享次數'
              
              
                )
              
              
ax2
              
                .
              
              set_title
              
                (
              
              
                '標準化數據'
              
              
                )
              
              

ax3
              
                .
              
              hist
              
                (
              
              onp_df
              
                [
              
              
                'minmax_n'
              
              
                ]
              
              
                ,
              
               bins 
              
                =
              
              
                100
              
              
                ,
              
               color 
              
                =
              
              
                'g'
              
              
                )
              
              
ax3
              
                .
              
              set_xlabel
              
                (
              
              
                ''
              
              
                )
              
              
ax3
              
                .
              
              set_ylabel
              
                (
              
              
                '分享次數'
              
              
                )
              
              
ax3
              
                .
              
              set_title
              
                (
              
              
                'min-max縮放數據'
              
              
                )
              
              

ax4
              
                .
              
              hist
              
                (
              
              onp_df
              
                [
              
              
                'l2_normalized_n'
              
              
                ]
              
              
                ,
              
               bins 
              
                =
              
              
                100
              
              
                ,
              
               color 
              
                =
              
              
                'g'
              
              
                )
              
              
ax4
              
                .
              
              set_xlabel
              
                (
              
              
                ''
              
              
                )
              
              
ax4
              
                .
              
              set_ylabel
              
                (
              
              
                '分享次數'
              
              
                )
              
              
ax4
              
                .
              
              set_title
              
                (
              
              
                'L2-歸一化數據'
              
              
                )
              
              

plt
              
                .
              
              show
              
                (
              
              
                )
              
            
          

【python數據預處理筆記】——特征縮放(標準化 & 歸一化)_第1張圖片
【python數據預處理筆記】——特征縮放(標準化 & 歸一化)_第2張圖片


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 广南县| 贺州市| 苏尼特右旗| 齐齐哈尔市| 轮台县| 团风县| 鹤山市| 垫江县| 汕尾市| 荆门市| 建德市| 白河县| 夏邑县| 曲水县| 开封县| 读书| 德州市| 曲松县| 襄垣县| 苍山县| 孟州市| 桂东县| 柳江县| 治多县| 前郭尔| 定兴县| 永春县| 靖安县| 常山县| 忻州市| 银川市| 得荣县| 通城县| 新绛县| 布拖县| 长垣县| 左贡县| 通榆县| 昌都县| 西青区| 禄丰县|