美文网首页
归一化、标准化、正则化、白化等等

归一化、标准化、正则化、白化等等

作者: 赤色要塞满了 | 来源:发表于2022-10-18 22:48 被阅读0次

    由于翻译、以讹传讹以及一些巧合,这几个概念有点乱,尝试整理一下。

    1. 归一化Normalization

    有的翻译成正常化,可以理解,但翻译成标准化就离谱了。英文本身倒是没有,但从效果来看,做到了归一。能够归到0~1范围的,都可以叫做广义的归一化。

    1.1 区间缩放

    也叫缩放归一化,很好理解,x' = (x-min)/(max-min),显然区间映射到了[0, 1]

    from sklearn.preprocessing import MinMaxScaler
    
    MinMaxScaler().fit_transform(my_data)
    

    也可以使用pandas的操作:

    df = (df - df.min()) / (df.max() - df.min())
    

    1.2 狭义归一化normailize

    一般对行向量进行操作,使之成为单位向量。

    from sklearn.preprocessing import Normalizer
    
    Normalizer().fit_transform(my_data)
    

    处理成DataFrame,可以验证一下:

    df.apply(lambda row: sum(row**2), axis=1) # 全等于1
    

    2. 标准化Standardization

    一般指Z-score标准化,是按照每列进行处理的,x' = (x-x.mean())/x.std(),因为出现了标准差吧,所以叫标准化。减去均值把数据都移到了0周围,除以标准差(代表数据的差异幅度),消除了自身特征的尺度,各个维度的特征一视同仁,并且把太挤的散开,太散的聚起来。标准化后的数据均值为0,标准差为1。如果本身是正态分布的话,标准化后就变成标准正太分布。

    from sklearn.preprocessing import StandardScaler
    
    StandardScaler().fit_transform(my_data)
    

    也可以使用pandas的操作,注意样本标准差的区别:

    # 默认为样本标准差ddof=1, 计算整体标准差, 可令ddof=0
    df = (df - df.mean())/df.std(ddof=0)
    

    也有叫做标准差归一化的,个人觉得不妥,因为根本没有归到一。

    3. 正则化Regularization

    这其实不属于数据的预处理,可以认为所有减小过拟合的手段都叫做正则化,比如损失函数里增加一个L2范数正则项。混乱的原因猜测如下:

    • 范数的英文叫norm,这跟归一化normalization很像。
    • 深度学习的批量归一化Batch Normalization,是一种很重要的正则化方法。
    • 正态分布的正态叫normal,切记:标准化之后不一定是正态分布。

    4. 白化Whitening

    主要是消除特征间的相关性,比之前的稍微复杂一些,以PCA白化为例。首先作主成分分析PCA,分离出方差大但互相不相关的特征,降维,把topK不相关的成分,作为新的特征,然后把原数据映射到新的特征空间上。

    from sklearn.decomposition import PCA
    
    K = 5
    pca = PCA(n_components=K, whiten=True)
    result = pca.fit_transform(my_data)
    

    另有ZCA白化,不展开了。

    5. 其它

    5.1 离散化

    最简单的二值化:

    from sklearn.preprocessing import Binarizer
    
    Binarizer(threshold=3).fit_transform(my_data)
    

    可以用KBinsDiscretizer进行离散化,也可以用pandascut或者qcut进行分箱。

    5.2 独热化

    就是把值改成独热编码one-hot,操作的时候注意,只对值比较少的列进行操作,不然一下子挤爆内存,可以统计一下频率,只对前几名进行编码,其它的统一给一个other的分类。

    from sklearn.preprocessing import OneHotEncoder
    
    OneHotEncoder().fit_transform(my_data.reshape((-1,1)))
    # <... in Compressed Sparse Row format>
    

    还可以使用pd.get_dummies进行独热化。

    5.3 多值化

    相对于独热化,可以叫做multi-hot,也是形成0-1矩阵,这个没有直接的方法,需要多步操作。

    import pandas as pd
    
    df = pd.DataFrame([[1, 'a,b'], [2, 'b,c'], [3, 'a,c,d']],
                      columns=['num', 'types'])
    
    # 统计出所有类型
    all_types = []
    for x in df.types:
        all_types.extend(x.split(','))
    unique_types = pd.unique(all_types)
    
    # 构造矩阵,遍历赋值
    dummies = pd.DataFrame(np.zeros((len(df), len(unique_types))),
                           columns=unique_types)
    for i, type_ in enumerate(df.types):
        indices = dummies.columns.get_indexer(type_.split(','))
        dummies.iloc[i, indices] = 1
    df = df.join(dummies.add_prefix('type_'))
    

    效果如下:


    image.png

    相关文章

      网友评论

          本文标题:归一化、标准化、正则化、白化等等

          本文链接:https://www.haomeiwen.com/subject/jxhszrtx.html