如何用sklearn的MinMaxScaler实现全量数据整体归一化而非按列归一化
全局维度MinMaxScaler归一化实现方法
使用sklearn.preprocessing.MinMaxScaler做数据归一化时,若原始数据为4行2列的二维数组,默认配置会按每列单独计算归一化参数,导致两列归一化结果完全一致。若需要基于整个数据集的全局最大值、最小值做归一化,最终保留原有的2列结构,且不想采用先合并成一列、归一化后再拆分的方案,可参考以下实现:
初始默认实现(按列归一化)
from sklearn.preprocessing import MinMaxScaler data = [[-1, 2], [-0.5, 6], [0, 10], [1, 18]] scaler = MinMaxScaler() print(data) print(scaler.fit_transform(data))
输出结果:
[[-1, 2], [-0.5, 6], [0, 10], [1, 18]] [[0. 0. ] [0.25 0.25] [0.5 0.5 ] [1. 1. ]]
期望输出(全局归一化)
所有数值拉平计算归一化参数后,恢复原2列结构的结果:
[[0. , 0.15789474] [0.02631579, 0.36842105] [0.05263158, 0.57894737] [0.10526316, 1. ]]
实现方案
方案1:基于numpy直接计算,无维度转换开销
不需要做任何数组合并、拆分操作,直接基于原数组全局极值做广播运算,性能最优:
import numpy as np data = np.array([[-1, 2], [-0.5, 6], [0, 10], [1, 18]]) # 取全局最大最小值 data_min = data.min() data_max = data.max() # 直接按公式计算,自动保留原数组结构 scaled_data = (data - data_min) / (data_max - data_min) print(scaled_data)
方案2:复用MinMaxScaler接口的实现
如果需要用到MinMaxScaler的内置能力(比如反归一化inverse_transform),可使用numpy视图操作实现,不会产生额外数据拷贝,不属于显式的合并拆分操作:
from sklearn.preprocessing import MinMaxScaler import numpy as np data = np.array([[-1, 2], [-0.5, 6], [0, 10], [1, 18]]) scaler = MinMaxScaler() # reshape操作为视图操作,无数据复制开销 scaled_data = scaler.fit_transform(data.reshape(-1, 1)).reshape(data.shape) print(scaled_data)
反归一化调用方式:
origin_data = scaler.inverse_transform(scaled_data.reshape(-1, 1)).reshape(data.shape)
内容的提问来源于stack exchange,提问作者Pro
相关产品推荐
相关产品推荐

