Z-Score 在 SciPy 中的技術應用與優勢

作者: Calpa Liu
字數:2331
出版:April 9, 2025
分類: 後端開發 技術文章 Python 資料科學 機器學習 資料分析

Z-Score(標準分數)是統計學中一個強大而通用的工具,用於將不同尺度的數據標準化到一個共同參考框架中。在 SciPy 這個廣泛使用的 Python 科學計算庫中,Z-Score 的實現既簡潔又高效。本文將深入探討 SciPy 中 Z-Score 的技術細節,並分析使用 Z-Score 進行數據標準化的諸多優勢,尤其是在數據科學和機器學習領域中的應用。

Z-Score 的基本概念

Z-Score(也稱為標準分數)表示一個數據點距離平均值有多少個標準差。其計算公式為:

Equation
Equation

其中 X 是原始數據值,μ是平均值,σ是標準差。

在 SciPy 中,Z-Score 主要通過scipy.stats.zscore函數實現,其語法如下:

scipy.stats.zscore(a, axis=0, ddof=0, nan_policy='propagate')

該函數參數包括:

  • a:包含樣本數據的數組
  • axis:計算 Z-Score 的軸,默認為 0
  • ddof:標準差計算中的自由度校正,默認為 0
  • nan_policy:定義如何處理 NaN 值,選項包括 propagateraiseomit

用途

Z-Score 標準化的主要用途包括:

  1. 數據標準化:將不同尺度的特徵轉換到同一尺度,特別是在機器學習中,確保所有特徵對模型的影響相等。
  2. 異常值檢測:通過 Z-Score 可以識別出離群值,這些值可能表示數據中的異常或錯誤。
  3. 聚類分析:在聚類算法中,Z-Score 標準化確保每個特徵具有相同的權重,從而提高聚類結果的準確性。
  4. 主成分分析:在 PCA 中,Z-Score 標準化確保每個特徵的方差相等,從而找到基於數據結構而非尺度的最有意義的成分。

在日常生活中,我們也常常用 Z-Score 來衡量某個數據點的離散程度,例如在體重管理中,我們可以計算某個人的體重 Z-Score,來確定他是否處於正常範圍內。

基本使用示例

以下是一個簡單的示例,展示如何使用 SciPy 計算 Z-Score:

import numpy as np
from scipy import stats

# 創建一個數組
data = np.array([6, 7, 7, 12, 13, 13, 15, 16, 19, 22])

# 計算 Z-Score
z_scores = stats.zscore(data)
print(z_scores)
# 輸出:[-1.39443338 -1.19522861 -1.19522861 -0.19920477  0.          0.
#         0.39840954  0.5976143   1.19522861  1.79284291]

這些 Z-Score 值告訴我們每個數據點相對於平均值的位置。例如,數組中第一個值”6”比平均值低 1.394 個標準差,而最後一個值”22”比平均值高 1.793 個標準差。

多維數組中的 Z-Score 計算

SciPy 的 zscore 函數也可以處理多維數組:

# 多維數組示例
data_2d = np.array([[5, 6, 7, 7, 8], 
                     [8, 8, 8, 9, 9], 
                     [2, 2, 4, 4, 5]])

# 沿著 axis=1 計算 Z-Score
z_scores_2d = stats.zscore(data_2d, axis=1)
print(z_scores_2d)
# 輸出:
# [[-1.56892908 -0.58834841  0.39223227  0.39223227  1.37281295]
#  [-0.81649658 -0.81649658 -0.81649658  1.22474487  1.22474487]
#  [-1.16666667 -1.16666667  0.5         0.5         1.33333333]]

這裡,axis=1指定沿著每行計算 Z-Score,這樣每個數據點都相對於其所在行的平均值和標準差進行標準化。

Z-Score 的技術優勢

Z-Score 標準化提供了許多顯著的技術優勢,使其成為數據預處理的首選方法之一:

1. 數據標準化與比較的便利性

Z-Score 將所有特徵轉換到一個標準尺度(均值為 0,標準差為 1),這使得不同尺度的特徵可以直接比較。在機器學習中,當特徵具有不同的量級(如年齡與收入)時,未經標準化的特徵可能會導致算法偏向數值較大的特徵。

2. 增強距離計算類算法的性能

許多機器學習算法,如 k 最近鄰(k-NN)和支持向量機(SVM),依賴於距離計算。如果特徵尺度不一致,具有較大數值範圍的特徵將主導距離計算。Z-Score 標準化確保每個特徵對距離度量的貢獻相等,從而提高這類算法的準確性。

3. 改善梯度下降算法的收斂速度

使用梯度下降優化的算法,如線性回歸、邏輯回歸和神經網絡,在特徵尺度差異很大時可能會遇到收斂困難。當特徵尺度不一致時,梯度下降可能在某些方向上步伐過大,而在其他方向上步伐過小,導致優化過程低效。Z-Score 標準化使學習過程更加平滑和快速,提高了模型性能和收斂速度。

4. 有效處理異常值

雖然 Z-Score 標準化不會移除異常值,但它使識別數據集中的極端值變得更加容易。通常,Z-Score 絕對值大於 3 的數據點可被視為潛在的異常值。這比其他方法(如 Min-Max 標準化)更有效地處理異常值,後者可能會壓縮異常值的行為。

5. 不受數據分佈限制

與 Min-Max 標準化(將數據強制限制在特定範圍內,通常是[0,1])不同,Z-Score 標準化不對底層數據分佈做任何假設。這使它在處理非均勻分佈的數據時更加靈活。Z-Score 保留了原始數據的分佈形狀,僅改變了數據的位置和尺度,這對於需要保持數據分佈特徵的分析尤為重要。

6. 提升主成分分析(PCA)的效果

在進行主成分分析時,如果特徵尺度不一致,PCA 會偏向具有較大方差的特徵,即使這些特徵可能不是最相關的。通過 Z-Score 標準化,每個特徵對方差的貢獻相等,使 PCA 能夠找到基於數據結構而非尺度的最有意義的成分。

7. 增強正則化效果

在使用正則化技術(如嶺回歸和套索回歸)時,Z-Score 標準化確保懲罰項對所有特徵的影響相等。如果不進行標準化,具有較大尺度的特徵可能會有不成比例的大係數,使正則化過程變得不那麼有效。

Z-Score 在數據聚類中的應用

Z-Score 標準化在數據聚類任務中特別有價值。當應用於聚類算法時,Z-Score 標準化確保每個變量具有相同的權重,這對於處理混合單位的數據集至關重要。

例如,在對客戶進行分群時,如果同時考慮年齡(範圍約 20-90)和收入(範圍可能是數萬甚至數十萬),未標準化的數據會使聚類結果主要由收入決定。通過 Z-Score 標準化,兩個特徵可以平等地影響聚類結果。

代碼實現比較:手動計算 vs. SciPy 函數

使用 NumPy 手動計算 Z-Score

import numpy as np

# 示例數據集
data = np.array([[22, 20000], [25, 30000], [30, 40000], [35, 50000], [40, 60000]])

# 計算每列(特徵)的平均值和標準差
mean = np.mean(data, axis=0)
std_dev = np.std(data, axis=0)

# 應用 Z-Score 公式:Z = (X - mean) / std_dev
normalized_data = (data - mean) / std_dev

使用 SciPy 的 zscore 函數

from scipy import stats
import numpy as np

# 示例數據集
data = np.array([[22, 20000], [25, 30000], [30, 40000], [35, 50000], [40, 60000]])

# 使用 SciPy 的 zscore 函數
normalized_data = stats.zscore(data)

SciPy 的實現更加簡潔,並且處理了各種邊緣情況,如軸的選擇和 NaN 值的處理。

注意事項與常見問題

自由度校正

在計算標準差時,SciPy 的 zscore 函數默認使用總體標準差(ddof=0)。然而,對於從樣本中推斷總體特性的應用,樣本標準差(ddof=1)可能更適合。可以通過設置ddof=1參數來調整:

# 使用樣本標準差(ddof=1)
z_scores = stats.zscore(data, ddof=1)

軸的選擇

SciPy 的 zscore 函數默認沿著 axis=0 工作(即列方向),這意味著對於二維數組,每列的數據點會相對於該列的均值和標準差進行標準化。如果需要沿著其他軸計算,或對整個數組進行標準化,可以調整 axis 參數:

# 沿著行方向(axis=1)計算 Z-Score
z_scores_row = stats.zscore(data, axis=1)

# 對整個數組計算 Z-Score
z_scores_all = stats.zscore(data, axis=None)

處理 NaN 值

在實際數據處理中,缺失值(NaN)是常見的挑戰。SciPy 的 zscore 函數提供了 nan_policy 參數來處理這種情況,選項包括 propagate(默認,將 NaN 傳播到輸出)、raise(遇到 NaN 時拋出錯誤)或 omit(忽略 NaN 值進行計算)。

在機器學習流程中的應用

在實際的機器學習流程中,Z-Score 標準化通常是預處理階段的一部分。使用 scikit-learn 的StandardScaler類可以輕鬆地將 Z-Score 標準化集成到機器學習管道中:

from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
from sklearn.svm import SVC

# 創建包含標準化和 SVM 的管道
pipeline = Pipeline([
    ('scaler', StandardScaler()),  # Z-Score 標準化
    ('svm', SVC())                 # 支持向量機分類器
])

# 使用管道擬合和預測
pipeline.fit(X_train, y_train)
predictions = pipeline.predict(X_test)

這種方法確保了訓練數據和測試數據以相同的方式進行標準化,防止了數據洩漏問題。

結論

Z-Score 在 SciPy 中的實現提供了一個強大而靈活的工具,用於數據標準化,特別是在機器學習和數據科學應用中。其主要優勢包括數據標準化與比較的便利性、增強距離計算類算法的性能、改善梯度下降算法的收斂速度、有效處理異常值、不受數據分佈限制、提升主成分分析的效果以及增強正則化效果。

正確理解並應用 Z-Score 標準化技術,可以顯著提高數據處理和機器學習模型的效率和準確性。SciPy 提供的簡潔而強大的函數,使這一過程變得簡單、高效且可靠。對於任何涉及不同尺度特徵的數據分析任務,Z-Score 標準化都應該成為標準數據預處理工具箱中的重要組成部分。

感謝您閱讀我的文章。歡迎隨時分享你的想法。
後端開發 技術文章 Python 資料科學 機器學習 資料分析
關於 Calpa

Calpa 擅長使用 TypeScriptReact.jsVue.js 建立 Responsive Website。

他積極參與開源社區,曾在 2019 年的香港開源大會上擔任講者,提供工作經驗和見解。此外,他也在 GitHub 上公開分享個人博客程式碼,已獲得超過 300 顆星星和 60 個分支的支持。

他熱愛學習新技術,並樂意分享經驗。他相信,唯有不斷學習才能跟上快速演變的技術環境。