《sklearn機器學習——數據預處理》標準化或均值去除和方差縮放

數據集的標準化是scikit-learn中實現許多機器學習估計器的普遍要求;如果個別特征看起來或多或少不像標準正態分布數據:均值和單位方差為零的高斯分布,則它們的性能可能不好。

在實踐中,我們通常會忽略分布的形狀,而只是通過刪除每個特征的平均值來實現特征數據中心化,然后除以非常數特征的標準差來縮放數據。

例如,學習算法的目標函數中使用的許多元素(例如支持向量機的RBF內核或線性模型的l1和l2正則化器)都假定所有特征都圍繞零為中心并且具有相同階數的方差。如果某個特征的方差比其他特征大幾個數量級,則它可能會極大影響目標函數,并使估計器無法按預期從其他特征中正確學習。

sklearn 數據預處理中的數據標準化

核心思想

數據標準化(Standardization)是將特征數據轉換為均值為 0、標準差為 1 的分布(即標準正態分布)。其數學公式為:z=(x?μ)/σz = (x - μ) / σz=(x?μ)/σ

其中:

  • x 是原始特征值
  • μ 是該特征的均值
  • σ 是該特征的標準差
  • z 是標準化后的值

標準化適用于特征尺度差異較大或算法假設數據服從正態分布的情況(如 SVM、邏輯回歸、PCA、神經網絡等)。


常用函數與類

1. sklearn.preprocessing.StandardScaler

這是最常用的標準化工具類。

參數說明:
參數名類型默認值說明
copyboolTrue是否復制數據。若為 False,則嘗試在原數據上進行變換(不保證一定原地修改)。
with_meanboolTrue是否中心化(減去均值)。若為 False,則不減均值。對稀疏矩陣必須設為 False
with_stdboolTrue是否縮放(除以標準差)。若為 False,則僅中心化。
屬性(擬合后可用):
屬性名說明
mean_每個特征的均值(形狀為 (n_features,)
scale_每個特征的標準差(形狀為 (n_features,)
var_每個特征的方差(形狀為 (n_features,)
n_samples_seen_擬合時看到的樣本數
方法:
  • .fit(X[, y]):計算均值和標準差。
  • .transform(X):使用擬合的參數對數據進行標準化。
  • .fit_transform(X[, y]):先擬合再轉換。
  • .inverse_transform(X):將標準化后的數據還原為原始尺度。
  • .get_feature_names_out(input_features=None):獲取輸出特征名(適用于管道)。
返回值:
  • .fit():返回 self(用于鏈式調用)
  • .transform(X):返回 numpy.ndarrayscipy.sparse matrix,形狀與輸入相同,類型為 float64

簡單示例代碼

from sklearn.preprocessing import StandardScaler
import numpy as np# 創建示例數據
X = np.array([[1, 2],[3, 4],[5, 6],[7, 8]], dtype=float)print("原始數據:")
print(X)# 初始化標準化器
scaler = StandardScaler()# 擬合并轉換數據
X_scaled = scaler.fit_transform(X)print("\n標準化后數據:")
print(X_scaled)print("\n各特征均值:", scaler.mean_)
print("各特征標準差:", scaler.scale_)# 逆變換還原數據
X_original = scaler.inverse_transform(X_scaled)
print("\n逆變換還原數據:")
print(X_original)

輸出示例:

原始數據:
[[1. 2.][3. 4.][5. 6.][7. 8.]]標準化后數據:
[[-1.34164079 -1.34164079][-0.4472136  -0.4472136 ][ 0.4472136   0.4472136 ][ 1.34164079  1.34164079]]各特征均值: [4. 5.]
各特征標準差: [2.23606798 2.23606798]逆變換還原數據:
[[1. 2.][3. 4.][5. 6.][7. 8.]]

管道中使用示例:

from sklearn.pipeline import Pipeline
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split
from sklearn.datasets import make_classification# 生成示例數據
X, y = make_classification(n_samples=100, n_features=4, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 構建管道:先標準化,再分類
pipeline = Pipeline([('scaler', StandardScaler()),('classifier', SVC())
])pipeline.fit(X_train, y_train)
score = pipeline.score(X_test, y_test)
print(f"測試集準確率:{score:.4f}")

sklearn 數據預處理中的均值去除(Mean Removal / Centering)

核心思想

均值去除(Mean Removal),也稱為數據中心化(Centering),是指對每個特征維度減去其樣本均值,使得處理后的數據在該維度上的均值為 0。

數學公式:xcentered=x?mean(x)x_{centered} = x - mean(x)xcentered?=x?mean(x)

  • 不改變數據的方差或分布形狀
  • 僅將數據“平移”至以 0 為中心
  • 是數據標準化(Standardization)的第一步(標準化 = 均值去除 + 方差縮放)

? 適用場景

  • 某些算法要求輸入數據均值為 0(如 PCA、SVM、神經網絡)
  • 避免特征因均值偏移導致模型學習偏差
  • 作為預處理步驟,常與縮放結合使用

常用函數與類

1. sklearn.preprocessing.StandardScaler(最常用)

雖然名為“標準化器”,但通過設置 with_std=False,可僅執行均值去除。

參數說明:
參數名類型默認值說明
copyboolTrue是否復制數據。若為 False,嘗試原地修改(不保證)。
with_meanboolTrue是否進行均值去除(中心化)。必須為 True 才能去均值。
with_stdboolTrue是否進行標準差縮放。設為 False 時僅做中心化。

?? 對稀疏矩陣(如 scipy.sparse),with_mean=True 會報錯,因為會導致稠密輸出。

屬性(擬合后可用):
屬性名說明
mean_每個特征的均值(形狀 (n_features,)
scale_with_std=True,為標準差;否則為 None
n_samples_seen_擬合時看到的樣本數
方法:
  • .fit(X[, y]):計算每個特征的均值。
  • .transform(X):對數據執行中心化(減去均值)。
  • .fit_transform(X[, y]):先擬合再轉換。
  • .inverse_transform(X):還原數據(加上均值)。
  • .get_feature_names_out(...):獲取輸出特征名(兼容管道)。
返回值:
  • .fit() → 返回 self
  • .transform(X) → 返回 numpy.ndarrayscipy.sparse matrix(若輸入為稀疏且 with_mean=False),類型為 float64,形狀同輸入

簡單示例代碼

from sklearn.preprocessing import StandardScaler
import numpy as np# 創建示例數據
X = np.array([[1, 10],[2, 20],[3, 30],[4, 40]], dtype=float)print("原始數據:")
print(X)
print("原始均值:", np.mean(X, axis=0))# 初始化僅做均值去除的縮放器
scaler = StandardScaler(with_std=False)  # 關閉標準差縮放# 擬合并轉換
X_centered = scaler.fit_transform(X)print("\n中心化后數據:")
print(X_centered)
print("中心化后均值:", np.mean(X_centered, axis=0))  # 應為 [0., 0.]print("\n學習到的均值:", scaler.mean_)# 逆變換還原原始數據
X_original = scaler.inverse_transform(X_centered)
print("\n逆變換還原數據:")
print(X_original)

輸出示例:

原始數據:
[[ 1. 10.][ 2. 20.][ 3. 30.][ 4. 40.]]
原始均值: [ 2.5 25. ]中心化后數據:
[[-1.5 -15. ][-0.5  -5. ][ 0.5   5. ][ 1.5  15. ]]
中心化后均值: [0. 0.]學習到的均值: [ 2.5 25. ]逆變換還原數據:
[[ 1. 10.][ 2. 20.][ 3. 30.][ 4. 40.]]

sklearn 數據預處理中的方差縮放(Scaling to Unit Variance)

核心思想

方差縮放(Variance Scaling) 是指將每個特征維度的數據除以其標準差(或等效統計量),使得縮放后的特征方差為 1(即單位方差)。

數學公式:xscaled=x/σx_{scaled} = x / σxscaled?=x/σ

其中:

  • x 是原始特征值
  • σ 是該特征的標準差(std(x)
  • x_scaled 是方差縮放后的值

? 注意:方差縮放通常不單獨使用,而是與均值去除(中心化) 結合構成完整的標準化(Standardization)

z = (x - μ) / σ

為什么需要方差縮放?

  • 某些算法(如 SVM、KNN、PCA、神經網絡)對特征尺度敏感
  • 若某特征方差遠大于其他特征,會主導目標函數或距離計算
  • 保證所有特征在“相同量級”上,提升模型收斂速度和性能

常用函數與類

1. sklearn.preprocessing.StandardScaler(最常用)

通過設置 with_mean=False,可僅執行方差縮放(不中心化)。

參數說明:
參數名類型默認值說明
copyboolTrue是否復制數據。若為 False,嘗試原地修改(不保證)。
with_meanboolTrue是否中心化。設為 False 可僅做方差縮放。
with_stdboolTrue是否進行方差縮放。必須為 True 才生效。

?? 對稀疏矩陣,with_mean=True 會導致報錯(因為中心化會破壞稀疏性),但 with_mean=False 是安全的。

屬性(擬合后可用):
屬性名說明
scale_每個特征的標準差(形狀 (n_features,)
mean_with_mean=True,為均值;否則為 None
var_每個特征的方差(scale_ ** 2
n_samples_seen_擬合時看到的樣本數
方法:
  • .fit(X[, y]):計算每個特征的標準差(和均值,若啟用)。
  • .transform(X):對數據執行縮放(和中心化,若啟用)。
  • .fit_transform(X[, y]):先擬合再轉換。
  • .inverse_transform(X):還原數據(乘以標準差,加上均值)。
  • .get_feature_names_out(...):獲取輸出特征名(兼容管道)。
返回值:
  • .fit() → 返回 self
  • .transform(X) → 返回 numpy.ndarrayscipy.sparse matrix(若輸入稀疏且 with_mean=False),類型為 float64,形狀同輸入

簡單示例代碼

from sklearn.preprocessing import StandardScaler
import numpy as np# 創建示例數據(注意:不同列方差差異大)
X = np.array([[1, 100],[2, 200],[3, 300],[4, 400]], dtype=float)print("原始數據:")
print(X)
print("原始標準差:", np.std(X, axis=0))# 初始化僅做方差縮放的縮放器(不中心化)
scaler = StandardScaler(with_mean=False, with_std=True)# 擬合并轉換
X_scaled = scaler.fit_transform(X)print("\n方差縮放后數據:")
print(X_scaled)
print("縮放后標準差:", np.std(X_scaled, axis=0))  # 應為 [1., 1.]print("\n學習到的標準差(scale_):", scaler.scale_)# 逆變換還原原始數據
X_original = scaler.inverse_transform(X_scaled)
print("\n逆變換還原數據:")
print(X_original)

輸出示例:

原始數據:
[[  1. 100.][  2. 200.][  3. 300.][  4. 400.]]
原始標準差: [1.11803399 111.80339887]方差縮放后數據:
[[0.89442719 0.89442719][1.78885438 1.78885438][2.68328157 2.68328157][3.57770876 3.57770876]]
縮放后標準差: [1. 1.]學習到的標準差(scale_): [  1.11803399 111.80339887]逆變換還原數據:
[[  1. 100.][  2. 200.][  3. 300.][  4. 400.]]

僅方差縮放 vs 完整標準化 對比示例

import numpy as np
from sklearn.preprocessing import StandardScalerX = np.array([[1, 100],[2, 200],[3, 300],[4, 400]], dtype=float)# 僅方差縮放
scaler_var_only = StandardScaler(with_mean=False)
X_var_scaled = scaler_var_only.fit_transform(X)# 完整標準化(去均值 + 方差縮放)
scaler_full = StandardScaler()
X_standardized = scaler_full.fit_transform(X)print("僅方差縮放:\n", X_var_scaled)
print("完整標準化:\n", X_standardized)

輸出:

僅方差縮放:[[0.89442719 0.89442719][1.78885438 1.78885438][2.68328157 2.68328157][3.57770876 3.57770876]]完整標準化:[[-1.34164079 -1.34164079][-0.4472136  -0.4472136 ][ 0.4472136   0.4472136 ][ 1.34164079  1.34164079]]

在管道中使用示例:

from sklearn.pipeline import Pipeline
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split
from sklearn.datasets import make_classification# 生成數據(故意制造方差差異)
np.random.seed(42)
X, y = make_classification(n_samples=100, n_features=4, random_state=42)
# 放大第二列方差
X[:, 1] *= 100X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 管道:僅方差縮放 + SVM
pipeline = Pipeline([('var_scaler', StandardScaler(with_mean=False)),  # 僅縮放方差('svm', SVC())
])pipeline.fit(X_train, y_train)
score = pipeline.score(X_test, y_test)
print(f"測試集準確率(僅方差縮放):{score:.4f}")# 對比:完整標準化
pipeline_full = Pipeline([('scaler', StandardScaler()),  # 完整標準化('svm', SVC())
])
pipeline_full.fit(X_train, y_train)
score_full = pipeline_full.score(X_test, y_test)
print(f"測試集準確率(完整標準化):{score_full:.4f}")

與其他縮放器對比

縮放器是否去均值是否單位方差是否受異常值影響適用場景
StandardScaler(with_mean=False)??僅需統一方差,保留原始均值
StandardScaler() (默認)??最常用標準化
MinMaxScaler? (映射到[0,1])?需固定范圍,如圖像像素
RobustScaler? (中位數)? (IQR)含異常值的數據

注意事項

重要提醒:

  • 方差縮放應在訓練集上擬合,然后應用于測試集/新數據。
  • 若特征標準差為 0(常數特征),StandardScaler 會將其縮放為 0(可后續刪除或填充)。
  • 對稀疏數據,使用 with_mean=False 是安全的;若需中心化,考慮 RobustScaler 或手動處理。
  • 單獨使用方差縮放較少見,通常建議與均值去除結合使用(完整標準化)。

總結

方差縮放是確保所有特征具有相同“能量級別”的關鍵步驟。在 sklearn 中,通過 StandardScaler(with_mean=False) 可實現純方差縮放。雖然實踐中更常用完整標準化(with_mean=True),但在某些特定場景(如保留原始偏移量、處理稀疏數據)下,僅縮放方差仍具有實用價值。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/98633.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/98633.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/98633.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

leedcode 算法刷題第三十一天

1049. 最后一塊石頭的重量 II 有一堆石頭&#xff0c;用整數數組 stones 表示。其中 stones[i] 表示第 i 塊石頭的重量。 每一回合&#xff0c;從中選出任意兩塊石頭&#xff0c;然后將它們一起粉碎。假設石頭的重量分別為 x 和 y&#xff0c;且 x < y。那么粉碎的可能結果…

圖神經網絡介紹

源自論文&#xff1a;Survey on Graph Neural Networks 圖神經網絡&#xff08;GNNs&#xff09;中的符號與定義詳解 本文使用了圖論和深度學習領域的標準符號體系&#xff0c;以確保對圖結構數據的描述清晰一致。以下是核心符號和定義的詳細說明&#xff1a; 一、基礎圖結構符…

測試報告:“問卷考試系統”項目

目錄 一、報告概述 &#xff08;一&#xff09;項目背景 &#xff08;二&#xff09;項目核心模塊與測試目的 1、項目核心模塊 2、測試目的 &#xff08;三&#xff09;測試環境 1、硬件環境 2、軟件環境 &#xff08;1&#xff09;操作系統 &#xff08;2&#xff0…

Linux筆記---網絡計算器

1. 網絡程序分層 我們說過&#xff0c;OSI7層模型十分完美&#xff0c;但是因特網實際上采用的是TCP/IP五層模型&#xff1a; 實際上&#xff0c;對比可以發現&#xff0c;TCP/IP模型實際上就是將OSI的前三層模型合并為了應用層。 這就提示我們&#xff0c;我們設計的應用程…

《智能網聯汽車交通仿真軟件可信度評估》團標啟動會圓滿舉辦

讓數據真正閉環的L4級自動駕駛仿真工具鏈&#xff0d;杭州千岑智能科技有限公司&#xff1a;RSim 近日&#xff0c;由中國仿真學會主辦、清華大學牽頭的《智能網聯汽車交通仿真軟件可信度評估》團體標準啟動會在北京成功舉行。杭州千岑科技有限公司作為智能網聯汽車測試驗證領域…

關于 MCU 芯片外圍電路的快速入門介紹

MCU&#xff08;微控制單元&#xff0c;Microcontroller Unit&#xff09;是嵌入式系統的“大腦”&#xff0c;但需通過外圍電路實現供電、信號輸入/ 輸出、通信、存儲等功能&#xff0c;才能構成完整的工作系統。外圍電路的設計直接決定 MCU 的穩定性、功能擴展性和適用場景&a…

Uniapp onLoad 和 onShow 區別

一、核心區別生命周期觸發時機執行次數參數獲取onLoad頁面首次創建時觸發僅1次支持獲取URL參數optionsonShow頁面每次顯示時觸發&#xff08;包括返回&#xff09;多次無法獲取URL參數二、實戰數據請求場景優先使用onLoad請求數據的場景&#xff1a;初始化數據當需要根據URL參數…

大模型預訓練評估指標

模型效果評測 關于 Language Modeling 的量化指標&#xff0c;較為普遍的有 [PPL]&#xff0c;[BPC]等,可以簡單理解為在生成結果和目標文本之間的 Cross Entropy Loss 上做了一些處理&#xff0c;這種方式可以用來評估模型對「語言模板」的擬合程度即給定一段話&#xff0c;預…

【Matlab】-- 機器學習項目 - 基于XGBoost算法的數據回歸預測

文章目錄 文章目錄01 內容概要02 部分代碼03 代碼解讀04 運行結果05 基于XGBoost算法的數據回歸預測源碼01 內容概要 XGBoost屬于集成學習中的Boosting方法&#xff0c;其基本思想是&#xff1a; 逐步構建多個弱學習器&#xff08;通常是CART決策樹&#xff09;&#xff0c;每…

Memory in LLM Agent

Memory in LLM Agent 1 為什么需要“記憶” —— 背景與動機 在構建 LLM Agent&#xff08;Large Language Model Agent&#xff0c;大語言模型驅動的智能體&#xff09;的過程中&#xff0c;“記憶”&#xff08;Memory&#xff09;是一個繞不開的核心問題。沒有記憶的 Agent…

三甲地市級醫院數據倉湖數智化建設路徑與編程工具選型研究(上)

摘要 本研究旨在探索三甲地市級醫院數據倉湖數智化建設的實施路徑與工具選型策略,以響應國家《"十四五"全民健康信息化規劃》中2025年醫療數據平臺聯通全覆蓋的政策要求,同時解決地市級醫院面臨的資源限制(年均信息化投入占總營收1.5%)、區域協同需求突出及多業…

25.9.10_CTF-reverse_RC4那些事兒

CTF-reverse_RC4那些事兒 0x00 RC4加密知識點 推薦看這位up主的視頻https://www.bilibili.com/video/BV1G64y1Y7p4/?spm_id_from333.1391.0.0&p2 簡單來說RC4算法包括兩部分KSA(利用Key生成S盒)和PRGA(利用S盒生成密鑰流): KSA: 初始化S&#xff08;一般是0-255&…

網絡編程(6)

【0】復習 Modbus&#xff1a;modbus tcp modbus rtu Modbus TCP: 特點&#xff1a;主從問答&#xff08;控制 采集信息&#xff09; 應用層協議&#xff08;基于TCP通信&#xff09;、默認端口502 組成&#xff1a;報文頭&#xff08;7 事物2 協議2 長度2 單元表示1&#xff…

技術文章大綱:AI繪畫—動漫角色生成賽

技術文章大綱&#xff1a;AI繪畫—動漫角色生成賽 背景與意義 動漫角色生成賽的興起與發展AI繪畫技術在動漫創作中的應用價值比賽對推動AI藝術創新的作用 技術核心&#xff1a;AI繪畫模型 主流模型介紹&#xff08;如Stable Diffusion、MidJourney、DALLE&#xff09;針對動…

Flink-新增 Kafka source 引發狀態丟失導致啟動失敗

背景 Flink Job 新增 kafka source 算子,從狀態保留并啟動后提示 org.apache.flink.util.StateMigrationException: The new state typeSerializer for operator state must not be incompatible,導致任務 Fail。 Source: task-kafka-source -> task-kafka-transform (1…

【系統架構設計(26)】系統可靠性分析與設計詳解:構建高可用軟件系統的核心技術

文章目錄一、本文知識覆蓋范圍1、概述2、知識體系概覽二、系統可靠性基礎概念1、可靠性與可用性的本質區別2、軟件可靠性與硬件可靠性的深度對比3、核心可靠性指標的業務價值三、系統架構可靠性模型1、串聯系統的可靠性挑戰2、并聯系統的高可靠性設計3、混合系統的復雜性管理四…

4 C 語言數據結構實戰:棧和隊列完整實現(結構體 + 函數)+ 最小棧解決方案

棧和隊列 1. 棧 棧&#xff1a;?種特殊的線性表&#xff0c;其只允許在固定的?端進?插?和刪除元素操作。進?數據插?和刪除操作 的?端稱為棧頂&#xff0c;另?端稱為棧底。棧中的數據元素遵守后進先出LIFO&#xff08;Last In First Out&#xff09;的原則。 壓棧&…

Milvus基于docker主機外掛實踐

一、安裝docker與我之前寫的原博客&#xff1a;ubuntu安裝milvus向量數據庫&#xff0c;獲取key不同&#xff0c;原博客獲取key已經過時# 更新Ubuntu軟件包列表和已安裝軟件的版本: sudo apt update# 安裝Ubuntu系統的依賴包 sudo apt-get install ca-certificates curl gnupg …

使用python test測試http接口

使用python test測試http接口獲取token和控制session&#xff0c;后面大多數接口要帶上這些信息 import time import requestsfrom common.aes_algorithm import AES from config.config import Config from config.log import logclass Common:username "admin"pas…

平時只會CRUD,沒有高質量項目經驗,我該怎么辦

我沒有項目經驗怎么辦 首先&#xff0c;不管是應屆生還是社招幾年工作經驗的朋友&#xff0c;除非特別厲害的人&#xff0c;大家都會遇到這個問題。 我們該怎么處理&#xff0c;關注hikktn&#xff01;為你解答這個問題。 問AI世面上那個大廠程序員項目推薦 為什么這么說呢&…