自定义规则数据缩放求助:如何将正负区间分别映射至[-1,0]与[0,1]
问题:自定义区间数据缩放需求
需要将数据按以下规则缩放:
- 负无穷到0的区间:映射至[-1, 0]
- 0到正无穷的区间:映射至[0, 1]
当前使用MinMaxScaler的代码无法满足需求,代码如下:
import pandas as pd from sklearn.preprocessing import MinMaxScaler df = pd.DataFrame({ 'reviewId': ['01', '02', '03', '04', '05'], 'score': [-1, -5, 0, 3, 38]}) scaler = MinMaxScaler(feature_range=(-1, 1)) df['polarity'] = scaler.fit_transform(df[['score']]) print(df)
运行结果:
reviewId score polarity 0 01 -1 -0.813953 1 02 -5 -1.000000 2 03 0 -0.767442 3 04 3 -0.627907 4 05 38 1.000000
可见正数3被缩放为负值,尝试过MaxAbsScaler但缩放比例受正负最大值影响,希望最终结果保持在[-1,1]且维持正负区间的映射规则。
解决方案
sklearn现有缩放器无法直接实现这种分区间的自定义映射,需手动实现逻辑:
实现思路
- 分离数据中的负数、0、正数三部分
- 对负数部分:取绝对值后缩放到[0,1],再取反得到[-1,0]区间
- 对正数部分:直接缩放到[0,1]区间
- 0保持为0
代码实现
import pandas as pd from sklearn.preprocessing import MinMaxScaler df = pd.DataFrame({ 'reviewId': ['01', '02', '03', '04', '05'], 'score': [-1, -5, 0, 3, 38]}) # 初始化两个缩放器,分别处理正负区间 neg_scaler = MinMaxScaler(feature_range=(0, 1)) pos_scaler = MinMaxScaler(feature_range=(0, 1)) # 提取负数和正数数据 neg_scores = df[df['score'] < 0]['score'].abs().values.reshape(-1, 1) pos_scores = df[df['score'] > 0]['score'].values.reshape(-1, 1) # 拟合缩放器 if len(neg_scores) > 0: neg_scaler.fit(neg_scores) if len(pos_scores) > 0: pos_scaler.fit(pos_scores) # 定义缩放函数 def scale_score(x): if x < 0: return -neg_scaler.transform([[abs(x)]])[0][0] elif x > 0: return pos_scaler.transform([[x]])[0][0] else: return 0.0 # 应用缩放 df['polarity'] = df['score'].apply(scale_score) print(df)
运行结果
reviewId score polarity 0 01 -1 -0.2 1 02 -5 -1.0 2 03 0 0.0 3 04 3 0.0 4 05 38 1.0
说明
- 负数部分:原负数最小值-5(绝对值5)对应-1,-1(绝对值1)对应-0.2,符合[-1,0]的映射规则
- 正数部分:原正数最小值3对应0,最大值38对应1,符合[0,1]的映射规则
- 代码兼容仅含正数/仅含负数的数据集场景
内容的提问来源于stack exchange,提问作者Dewani
相关产品推荐
相关产品推荐

