来源:互联网 更新时间:2026-06-07 13:18
做机器学习,十有八九会碰到这么个情况:手头的数据,有的变量动辄几百上千(比如房价),有的却小得可怜(比如犯罪率)。这种“量纲不统一”的问题,直接扔给算法去跑,结果基本是乱成一锅粥。那怎么办?标准操作就是先做一步“数据缩放”——也叫Feature Scaling。这里面最常用的两招,就是
咱们就拿学生成绩来说吧。假设有学生考了三门课,满分分别是150分、100分和30分。这三个分数如果不处理,直接拿来分析,满分30分的科目天然就会被“淹没”掉。那怎么解决?关键在于把不同尺度的数据拉到同一个“台面”上比较。
标准化走的是“统计路线”。它不去管数据原来的范围,而是用
简单来说,就是拿每个数减去平均值,再除以标准差。这样一来,你就不需要再去纠结“这个变量是100分还是30分”——标准化之后,大家度量衡一致了。
归一化和标准化虽然听着像,但走的路径完全不同。归一化走的是“极值路线”。它用的是
归一化不像标准化那样固定了均值和标准差,它只是单纯地“按比例缩放”。但这里有个大坑:它
所以需要好好区别一下这两个东西:
| 特性 | 归一化 (Normalization) | 标准化 (Standardization) |
|---|---|---|
计算过程 |
使用最小值最大值 |
使用平均值标准差 |
数据分布 |
不改变原始数据的分布;平均值、标准差不固定 |
将数据分布在:平均值0标准差1 |
结果范围 |
数据介于 [0, 1][-1, 1] |
数据不受特定范围的限制,但大致在 [-3, 3] |
其他名字 |
也称为最小最大缩放Min-Max Scaling |
这个过程称为 Z-分数标准化Zero-Score |
异常值影响 |
对异常值非常敏感 |
相对不敏感 |
这里必须强调一个在实际业务中常被新手踩的坑。在做模型之前,我们通常会把数据集分成
行业里的标准做法是:先拆分(分出训练集和测试集),仅对
下面用
| 缩写代码 | 原始描述 | 中文简要描述 |
|---|---|---|
| CRIM | 城镇人均犯罪率 | 城镇人均犯罪率 |
| ZN | 占地面积超过25,000平方英尺的住宅用地比例。 | 住宅用地所占比例 |
| INDUS | 每个城镇非零售业务的比例。 | 城镇中非商业用地占比 |
| CHAS | Charles River虚拟变量 | 靠近河道为 1,否则 0 |
| NOX | 一氧化氮浓度 | 环保指标 |
| RM | 每间住宅的平均房间数 | 房间数 |
| AGE | 1940年以前建造的自住单位比例 | 房龄比例 |
| DIS | 波士顿的五个就业中心加权距离 | 就业距离 |
| RAD | 径向高速公路的可达性指数 | 交通便利指数 |
| TAX | 每10,000美元的全额物业税率 | 税率 |
| PTRATIO | 城镇的学生与教师比例 | 师生比 |
| B | 1000(Bk - 0.63)^2 | 黑人比例相关指标 |
| LSTAT | 人口状况下降 % | 低收入阶层比例 |
| MEDV | 自有住房中位数报价(单位:千美元) | 目标变量(房价) |
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score
# 1. 加载数据
Boston = pd.read_csv('house_data.csv')
X = Boston.drop('MEDV', axis=1)
y = Boston['MEDV']
# 2. 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=0
)
# 3. 原始数据训练模型
model = LinearRegression()
model.fit(X_train, y_train)
# 4. 预测并计算指标
y_pred = model.predict(X_test)
# 5. 输出3个核心指标
mse = mean_squared_error(y_test, y_pred)
mae = mean_absolute_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print("原始数据建模评估指标:")
print(f"1. 均方误差(MSE):{mse:.4f}")
print(f"2. 平均绝对误差(MAE):{mae:.4f}")
print(f"3. 决定系数(R²):{r2:.4f}")
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score
# 1. 加载数据
Boston = pd.read_csv('house_data.csv')
X = Boston.drop('MEDV', axis=1)
y = Boston['MEDV']
# 2. 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=0
)
# 3. 数据标准化
scaler = StandardScaler()
X_train_std = scaler.fit_transform(X_train)
X_test_std = scaler.transform(X_test)
# 查看标准化后的数据特点
print("标准化后训练集前3行:")
print(pd.DataFrame(X_train_std, columns=X.columns).head(3).round(4))
# 4. 用标准化数据训练模型
model_std = LinearRegression()
model_std.fit(X_train_std, y_train)
# 5. 预测并计算指标
y_pred_std = model_std.predict(X_test_std)
# 6. 输出指标
mse_std = mean_squared_error(y_test, y_pred_std)
mae_std = mean_absolute_error(y_test, y_pred_std)
r2_std = r2_score(y_test, y_pred_std)
print("n标准化数据建模评估指标:")
print(f"1. 均方误差(MSE):{mse_std:.4f}")
print(f"2. 平均绝对误差(MAE):{mae_std:.4f}")
print(f"3. 决定系数(R²):{r2_std:.4f}")

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import MinMaxScaler
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score
# 1. 加载数据
Boston = pd.read_csv('house_data.csv')
X = Boston.drop('MEDV', axis=1)
y = Boston['MEDV']
# 2. 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=0
)
# 3. 数据归一化
scaler = MinMaxScaler()
X_train_norm = scaler.fit_transform(X_train)
X_test_norm = scaler.transform(X_test)
print("归一化后训练集前3行(范围[0,1]):")
print(pd.DataFrame(X_train_norm, columns=X.columns).head(3).round(4))
# 4. 用归一化数据训练模型
model_norm = LinearRegression()
model_norm.fit(X_train_norm, y_train)
# 5. 预测并计算指标
y_pred_norm = model_norm.predict(X_test_norm)
# 6. 输出指标
mse_norm = mean_squared_error(y_test, y_pred_norm)
mae_norm = mean_absolute_error(y_test, y_pred_norm)
r2_norm = r2_score(y_test, y_pred_norm)
print("n归一化数据建模评估指标:")
print(f"1. 均方误差(MSE):{mse_norm:.4f}")
print(f"2. 平均绝对误差(MAE):{mae_norm:.4f}")
print(f"3. 决定系数(R²):{r2_norm:.4f}")

进入到深度学习领域,数据缩放的玩法又升级了。因为网络一大,层数一深,最常见的三个问题就是:
假设你正在撸一个处理自然语言的Transformer模型。你准备了4句话,每句话有5个单词,每个单词用一个5维的“词向量”来表示。数据形状就是(批次大小=4,句子长度=5,词向量维度=5)。
层归一化的逻辑很简单:它不关心别的样本长什么样,只管
理解“层”这个字是关键:在这里,它指的不是数据里的一整句话,而是模型里的

代码也极度简单:
import torch import torch.nn as nn ln = nn.LayerNorm(normalized_shape=5) # 参数是最后一个维度大小 x = torch.randn(5, 5, 5) # 模拟输入 output = ln(x)

批次归一化和层归一化的公式几乎是同一个,但“算的方向”完全不同。层归一化是“对着一个样本的一个特征维度去算”,而批量归一化是
举个例子:现在模型吃的是图片。假设批次大小是64,每张图是RGB三通道,分辨率是5×5。此时数据形状是(64, 3, 5, 5)。
批量归一化的操作逻辑是:只抓取所有64张图里

代码也很简洁:
import torch import torch.nn as nn bn = nn.BatchNorm2d(num_features=3) # 参数是通道数 x = torch.randn(64, 3, 5, 5) output = bn(x)

到这里,两个“归一化巨头”的差异就很清晰了:
| 类型 | PyTorch API | 归一化维度 | 适用场景 |
|---|---|---|---|
批量归一化 |
BatchNorm2d(图像) | 批次内的同一通道(跨样本) | 图像、CNN 网络 |
层归一化 |
LayerNorm | 单个样本的所有特征(不跨样本) | 文本、Transformer、RNN |
ThinkBook系列最新价格全解析:2026年选购避坑与实时询价指南
Ondo将于今日上线股票永续合约
暗黑4S14野蛮人终局BD攻略
区块链OTC交易所有哪几家比较正规?
Binance新增15种bStocks代币化证券为杠杆抵押资产
Meme币DOGS今晚上线!开局就解锁91%代币是否带来风险?
忍者必须死3极刃血影角色介绍
晶核艾尔莎角色盘点 晶核艾尔莎强度分析与实战表现
余姚的路虎4s店在哪个位置
彩云天气怎么看分钟级降雨预报 彩云天气精准预报方法【技巧】
五千元以下的笔记本几乎消失!经销商:至少一年看不到涨价尽头
Intel喜讯连连:18A工艺良率提升到85%、CPU将涨价15%
遗忘之海密室通关教程 遗忘之海密室全关卡解谜思路与难点解析
华为Mate 70系列首发的红枫镜头下放至千元档:全员普及原色影像
合集38个项目筹集5.406亿美元 Figure融资2亿
国家养老服务消费补贴上线京东
英伟达机器人团队在京沪深招人,聚焦具身智能等四大领域
一站式PDF转Markdown解决方案PDF3MD
硬刚苹果!华为9月新品阵容出炉:Mate 90系列、全新三折叠
微软Copilot AI漏洞可致敏感数据泄露,企业用户需及时更新
手机号码测吉凶
本站所有软件,都由网友上传,如有侵犯你的版权,请发邮件haolingcc@hotmail.com 联系删除。 版权所有 Copyright@2012-2013 haoling.cc