You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于分布自动对多列数据做适配变换以完成聚类数据预处理

聚类特征自动适配变换方案

完全可以实现自动化的分布检测和对应变换,不需要手动处理200多列特征,核心逻辑是通过统计检验判定每个连续特征的分布类型,再自动匹配对应的预处理方法,具体实现如下:

实现逻辑

  • 特征筛选:优先过滤非连续数值类型的特征(如分类特征、时间特征等),这类特征不需要做分布类变换
  • 分布检测规则:
    • 幂律分布判定:使用KS检验拟合帕累托分布,p值高于预设阈值(通常取0.05)则判定为服从幂律分布
    • 高斯分布判定:使用Anderson-Darling检验做正态性校验,p值高于阈值则判定为近似高斯分布
    • 不符合上述两类的特征统一归类为未知分布
  • 变换匹配规则:
    • 幂律分布特征:优先使用log1p做对数变换,若存在负值则先加常数平移到所有值大于0后再做对数变换
    • 近似高斯分布特征:直接用StandardScaler做Z-score归一化即可
    • 未知分布特征:使用QuantileTransformer设置output_distribution='normal'做分位数变换,强制映射为近似正态分布

核心代码示例

import pandas as pd
import numpy as np
from scipy.stats import kstest, pareto, anderson
from sklearn.preprocessing import StandardScaler, QuantileTransformer

def auto_transform_features(df, p_threshold=0.05):
    # 仅筛选数值型特征
    numeric_cols = df.select_dtypes(include=[np.number]).columns.tolist()
    transformed_df = df.copy()
    transform_mapping = {}
    
    for col in numeric_cols:
        col_data = df[col].dropna()
        # 先检测幂律分布(帕累托分布)
        shape, loc, scale = pareto.fit(col_data)
        ks_stat, ks_p = kstest(col_data, 'pareto', args=(shape, loc, scale))
        if ks_p > p_threshold:
            # 幂律分布:对数变换
            min_val = col_data.min()
            offset = 0 if min_val > 0 else abs(min_val) + 1e-6
            transformed_df[col] = np.log1p(col_data + offset)
            transform_mapping[col] = ('log1p', {'offset': offset})
            continue
        
        # 检测高斯分布
        ad_result = anderson(col_data, dist='norm')
        # 取5%显著性水平对应的临界值判断
        if ad_result.statistic < ad_result.critical_values[2]:
            # 高斯分布:归一化
            scaler = StandardScaler()
            transformed_df[col] = scaler.fit_transform(col_data.values.reshape(-1,1)).flatten()
            transform_mapping[col] = ('standard_scaler', {'scaler': scaler})
            continue
        
        # 未知分布:分位数变换
        qt = QuantileTransformer(output_distribution='normal', random_state=42)
        transformed_df[col] = qt.fit_transform(col_data.values.reshape(-1,1)).flatten()
        transform_mapping[col] = ('quantile_transform', {'transformer': qt})
    
    return transformed_df, transform_mapping

实用建议

  • 分布检验的p值阈值可以根据实际场景调整,阈值越高分布判定越严格
  • 输出的transform_mapping可以保存下来,线上推理时直接复用对应变换规则,不需要重新检测分布
  • 如果业务侧有明确的特征含义要求,可以手动指定个别关键特征的变换规则,其余特征走自动化逻辑即可

内容的提问来源于stack exchange,提问作者lte__

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 15:18:02