规范化/缩放作为python中的预处理步骤

时间:2018-03-28 09:48:30

标签: python pandas numpy scikit-learn

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

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()

enter image description here

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

假设我们只有正值,如何根据列中值的范围在0到1的范围内制作要素2和要素4.

让我进一步说明。 特征2和特征4分钟值将变为0,最大值将为1.但是,从上面,我们可以看到特征2最大值大约为73,特征4最大值为91.想法是表示变化在特征2,73到71中,作为0到1值中的较大数字,然后是91到89.尽管两者具有相同的变化差异,即" 2",但由于它们的范围,变化由于总体变化,与特征4相比,在特征2中更为重要。

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

我们的想法是根据相对于列范围的值的变化而不是相对于整个数据集的变化幅度来删除要素。

我希望这不会令人困惑。

3 个答案:

答案 0 :(得分:2)

我想您正在寻找sklearn.preprocessing模块中的MinMaxScaler

  

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

答案 1 :(得分:0)

演示:

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

答案 2 :(得分:0)

您可以使用 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]