希望這篇隨筆能夠從一個實用化的角度對ML中的標准化方法進行一個描述。即便是了解了標准化方法的意義,最終的最終還是要:拿來主義,能夠在實踐中使用。
動機:標准化的意義是什么?
我們為什么要標准化?想象我們有一個Data Matrix $\mathbf{X}\in \mathbb{R}^{n\times d}$ 我們首先必須要做的事情就是對這個Data Matix進行標准化,意義是:“取消由於量綱不同、自身變異或者數值相差較大所引起的誤差。”這個解釋還不是很明白,那么我們可以想象如果不進行標准化會發生什么。首先這個Data Matrix $\mathbf{X}$ 的每一行就代表了一個樣本,我們需要利用這些樣本feature之間的差異來完成我們的機器學習任務,such as regression and classification。接着我們就要使用不同的算法和模型來完成我們的任務,如果你直接對把這些raw data喂給模型。那么一個可能出現的情況就是模型參數的爆炸或者消失,同時訓練速度可能會相當慢。這種情況的影響我的理解是很容易造成樣本特征的模糊或者消失,雖然我們仍然能夠對模型進行訓練,但是效果可能非常不好。
好了,現在我們理解了標准化的意義,那么一個可能的思索是這樣的:既然我們對原始數據進行了標准化處理,那么假如來了新數據我們應該咋辦?要知道我們訓練模型的目的是為了泛化,我們訓練了一個模型之后該對付新來的數據呢,比如:使用標准化之后的模型訓練了一個分類器,現在又來了一個樣本,顯然它沒辦法直接用我們訓練的模型進行分類(因為我們的模型是用標准化之后的數據處理的鴨)。我的想法是,有兩種方法:1. 在對數據矩陣標准化的時候記錄下標准化參數,當有新的數據喂給模型的時,先要對這個數據進行一樣的標准化處理。2. 我們用標准化后的數據訓練了一個模型,模型參數為$\mathbf{W}_{N}$,能夠用這個模型參數倒推“不進行標准化”的模型參數$\mathbf{W}$。這樣我們獲得了一個trained original model。這個模型能夠直接處理不進行標准化的數據。很顯然,第一個方法要比第二個方法簡單通用的多。
最常用的標准化方法:Z-score and Max-Min Normalization
wikipedia上有一個表格,記錄下了標准化的方法:
Name | Formula | Use |
---|---|---|
Standard score | ![]() |
Normalizing errors when population parameters are known. Works well for populations that are normally distributed[2] |
Student's t-statistic | ![]() |
the departure of the estimated value of a parameter from its hypothesized value, normalized by its standard error. |
Studentized residual | ![]() |
Normalizing residuals when parameters are estimated, particularly across different data points in regression analysis. |
Standardized moment | ![]() |
Normalizing moments, using the standard deviation ![]() |
Coefficient of variation |
![]() |
Normalizing dispersion, using the mean ![]() |
Min-Max Feature scaling | ![]() |
Feature scaling is used to bring all values into the range [0,1]. This is also called unity-based normalization. This can be generalized to restrict the range of values in the dataset between any arbitrary points ![]() ![]() ![]() |
其中最最常用的兩個就是Min-Max Feature scaling和Standard score(也叫Z-score),原理和功能可以點上面的鏈接了解,下面介紹一下實現的步驟和一些坑。
Z-score
按如下方法標准化Data Matirx矩陣的每一列 $\mathbf{x}_i$ of $\mathbf{X}(1\leq i\leq d)$:(這里解釋一下為什么是按列標准化:數據矩陣的每一列就代表了樣本的每一維,我們想通過標准化來更好的處理該維度的特征,可以想想按行標准化是什么效果:make no sense)$$z_{ij}\leftarrow \frac{x_{ij}-\text{mean}(\mathbf{x}_i)}{\text{std}(\mathbf{x}_i)}$$
其中$x_{ij}$代表$\mathbf{x}_i$的第$j$個條目,同樣的$z_{ij}$代表$\mathbf{z}_i\in \mathbb{R}^n$的第$j$個條目,$\mathbf{\overline{Z}}=(\mathbf{1},\mathbf{z}_1,\cdots,\mathbf{z}_d)\in \mathbb{R}^{n\times(d+1)}$, mean和std就是按列求每一列的均值啦,我們接下來處理$\mathbf{\overline{Z}}$這個矩陣就好了~~為什么這里會多一維呢?你可能已經知道這個多出來的一叫做dummy variable,我的理解是它一方面可以簡化我們的模型表達,一方面提供了一個相當相當廣義的正則化處理,降低了噪聲的影響(當然這是我見過的大部分模型的需要,需要靈活處理,思想懂了就簡單)。
Min-Max Feature scaling
這個標准化方法在我看來就非常的簡單粗暴了,方式如下:$$z_{ij}\leftarrow \frac{x_{ij}-\text{min}(\mathbf{x}_i)}{\text{max}(\mathbf{x}_i)-\text{min}(\mathbf{x}_i)}$$
其中$x_{ij}$代表$\mathbf{x}_i$的第$j$個條目,同樣的$z_{ij}$代表$\mathbf{z}_i\in \mathbb{R}^n$的第$j$個條目,$\mathbf{\overline{Z}}=(\mathbf{1},\mathbf{z}_1,\cdots,\mathbf{z}_d)\in \mathbb{R}^{n\times(d+1)}$, max和min是按列求每一列的最大和最小值。
實現中可能出現的問題:
假如我們的數據矩陣比較稀疏,可能會出現一整列都是0的情況。此時我們發現上面兩個方法的分母都為0,出現除以0的情況,這時我們該怎么辦?一個比較合理的想法是假如有一整列的0,我們可以標准化后保留。一列零還讓它是一列零。那么我們可以對求得的分母加上一個epsilon,也就是一個小量,1e-8這樣的量級。這樣一列零的情況還是一列零,$\text{std}$ 或者 $\text{max}-\text{min}$不為0的情況也不會受影響。