如何将特征映射至[0,-1]或[-1,1]范围?含Python/sklearn实现方案
特征缩放:缩放到[0,1]和[-1,1]范围的实用方法
嘿,关于特征缩放到固定范围的需求,我在日常机器学习建模里经常遇到,下面给你拆解手动公式和Python生态里的简便实现,都是实战中常用的方案~
一、先搞懂核心公式
首先得明确两个场景的基础公式,不过要提前说:这些公式更适合数据分布均匀、没有极端离群值的情况,如果有大量 outliers,建议先做异常值处理,不然缩放效果会打折扣。
1. 缩放到[0,1](经典Min-Max缩放)
这个是最常用的,公式非常直观:
scaled_value = (x - 列最小值) / (列最大值 - 列最小值)
通过把数据减去最小值,再除以极差(最大值减最小值),就能把所有数据压缩到0到1之间。
2. 缩放到[-1,1]
在Min-Max缩放的基础上做个线性变换就行:
scaled_value = 2 * ((x - 列最小值) / (列最大值 - 列最小值)) - 1
先把数据拉到[0,1],再通过乘2减1,把范围平移拉伸到[-1,1]。
二、Python里的简便实现
1. Scikit-learn(最推荐,适配机器学习工作流)
sklearn的MinMaxScaler专门干这个,而且能完美适配训练-测试集的缩放逻辑,避免数据泄露:
缩放到[0,1]
from sklearn.preprocessing import MinMaxScaler import numpy as np # 示例数据:2个样本,3个特征列 data = np.array([[1, 2, 3], [4, 5, 6]]) # 初始化缩放器,指定范围[0,1] scaler = MinMaxScaler(feature_range=(0, 1)) # 拟合训练数据并完成缩放 scaled_data = scaler.fit_transform(data) print(scaled_data) # 输出:[[0. 0. 0.] # [1. 1. 1.]]
缩放到[-1,1]
只需要修改feature_range参数,其他逻辑完全一样:
scaler = MinMaxScaler(feature_range=(-1, 1)) scaled_data = scaler.fit_transform(data) print(scaled_data) # 输出:[[-1. -1. -1.] # [ 1. 1. 1.]]
重点:后续处理测试数据时,直接用scaler.transform(test_data)就行,不用重新拟合,这样能保证训练和测试集用的是同一套min/max规则,这是机器学习里的关键细节!
2. Numpy手动实现(灵活定制场景)
如果不想依赖sklearn,用Numpy几行代码就能搞定,适合需要自定义逻辑的情况:
缩放到[0,1]
import numpy as np data = np.array([[1, 2, 3], [4, 5, 6]]) # 按特征列计算最小值和最大值 min_vals = np.min(data, axis=0) max_vals = np.max(data, axis=0) # 计算缩放后的数据 scaled_data_01 = (data - min_vals) / (max_vals - min_vals) print(scaled_data_01)
缩放到[-1,1]
基于上面的结果做个变换:
scaled_data_neg1_pos1 = 2 * scaled_data_01 - 1 print(scaled_data_neg1_pos1)
这种方式适合你只需要对特定列缩放,或者要和其他数据处理步骤结合的场景。
小提醒
- 如果数据里有极端离群值,Min-Max缩放会把大部分数据挤在很小的区间里,这时候可以先对离群值做截断(比如用95%分位数代替超出部分),或者改用
RobustScaler(基于中位数和四分位数的缩放,对离群值更鲁棒)。 - 永远不要用测试集的min/max来缩放训练集,一定要用训练集拟合的参数去变换测试集,不然会影响模型的泛化能力。
内容的提问来源于stack exchange,提问作者Teodorico Levoff
相关产品推荐
相关产品推荐

