2.特征归一化
约 435 字大约 1 分钟
2025-09-20
比如在身高和体重特征上, (身高,体重)=(1.75,60),(1.65,55)和(1.85,65) 会发现身高和体重因为量纲不同,但是导致身高的权重过高,体重对结果的影响反而很小。 所以,我们需要归一化,让他们在一定程度上有可比性。
最大最小归一化
xnorm=xmax−xminx−xmin
但是可能受到极端值影响,有些人重到1000斤,会导致结果失真
零均值归一化
xnorm=std(x)x−mean(x)
from sklearn import datasets
import numpy as np
iris = datasets.load_iris()
X = iris.data
y = iris.targetX[:5]运行结果
array([[5.1, 3.5, 1.4, 0.2], [4.9, 3. , 1.4, 0.2], [4.7, 3.2, 1.3, 0.2], [4.6, 3.1, 1.5, 0.2], [5. , 3.6, 1.4, 0.2]])
# 1. 最大最小归一化
_max = np.max(X[:,0])
_min = np.min(X[:,0])
_max, _min运行结果
(7.9, 4.3)
X[:,0] = (X[:,0]-np.min(X[:,0])) / (np.max(X[:,0])-np.min(X[:,0]))X[:5]运行结果
array([[0.22222222, 3.5 , 1.4 , 0.2 ], [0.16666667, 3. , 1.4 , 0.2 ], [0.11111111, 3.2 , 1.3 , 0.2 ], [0.08333333, 3.1 , 1.5 , 0.2 ], [0.19444444, 3.6 , 1.4 , 0.2 ]])
# 同样对剩下四列可以归一化# 零均值归一化
X[:,1] = (X[:,1] - np.mean(X[:,1])) / np.std(X[:,1])
X[:5]运行结果
array([[ 0.22222222, 1.01900435, 1.4 , 0.2 ], [ 0.16666667, -0.13197948, 1.4 , 0.2 ], [ 0.11111111, 0.32841405, 1.3 , 0.2 ], [ 0.08333333, 0.09821729, 1.5 , 0.2 ], [ 0.19444444, 1.24920112, 1.4 , 0.2 ]])
np.mean(X[:,1])运行结果
-7.815970093361102e-16
使用sklearn
X = iris.data
y = iris.targetfrom sklearn.preprocessing import StandardScaler
standard_scaler = StandardScaler()
standard_scaler.fit(X)
standard_scaler.mean_运行结果
array([ 4.28703704e-01, -9.69594775e-16, 3.75800000e+00, 1.19933333e+00])
standard_scaler.scale_ # 标准差
X = standard_scaler.transform(X) # 标准化
X[:5]运行结果
array([[-0.90068117, 1.01900435, -1.34022653, -1.3154443 ], [-1.14301691, -0.13197948, -1.34022653, -1.3154443 ], [-1.38535265, 0.32841405, -1.39706395, -1.3154443 ], [-1.50652052, 0.09821729, -1.2833891 , -1.3154443 ], [-1.02184904, 1.24920112, -1.34022653, -1.3154443 ]])
注意:测试集如何使用归一化?
必须要使用训练集计算的均值和方差来归一化测试集,否则无法真正反映测试集的分布。
