目 錄
-
一、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. 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 區間中。 消除量綱對結果的影響,使不同特征之間具有可比性 。
應用 :
- 無量綱化
??例如房子數量和收入,從業務層知道這兩者的重要性一樣,所以把它們全部歸一化,這是從業務層面上作的處理。
- 避免數值問題
??不同的數據在不同列數據的數量級相差過大的話,計算起來大數的變化會掩蓋掉小數的變化。
- 一些模型求解的需要
??例如梯度下降法,如果不歸一化,當學習率較大時,求解過程會呈 Z 字形下降。學習率較小,則會產生直角形路線,不管怎么樣,都不會是好路線。具體參考 神經網絡為什么要歸一化
- 時間序列
??進行log分析時,會將原本絕對化的時間序列歸一化到某個基準時刻,形成相對時間序列,方便排查。
- 收斂速度
??加快求解過程中參數的收斂速度。
特點 :
- 對不同特征維度進行伸縮變換
- 改變原始數據的分布(不改變 單特征 分布的形狀),使得各個特征維度對目標函數的影響權重歸于一致(使得扁平分布的數據伸縮變換成類圓形)
- 對目標函數的影響體現在數值上
- 把有量綱表達式變為無量綱表達式
好處 :
- 提高迭代求解的收斂速度
- 提高迭代求解的精度
缺點 :
- 最大值與最小值非常容易受異常點影響
- 魯棒性較差,只適合傳統精確小數據場景
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
(
)
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

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