在sklean的预处理方法中主要有三种,每一种都有函数方法和类方法两种使用方法:
归一化-标准化:normalize()函数/Normalizer()类
区间缩放-调整尺度: minmax_scale函数/MinMaxScaler()类
正态化:scale()函数/StandardScaler()类
将每一行数据的向量模长(欧氏距离)处理成1.
方法一:normalize()函数
from sklearn.datasets import load_boston
from sklearn.preprocessing import normalize
from numpy import set_printoptions
import numpy as np
set_printoptions(precision=3)
boston = load_boston()
data, target = boston.data, boston.target
print('-' * 20 + '预处理前' + '-' * 20)
print('前三个数据(前三行数据)的模长:', np.linalg.norm(data, ord=None, axis=1)[:3])
new_data = normalize(data)
print('-' * 20 + '预处理后' + '-' * 20)
print('前三个数据(前三行数据)的模长:', np.linalg.norm(new_data, ord=None, axis=1)[:3])
输出:
--------------------预处理前--------------------
前三个数据(前三行数据)的模长: [500.046 472.059 465.914]
--------------------预处理后--------------------
前三个数据(前三行数据)的模长: [1. 1. 1.]
方法二:Normalizer()类
from sklearn.datasets import load_boston
from sklearn.preprocessing import Normalizer
from numpy import set_printoptions
import numpy as np
set_printoptions(precision=3)
boston = load_boston()
data, target = boston.data, boston.target
print('-' * 20 + '预处理前' + '-' * 20)
print('前三个数据(前三行数据)的模长:', np.linalg.norm(data, ord=None, axis=1)[:3])
new_data = Normalizer().fit_transform(data)
# 也可以分开写成:
# my_normalize = Normalizer()
# new_data = my_normalize.fit_transform(data)
print('-' * 20 + '预处理后' + '-' * 20)
print('前三个数据(前三行数据)的模长:', np.linalg.norm(new_data, ord=None, axis=1)[:3])
输出:
--------------------预处理前--------------------
前三个数据(前三行数据)的模长: [500.046 472.059 465.914]
--------------------预处理后--------------------
前三个数据(前三行数据)的模长: [1. 1. 1.]
这里求得模长是欧氏距离,也是L2范数,可参照博客:
python求向量模长-L1范数/L2范数/无穷范数
将不同计量单位的数据统一成相同的尺度单位,将数据最大值和最小值调整到一个统一的范围内:
例如:以boston数据集为例
方法一:minmax_scale函数
from sklearn.datasets import load_boston
from sklearn.preprocessing import minmax_scale
from numpy import set_printoptions
set_printoptions(precision=3)
boston = load_boston()
data, target = boston.data, boston.target
print('-' * 20 + '预处理前' + '-' * 20)
print('前三个特征的最大值:', data[:, :3].max(axis=0))
print('前三个特征的最小值:', data[:, :3].min(axis=0))
new_data = minmax_scale(data, feature_range=(0, 1)) # 默认(0, 1)
print('-' * 20 + '预处理后' + '-' * 20)
print('前三个特征的最大值:', new_data[:, :3].max(axis=0))
print('前三个特征的最小值:', new_data[:, :3].min(axis=0))
输出:
--------------------预处理前--------------------
前三个特征的最大值: [88.976 100. 27.74 ]
前三个特征的最小值: [0.006 0. 0.46 ]
--------------------预处理后--------------------
前三个特征的最大值: [1. 1. 1.]
前三个特征的最小值: [0. 0. 0.]
方法二:MinMaxScaler()类
from sklearn.datasets import load_boston
from sklearn.preprocessing import MinMaxScaler
from numpy import set_printoptions
set_printoptions(precision=3)
boston = load_boston()
data, target = boston.data, boston.target
print('-' * 20 + '预处理前' + '-' * 20)
print('前三个特征的最大值:', data[:, :3].max(axis=0))
print('前三个特征的最小值:', data[:, :3].min(axis=0))
transform = MinMaxScaler(feature_range=(0, 1)) # 默认(0, 1)
new_data = transform.fit_transform(data)
print('-' * 20 + '预处理后' + '-' * 20)
print('前三个特征的最大值:', new_data[:, :3].max(axis=0))
print('前三个特征的最小值:', new_data[:, :3].min(axis=0))
输出:
--------------------预处理前--------------------
前三个特征的最大值: [88.976 100. 27.74 ]
前三个特征的最小值: [0.006 0. 0.46 ]
--------------------预处理后--------------------
前三个特征的最大值: [1. 1. 1.]
前三个特征的最小值: [0. 0. 0.]
将数据处理为高斯分布,处理后的数据满足均值为0,方差为1.
第一种方法:scale()函数
from sklearn.datasets import load_boston
from sklearn.preprocessing import scale
from numpy import set_printoptions
set_printoptions(precision=3)
boston = load_boston()
data, target = boston.data, boston.target
print('-' * 20 + '预处理前' + '-' * 20)
print('前三个特征的均值:', data[:, :3].mean(axis=0))
print('前三个特征的方差:', data[:, :3].std(axis=0))
new_data = scale(data)
print('-' * 20 + '预处理后' + '-' * 20)
print('前三个特征的均值:', new_data[:, :3].mean(axis=0))
print('前三个特征的方差:', new_data[:, :3].std(axis=0))
输出:
--------------------预处理前--------------------
前三个特征的均值: [ 3.594 11.364 11.137]
前三个特征的方差: [ 8.588 23.299 6.854]
--------------------预处理后--------------------
前三个特征的均值: [ 6.341e-17 -6.343e-16 -2.683e-15]
前三个特征的方差: [1. 1. 1.]
第二种方法:StandardScaler()类
from sklearn.datasets import load_boston
from sklearn.preprocessing import StandardScaler
from numpy import set_printoptions
set_printoptions(precision=3)
boston = load_boston()
data, target = boston.data, boston.target
print('-' * 20 + '预处理前' + '-' * 20)
print('前三个特征的均值:', data[:, :3].mean(axis=0))
print('前三个特征的方差:', data[:, :3].std(axis=0))
my_scale = StandardScaler()
new_data = my_scale.fit_transform(data)
print('-' * 20 + '预处理后' + '-' * 20)
print('前三个特征的均值:', new_data[:, :3].mean(axis=0))
print('前三个特征的方差:', new_data[:, :3].std(axis=0))
输出:
--------------------预处理前--------------------
前三个特征的均值: [ 3.594 11.364 11.137]
前三个特征的方差: [ 8.588 23.299 6.854]
--------------------预处理后--------------------
前三个特征的均值: [ 6.341e-17 -6.343e-16 -2.683e-15]
前三个特征的方差: [1. 1. 1.]