除Min-Max Normalization、Quantile Transformation外,有哪些[0,1]区间的数据缩放方法?
可将特征缩放到[0,1]区间的其他数据缩放方法
除了你提到的Min-Max归一化和分位数变换,还有几种实用方法能把特征压缩到[0,1]区间,适配不同的数据分布场景:
截断后再做Min-Max归一化
如果数据集存在极端异常值,直接用Min-Max会让大部分数据集中在极小区间。可以先把特征值截断到指定分位数范围(比如0.01到0.99分位数),将超出范围的极端值限制在边界上,之后再用常规Min-Max缩放到[0,1],能弱化异常值干扰,保留大部分数据的区分度。示例代码:import numpy as np # 确定截断边界 lower_bound = np.quantile(feature, 0.01) upper_bound = np.quantile(feature, 0.99) # 截断特征值 clipped_feature = np.clip(feature, lower_bound, upper_bound) # 缩放到[0,1] scaled_feature = (clipped_feature - clipped_feature.min()) / (clipped_feature.max() - clipped_feature.min())对数变换+Min-Max归一化
针对右偏分布的特征(比如用户消费金额、点击量这类数据),先做对数变换拉平分布,再用Min-Max把结果缩到[0,1]。如果特征有0值,用log1p(即log(x+1))避免计算错误。示例:import numpy as np # 对数变换 log_transformed = np.log1p(feature) # 缩放至[0,1] scaled_feature = (log_transformed - log_transformed.min()) / (log_transformed.max() - log_transformed.min())Sigmoid映射
Sigmoid函数能把任意实数映射到(0,1)区间,近似满足[0,1]需求。直接用原始特征的话极端值会被压到极接近0或1的位置,建议先做标准化(减均值除以标准差)再转换。示例:from scipy.special import expit # 标准化特征 standardized = (feature - feature.mean()) / feature.std() # 用sigmoid映射到(0,1) scaled_feature = expit(standardized)反双曲正弦变换+Min-Max归一化
和对数变换类似,但反双曲正弦(arcsinh)能处理包含0和负值的特征,适合重尾分布数据。变换后用Min-Max缩放到[0,1]即可,numpy里直接用np.arcsinh就能实现。
内容的提问来源于stack exchange,提问作者Jacob Issac
相关产品推荐
相关产品推荐

