使用sklearn进行对数据标准化、归一化以及将数据还原

本文介绍了如何使用sklearn库进行数据的标准化和归一化处理,包括处理原理、具体实现步骤及还原方法,并提供了实例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在对模型训练时,为了让模型尽快收敛,一件常做的事情就是对数据进行预处理。

这里通过使用sklearn.preprocess模块进行处理。


一、标准化和归一化的区别

归一化其实就是标准化的一种方式,只不过归一化是将数据映射到了[0,1]这个区间中。

标准化则是将数据按照比例缩放,使之放到一个特定区间中。标准化后的数据的均值=0,标准差=1,因而标准化的数据可正可负。


二、使用sklearn进行标准化和标准化还原

原理:

即先求出全部数据的均值和方差,再进行计算。

最后的结果均值为0,方差是1,从公式就可以看出。

但是当原始数据并不符合高斯分布的话,标准化后的数据效果并不好。


导入模块

from sklearn.preprocessing import StandardScaler
from sklearn.preprocessing import MinMaxScaler
from matplotlib import gridspec
import numpy as np
import matplotlib.pyplot as plt


通过生成随机点可以对比出标准化前后的数据分布形状并没有发生变化,只是尺度上缩小了。

cps = np.random.random_integers(0, 100, (100, 2))

ss = StandardScaler()
std_cps = ss.fit_transform(cps)

gs = gridspec.GridSpec(5,5)
fig = plt.figure()
ax1 = fig.add_subplot(gs[0:2, 1:4])
ax2 = fig.add_subplot(gs[3:5, 1:4])

ax1.scatter(cps[:, 0], cps[:, 1])
ax2.scatter(std_cps[:, 0], std_cps[:, 1])

plt.show()

sklearn.preprocess.StandardScaler的使用:

先是创建对象,然后调用fit_transform()方法,需要传入一个如下格式的参数作为训练集。

X : numpy array of shape [n_samples,n_features]Training set.
data = np.random.uniform(0, 100, 10)[:, np.newaxis]
ss = StandardScaler()
std_data = ss.fit_transform(data)
origin_data = ss.inverse_transform(std_data)
print('data is ',data)
print('after standard ',std_data)
print('after inverse ',origin_data)
print('after standard mean and std is ',np.mean(std_data), np.std(std_data))
通过invers_tainsform()方法就可以得到原来的数据。

打印结果如下:

可以看到生成的数据的标准差是1,均值接近0。

data is  [[15.72836992]
 [62.0709697 ]
 [94.85738359]
 [98.37108557]
 [ 0.16131774]
 [23.85445883]
 [26.40359246]
 [95.68204855]
 [77.69245742]
 [62.4002485 ]]
after standard  [[-1.15085842]
 [ 0.18269178]
 [ 1.12615048]
 [ 1.22726043]
 [-1.59881442]
 [-0.91702287]
 [-0.84366924]
 [ 1.14988096]
 [ 0.63221421]
 [ 0.19216708]]
after inverse  [[15.72836992]
 [62.0709697 ]
 [94.85738359]
 [98.37108557]
 [ 0.16131774]
 [23.85445883]
 [26.40359246]
 [95.68204855]
 [77.69245742]
 [62.4002485 ]]
after standard mean and std is  -1.8041124150158794e-16 1.0

三、使用sklearn进行数据的归一化和归一化还原

原理:

从上式可以看出归一化的结果跟数据的最大值最小值有关


使用时类似上面的标准化

data = np.random.uniform(0, 100, 10)[:, np.newaxis]
mm = MinMaxScaler()
mm_data = mm.fit_transform(data)
origin_data = mm.inverse_transform(mm_data)
print('data is ',data)
print('after Min Max ',mm_data)
print('origin data is ',origin_data)

结果:

G:\Anaconda\python.exe G:/python/DRL/DRL_test/DRL_ALL/Grammar.py
data is  [[12.19502214]
 [86.49880021]
 [53.10501326]
 [82.30089405]
 [44.46306969]
 [14.51448347]
 [54.59806596]
 [87.87501465]
 [64.35007178]
 [ 4.96199642]]
after Min Max  [[0.08723631]
 [0.98340171]
 [0.58064485]
 [0.93277147]
 [0.47641582]
 [0.11521094]
 [0.59865231]
 [1.        ]
 [0.71626961]
 [0.        ]]
origin data is  [[12.19502214]
 [86.49880021]
 [53.10501326]
 [82.30089405]
 [44.46306969]
 [14.51448347]
 [54.59806596]
 [87.87501465]
 [64.35007178]
 [ 4.96199642]]

Process finished with exit code 0


其他标准化的方法:

上面的标准化和归一化都有一个缺点就是每当来一个新的数据的时候就要重新计算所有的点。

因而当数据是动态的时候可以使用下面的几种计算方法:

1、arctan反正切函数标准化:


2、ln函数标准化


<think>嗯,用户想用Python实现数据归一化和反归一化的代码,主要是在机器学习预处理使用。首先,我得回忆一下数据归一化的常见方法,比如Min-Max和Z-Score标准化。这两种方法在sklearn里都有现成的模块,比如MinMaxScaler和StandardScaler。用户可能需要具体的代码示例,所以得展示如何导入这些类,拟合数据,转换数据,以及如何转换。 然后,用户提到反归一化,也就是将处理后的数据还原回原始范围。这时候需要用到scaler的inverse_transform方法。得确保在代码示例中展示这一步,特别是在预测后如何将结果转换回去。比如在训练模型时,先归一化特征,预测后再将输出反归一化。 接下来,用户可能需要了解什么时候用归一化,什么时候用标准化。这里得参考引用中的内容,比如引用2提到根据数据分布和算法需求选择方法。例如,Min-Max适合范围固定的数据,而Z-Score适合存在异常值的情况。要结合引用里的信息,给出建议。 还要注意代码的实用性,比如展示完整的流程:从数据生成,到归一化,训练模型,预测,再反归一化结果。这样用户能清楚整个流程。另外,可能需要提醒用户,分类特征和数值特征的处理顺序,比如引用3提到先处理分类特征还是先标准化,但用户的问题主要针对数值的归一化,所以可以简要提到预处理步骤的顺序。 最后,生成相关问题,要围绕数据预处理的其他方法、选择归一化方法的因素、反归一化的应用场景,以及深度学习中的归一化应用。这些问题需要自然,并且能引导用户进一步学习相关内容。确保引用标记正确,比如引用1和引用2的相关内容。</think>### 数据归一化与反归一化Python实现 #### 一、数据归一化 数据归一化是机器学习预处理的关键步骤,用于消除量纲差异,提升模型收敛速度和精度[^1]。以下是两种常用方法的Python实现: ##### 1. Min-Max归一化(线性归一化) $$x_{\text{norm}} = \frac{x - x_{\min}}{x_{\max} - x_{\min}}$$ ```python from sklearn.preprocessing import MinMaxScaler import numpy as np # 生成示例数据 data = np.array([[30, 50000], [40, 80000], [25, 30000]], dtype=np.float32) # 创建归一化器并拟合数据 scaler = MinMaxScaler(feature_range=(0, 1)) # 默认0-1范围 scaler.fit(data) normalized_data = scaler.transform(data) print("归一化数据:\n", normalized_data) ``` ##### 2. Z-Score标准化 $$x_{\text{std}} = \frac{x - \mu}{\sigma}$$ ```python from sklearn.preprocessing import StandardScaler scaler = StandardScaler() scaler.fit(data) standardized_data = scaler.transform(data) print("标准化数据:\n", standardized_data) ``` #### 二、反归一化实现 反归一化用于将处理后的数据还原到原始范围,特别是在预测结果需要原始量纲时[^2]: ```python # 接续Min-Max归一化示例 original_data = scaler.inverse_transform(normalized_data) print("反归一化数据:\n", original_data) ``` #### 三、完整应用示例 ```python from sklearn.linear_model import LinearRegression # 生成数据集 X = np.random.rand(100, 3) * 100 # 特征矩阵 y = np.dot(X, [2.5, -1.8, 3.2]) + np.random.normal(0, 5, 100) # 目标值 # 数据预处理 feature_scaler = MinMaxScaler() target_scaler = MinMaxScaler() X_scaled = feature_scaler.fit_transform(X) y_scaled = target_scaler.fit_transform(y.reshape(-1, 1)) # 建模预测 model = LinearRegression() model.fit(X_scaled, y_scaled) y_pred_scaled = model.predict(X_scaled) # 结果反归一化 y_pred = target_scaler.inverse_transform(y_pred_scaled) ``` #### 四、方法选择建议 1. **Min-Max归一化**适合数据分布有明确边界的情况(如图像像素值) 2. **Z-Score标准化**更适合存在异常值的数据集 3. 对需要保持稀疏性的数据(如文本处理),可考虑最大绝对值缩放
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值