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

作者: Calpa Liu
字數:2331
出版:2025 年 4 月 9 日
分類: 後端開發 技術文章 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 標準化都應該成為標準數據預處理工具箱中的重要組成部分。

後端技術日新月異,訂閱本站,第一時間掌握 Node.js、Python、Docker 等核心技術動態!
後端開發 技術文章 Python 資料科學 機器學習 資料分析
關於 Calpa

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

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

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

熱門文章

最新文章