利用Python进行数据归一化
归一化化定义:
归一化就是要把需要处理的数据经过处理后(通过某种算法)限制在你需要的一定范围内。
归一化方法有两种形式:
- 一种是把数变为(0,1)之间的小数
- 一种是把有量纲表达式变为无量纲表达式
一、归一到[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’