【问题标题】:Normalization / Scaling as preprocessing step in python规范化/缩放作为python中的预处理步骤
【发布时间】:2018-09-06 22:46:37
【问题描述】:

我不确定该方法的确切名称是什么,但我会描述它,希望有人可以标记它并相应地修改问题。这是创建数据集的代码。

import numpy as np
import pandas as pd
from sklearn.datasets import make_classification

X, y = make_classification(n_samples=300,
                           n_features=6,
                           n_informative=4,
                           n_classes=2,
                           random_state=0,
                           shuffle=True,
                           shift  = 5,
                          scale = 10)

# Creating a dataFrame
df = pd.DataFrame({'Feature 1':X[:,0],
                                  'Feature 2':X[:,1],
                                  'Feature 3':X[:,2],
                                  'Feature 4':X[:,3],
                                  'Feature 5':X[:,4],
                                  'Feature 6':X[:,5],
                                  'Class':y})

df.describe()

我们以feature 2feature 4的输出为例来解释我的观点。

假设我们只有正值,如何使特征2和特征4根据它们的列值的范围在0到1之间。

让我进一步说明。 特征 2 和特征 4 的最小值将变为 0,最大值将变为 1。但是,从上面我们可以看到,特征 2 的最大值在 73 左右,特征 4 的最大值为 91。这个想法是为了表示变化在特征 2 上,73 到 71 是 0 到 1 值中较大的数字,然后是 91 到 89。虽然两者的变化差异相同,都是“2”,但由于它们的范围,特征的变化更显着2 与功能 4 相比,由于总体变化。

完成以下操作后,我们将创建一个表示新数据的新数据集。

这个想法是稍后根据值相对于列范围的变化来移除特征,而不是相对于整个数据集的变化幅度。

我希望这不会令人困惑。

【问题讨论】:

    标签: python pandas numpy scikit-learn


    【解决方案1】:

    我想您正在从sklearn.preprocessing 模块中寻找@​​987654321@。

    sklearn.preprocessing 模块包括缩放、居中、归一化、二值化和插补方法。

    如果您想“就地”重新缩放原始数据(即,用重新缩放的值替换原始值),那么您可以这样做:

    from sklearn.preprocessing import MinMaxScaler
    
    scaler = MinMaxScaler(copy=False)
    scaler.fit_transform(df['Feature 2'].values.reshape(-1, 1))
    scaler.fit_transform(df['Feature 4'].values.reshape(-1, 1))
    
    df[['Feature 2', 'Feature 4']].describe()
    

    输出:

            Feature 2   Feature 4
    count  300.000000  300.000000
    mean     0.563870    0.475371
    std      0.189137    0.179086
    min      0.000000    0.000000
    25%      0.439482    0.344611
    50%      0.566084    0.471282
    75%      0.695583    0.593683
    max      1.000000    1.000000
    

    【讨论】:

    • 你能不能把它应用到上面的例子中
    • @Victor,这很简单:mms = MinMaxScaler(); mms.fit_transform(df.filter(like='Feature'))
    • @MaxU 你得到一个 numpy 数组作为输出,如何将其视为数据框 :)
    【解决方案2】:

    演示:

    from sklearn.preprocessing import StandardScaler, MinMaxScaler
    
    mms = MinMaxScaler()
    
    df.loc[:, df.columns.str.contains('Feature')] = mms.fit_transform(df.filter(like='Feature'))
    

    产量:

    In [164]: df
    Out[164]:
         Class  Feature 1  Feature 2  Feature 3  Feature 4  Feature 5  Feature 6
    0        0   0.416385   0.666981   0.510885   0.530803   0.676278   0.443090
    1        0   0.556001   0.473475   0.401624   0.272491   0.376577   0.699309
    2        0   0.510970   0.617226   0.603038   0.449458   0.703408   0.388056
    3        1   0.674764   0.590244   0.639278   0.203411   0.594984   0.289978
    4        0   0.284630   0.707643   0.357078   0.653500   0.641764   0.484258
    5        0   0.487175   0.566235   0.469849   0.414133   0.550115   0.550655
    6        1   0.425064   0.354257   0.452126   0.625156   0.673901   0.641468
    7        0   0.412525   0.617383   0.446962   0.536107   0.651904   0.414641
    8        0   0.509887   0.382452   0.511992   0.556738   0.768706   0.291556
    9        0   0.580941   0.452781   0.534328   0.326482   0.518002   0.641739
    ..     ...        ...        ...        ...        ...        ...        ...
    290      0   0.728144   0.151289   0.692940   0.409269   0.834617   0.214392
    291      1   0.377372   0.169778   0.405410   0.776607   0.736210   0.732727
    292      0   0.519530   0.360764   0.503794   0.530192   0.723015   0.374990
    293      0   0.629286   0.444416   0.462688   0.194132   0.374052   0.675573
    294      1   0.660195   0.675694   0.675262   0.185723   0.575563   0.364423
    295      1   0.322941   0.489876   0.474006   0.746047   0.754077   0.643757
    296      0   0.460637   0.500117   0.236784   0.305325   0.240014   0.862539
    297      1   0.521527   0.326676   0.430562   0.455950   0.557530   0.616107
    298      0   1.000000   0.000000   1.000000   0.213472   0.979327   0.012098
    299      1   0.688809   0.602628   0.654906   0.184625   0.599433   0.262852
    
    [300 rows x 7 columns]
    

    缩放后:

    In [166]: df.describe()
    Out[166]:
                Class   Feature 1   Feature 2   Feature 3   Feature 4   Feature 5   Feature 6
    count  300.000000  300.000000  300.000000  300.000000  300.000000  300.000000  300.000000
    mean     0.500000    0.493667    0.563870    0.560114    0.475371    0.679344    0.451538
    std      0.500835    0.141253    0.189137    0.162298    0.179086    0.156490    0.176866
    min      0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000
    25%      0.000000    0.408848    0.439482    0.446708    0.344611    0.599389    0.317857
    50%      0.500000    0.495316    0.566084    0.557805    0.471282    0.704260    0.457312
    75%      1.000000    0.581756    0.695583    0.683460    0.593683    0.785408    0.571726
    max      1.000000    1.000000    1.000000    1.000000    1.000000    1.000000    1.000000
    

    【讨论】:

    • 谢谢!如何修改代码以将其应用于所有特征属性(特征 1...特征)而不在过滤器部分显式编写?
    • @Victor,您可以准备一个特征列列表并使用它,或者将您的 DF 分成两部分 - 一个只包含特征,第二个 - 您的目标 (Class)
    • 所以上面只是做了缩放?而不是规范化对吗?
    • @Victor,您可能需要检查different scalersNormalizer
    • @Victor,通常你可以在训练你的分类模型后看到它——系数最高和最低的特征通常贡献最大
    【解决方案3】:

    您可以通过 ctrl4ai

    包使用以下对数转换/归一化技术

    这将对倾斜/不对称的特征应用对数转换

    pip install ctrl4ai
    from ctrl4ai import preprocessing
    preprocessing.log_transform(dataset)
    
    
    Usage: [arg1]:[pandas dataframe],[method]=['yeojohnson'/'added_constant']
    Description: Checks if the a continuous column is skewed and does log transformation
    Returns: Dataframe [with all skewed columns normalized using appropriate approach]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-07
      • 2016-12-22
      • 2018-10-06
      • 1970-01-01
      • 2011-08-20
      相关资源
      最近更新 更多