机器学习sklearn数据预处理:归一化-标准化/区间缩放-调整尺度/正态化

在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.]

你可能感兴趣的:(Scikit_learn,机器学习理论,sklearn,数据预处理,机器学习)