利用Python进行数据归一化

利用Python进行数据归一化

归一化化定义
归一化就是要把需要处理的数据经过处理后(通过某种算法)限制在你需要的一定范围内。

归一化方法有两种形式

  1. 一种是把数变为(0,1)之间的小数
  2. 一种是把有量纲表达式变为无量纲表达式

一、归一到[0,1]

class sklearn.preprocessing.MinMaxScaler(feature_range=(0, 1),
copy=True)

计算原理(参考sklearn官方文档):

X_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))
X_scaled = X_std * (max - min) + min

这里 min, max = feature_range。也就是你要归一化的范围,默认是(0,1),即min=0,max=1;
这里axis=0,表示MinMaxScaler方法默认是对每一列做这样的归一化操作,这也比较符合实际应用。

示例代码:

from sklearn import preprocessing
import numpy as np

x = np.array([[3., -1., 2., 613.],
              [2., 0., 0., 232],
              [0., 1., -1., 113],
              [1., 2., -3., 489]])

min_max_scaler = preprocessing.MinMaxScaler()
x_minmax = min_max_scaler.fit_transform(x)
print(x_minmax)
运行结果:
[[1.         0.         1.         1.        ]
 [0.66666667 0.33333333 0.6        0.238     ]
 [0.         0.66666667 0.4        0.        ]
 [0.33333333 1.         0.         0.752     ]]

注意:单独用在DataFrame某一列报错问题

背景:训练好xgboost模型后,对测试集的label进行预测,并将其归一化到(0,1)范围内,作为预测的概率。遇到以下情况:

#predict test set
dataset3_preds['label'] = model.predict(dataset3)
dataset3_preds.label = MinMaxScaler().fit_transform(dataset3_preds.label.reshape(-1,1))
运行结果:
AttributeError: 'Series' object has no attribute 'reshape'

试着去掉reshape运行:

#predict test set
dataset3_preds['label'] = model.predict(dataset3)
dataset3_preds.label = MinMaxScaler().fit_transform(dataset3_preds.label)
运行结果:
ValueError: Expected 2D array, got 1D array instead:
array=[-1.6797101   0.64954907 -2.3749304  ... -0.2589171  -0.5653752
 -0.26819348].
Reshape your data either using array.reshape(-1, 1) if your data has a single feature or array.reshape(1, -1) if it contains a single sample.

结果也不行。

出错的原因是Series没有reshape这个接口,而Series有values这个接口,
解决的办法是y调用values接口,然后调用values中的reshape方法。
如:

#predict test set
dataset3_preds['label'] = model.predict(dataset3)
dataset3_preds.label = MinMaxScaler().fit_transform(dataset3_preds.label.values.reshape(-1,1))

就可以正常运行。

二、归一到[-1,1]

(更多请参考sklearn官方文档)
示例代码:

from sklearn import preprocessing
import numpy as np
 
x = np.array([[3., -1., 2., 613.],
              [2., 0., 0., 232],
              [0., 1., -1., 113],
              [1., 2., -3., 489]])
max_abs_scaler = preprocessing.MaxAbsScaler()
x_train_maxsbs = max_abs_scaler.fit_transform(x)
x_train_maxsbs
运行结果:
array([[ 1.        , -0.5       ,  0.66666667,  1.        ],
       [ 0.66666667,  0.        ,  0.        ,  0.37846656],
       [ 0.        ,  0.5       , -0.33333333,  0.18433931],
       [ 0.33333333,  1.        , -1.        ,  0.79771615]])

参考博客:
[1]:数据归一化 - MinMaxScaler()/MaxAbsScaler() - Python代码
[2]: AttributeError: ‘Series’ object has no attribute ‘reshape’

你可能感兴趣的:(数据预处理,python)