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

本文详细介绍了sklearn库中的三种主要预处理方法:归一化/标准化、区间缩放/调整尺度和正态化处理。通过实例展示了如何使用normalize()函数和Normalizer()类进行归一化处理,minmax_scale函数和MinMaxScaler()类进行缩放处理,以及scale()函数和StandardScaler()类进行正态化处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在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.]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

象牙塔小明

您的鼓励是我最大的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值