【python】数据预处理:分位数归一化 Quantile Normalization + INSCODE AI创作助手测试

慈云数据 2024-03-13 技术支持 121 0

文章目录

  • 写在前面
  • 标准化/归一化
    • z-score标准化示例
    • python模块qnorm实现分位数归一化
    • R代码实现分位数归一化
    • 分位数归一化 - NSCODE AI创作助手的回答
      • *Q1:Quantile Normalization是什么?*
      • *Q2-1: 什么时候用Quantile normalization?*
      • *Q2-2: 什么时候做Quantile normalization?*
      • *Q3:为什么要做Quantile Normalization?*
      • *Q4-1: 如何做Quantile normalization?*
      • *Q4-2: 如何用python做Quantile Normalization?*
      • 可视化分位数归一化处理前后发生的变化
      • 什么时候该用/不该用分位数归一化
      • 其他ChatGPT测试

        写在前面

        这里主要了解一下分位数归一化(Quantile Normalization, QN)。如无特殊说明时,本文中的QN作为分位数归一化的缩写。

        Quantile Normalization 直接翻译是 分位数归一化,但也有翻译为分位数标准化。笔者理解是按直译叫分位数归一化,但是按数据的处理方式,应该叫分位数标准化,按英文的话就一种:Quantile Normalization。之所以有标准化和归一化两种说法,是因为它们是两种不同的处理方式。

        本文暂统一名称叫分位数归一化(QN)。

        Quantile Normalization 定义来自如下文献:

        在这里插入图片描述

        标准化/归一化

        标准化(standardization)、归一化(normalization)两者总是被混着叫,实际是在做什么处理呢?

        先看下Python库中的关于预处理的一些包:

        在这里插入图片描述

        其中包括了:scaling(缩放), centering(中心化), normalization(归一化), binarization(二值化)。

        对于标准化和归一化对应的常用的模块:

        • 标准化 standardization:py模块 StandardScaler 是常用的标准化数据处理,对应z-score标准化公式: z = x − μ s z=\frac{x-\mu}{s} z=sx−μ​(其中, μ \mu μ是训练样本的均值, s s s是训练样本的标准差)。将原始数据转换为均值为0,方差为1的新数据,也是把数据缩放(scaling)到特定区间上。该处理从公式计算上解读为:当前数据比总体均值多了几个标准差;从数据整体上解读为:把原数据标准化缩放为服从标准正态分布的数据。

        • 归一化 normalization:py模块 MinMaxScaler是比较常用的归一化方法:min-max归一化, x ∗ = x i − x m i n x m a x − x m i n x^*=\frac{x_i− x_{min}}{x_{max} − x_{min}} x∗=xmax​−xmin​xi​−xmin​​。

          z-score标准化示例

          # sklear包中的zscore
          from sklearn.preprocessing import StandardScaler
          data = [[0, 0], [0, 0], [1, 1], [1, 1]]
          scaler = StandardScaler()
          print(scaler.fit(data))
          scaler.fit_transform(data)
          

          使用scipy包中的zscore,对dataframe数据直接进行zscore标准,好处是标准化后的index/columns还在,而使用sklear的标准化处理后,返回的是数组array。[chatGPT]:

          import pandas as pd
          from scipy.stats import zscore
          # 创建训练数据的示例DataFrame
          train_data = {'A': [1, 2, 3, 4, 5],
                        'B': [10, 20, 30, 40, 50],
                        'C': [100, 200, 300, 400, 500]}
          train_df = pd.DataFrame(train_data)
          # 创建测试数据的示例DataFrame
          test_data = {'A': [6, 7, 8, 9, 10],
                       'B': [60, 70, 80, 90, 100],
                       'C': [600, 700, 800, 900, 1000]}
          test_df = pd.DataFrame(test_data)
          # 对训练数据进行Z-score标准化
          train_df_standardized = train_df.apply(zscore)
          # 使用训练数据的均值和标准差对测试数据进行标准化(注意使用训练数据的统计量)
          test_df_standardized = (test_df - train_df.mean()) / train_df.std()
          print("训练数据标准化结果:")
          print(train_df_standardized)
          print("\n测试数据标准化结果:")
          print(test_df_standardized)
          

          python模块qnorm实现分位数归一化

          仔细看Python的sklearn库中(# 标准化/归一化 部分的截图),会发现这里没有分位数归一化的包。是的,sklearn里没有QN。需要先安装qnorm(qnorm安装包官网),安装命令为:pip install qnorm。使用示例如下:

          import pandas as pd
          import qnorm
          df = pd.DataFrame({'C1': {'A': 5, 'B': 2, 'C': 3, 'D': 4},
                             'C2': {'A': 4, 'B': 1, 'C': 4, 'D': 2},
                             'C3': {'A': 3, 'B': 4, 'C': 6, 'D': 8}})
          print(qnorm.quantile_normalize(df, axis=1))
          

          执行后可得到:

          在这里插入图片描述

          R代码实现分位数归一化

          最初测试使用了R代码,在“INSCODE AI创作助手”助手的默认实现方式中也使用了R。(做分位数归一化处理可能用R的比较多)

          代码中使用到R包preprocessCore:

          df 'C1': {'A': 5, 'B': 2, 'C': 3, 'D': 4},
                             'C2': {'A': 6, 'B': 1, 'C': 7, 'D': 9},
                             'C3': {'A': 3, 'B': 4, 'C': 6, 'D': 8}})
          dfn1 = qnorm.quantile_normalize(df1, axis=1)
          df2 = pd.DataFrame({'C1': {'A': 5, 'B': 2, 'C': 3, 'D': 4},
                             'C2': {'A': 4, 'B': 1, 'C': 4, 'D': 2},
                             'C3': {'A': 3, 'B': 4, 'C': 6, 'D': 8}})
          dfn2 = qnorm.quantile_normalize(df2, axis=1)
          df3 = pd.DataFrame({'C1': {'A': 5, 'B': 2, 'C': 3, 'D': 4},
                             'C2': {'A': 4, 'B': 1, 'C': 4, 'D': 4},
                             'C3': {'A': 3, 'B': 4, 'C': 6, 'D': 8}})
          dfn3 = qnorm.quantile_normalize(df3, axis=1)
          'font.size':5})
          i = 0
          for df, dfn in zip([df1, df2, df3], [dfn1, dfn2, dfn3]):
              axs[i, 0].scatter(range(len(df.T['A'])), df.T['A'], label='A')
              axs[i, 0].scatter(range(len(df.T['B'])), df.T['B'], label='B')
              axs[i, 0].scatter(range(len(df.T['C'])), df.T['C'], label='C')
              axs[i, 0].scatter(range(len(df.T['D'])), df.T['D'], label='D')
              axs[i, 0].legend(loc='upper left', shadow=True)
              axs[i, 0].set_xticks([0, 1, 2], [1, 2, 3])
              axs[i, 1].scatter(range(len(dfn.T['A'])), dfn.T['A'])
              axs[i, 1].scatter(range(len(dfn.T['B'])), dfn.T['B'])
              axs[i, 1].scatter(range(len(dfn.T['C'])), dfn.T['C'])
              axs[i, 1].scatter(range(len(dfn.T['D'])), dfn.T['D'])
              axs[i, 1].set_xticks([0, 1, 2], [1, 2, 3])
              i += 1
              
          fig.tight_layout()
          plt.show()
          
微信扫一扫加客服

微信扫一扫加客服

点击启动AI问答
Draggable Icon