欢迎这位怪蜀黍来到《Python机器学习(三十)Sklearn 预处理数据 - 大码王 - 博客园》

关闭页面特效

 


前面章节中,我们首先加载数据,接着查看数据集的基本信息,然后可视化数据进一步查看数据集信息。接下来,我们开始处理数据,但这之前,通常需要预处理数据。

数据标准化

大型数据分析项目中,数据来源不同,量纲及量纲单位不同,为了让它们具备可比性,需要采用标准化方法消除由此带来的偏差。原始数据经过数据标准化处理后,各指标处于同一数量级,适合进行综合对比评价。这就是数据标准化。

对单个指标进行比较,假设对3名新生婴儿体重(5,6,7)和3名成年人的体重(150,151,152)差异的大小进行对比分析,从表面上看,两组人员的平均差异均为1斤,由此便得出两组人员的体重差异程度相同显然是不合适,因为两者的体重水平不在同一等级上,即量纲不同;

对多个指标进行综合分析,假设对商品的运营指标销售量、销售额、浏览量进行综合评价或聚类分析,由于各指标间的水平相差很大,如果直接进行分析会突出数值较高的指标在综合分析中的作用,从而使各个指标以不等权参与运算。

因此,常常需要先对数据进行标准化,对各统计指标进行无量纲化处理,消除量纲影响和变量自身变异大小和数值大小的影响。

数据标准化的常用方法

Max-Min标准化/离差标准化

Max-Min标准化也称为离散标准化,是对原始数据的线性变换,将数据值映射到[0, 1]之间。

转换公式为:x’=(x-min)/(max-min),其中max为样本的最大值,min为样本的最小值。

离差标准化保留了原来数据中存在的关系,是消除量纲和数据取值范围影响的最简单方法。其缺陷是当有新数据加入时,可能导致max或min的变化,转换函数需要重新定义。

Z-score 标准化/标准差标准化/零均值标准化

Z-score也称标准差标准化,经过处理的数据的均值为0,标准差为1。

转化公式为:x’=(x-μ)/σ,其中μ为所有样本数据的均值,σ为所有样本数据的标准差。

该方法对离群点不敏感,当原始数据的最大值、最小值未知或离群点左右了Max-Min标准化时非常有用,Z-Score标准化目前使用最为广泛的标准化方法。

log函数转换

通过以10为底的log函数转换的方法同样可以实现归一下,数据都要大于等于1

转化公式为:x’=log10(x)/log10(max),其中max为样本数据最大值

sklearn数据标准化

sklearn.preprocessing提供了许多方便的用于做数据预处理工具,在数据标准化方面,sklearn.preprocessing提供了几种scaler进行不同种类的数据标准化操作。

示例

digits.data数据进行标准化处理。

复制代码
from sklearn import datasets

# 加载 `digits` 数据集
digits = datasets.load_digits()

from sklearn.preprocessing import scale

# 对`digits.data`数据进行标准化处理
data = scale(digits.data)
复制代码

输出

复制代码
[[ 0.         -0.33501649 -0.04308102 ... -1.14664746 -0.5056698
  -0.19600752]
 [ 0.         -0.33501649 -1.09493684 ...  0.54856067 -0.5056698
  -0.19600752]
 [ 0.         -0.33501649 -1.09493684 ...  1.56568555  1.6951369
  -0.19600752]
 ...
 [ 0.         -0.33501649 -0.88456568 ... -0.12952258 -0.5056698
  -0.19600752]
 [ 0.         -0.33501649 -0.67419451 ...  0.8876023  -0.5056698
  -0.19600752]
 [ 0.         -0.33501649  1.00877481 ...  0.8876023  -0.26113572
  -0.19600752]]
复制代码

数据进行标准化处理后,可以将每个属性的分布改为均值为零,标准差为1(单位方差)。

将数据分解为训练子集和测试子集

数据集除了用来训练模型,还需用来评估模型。需要将数据集分为两部分:训练子集和测试子集。

实践中,训练子集和测试子集是不互相覆盖的: 最常见的分割选择是将原始数据集的2/3作为训练集,剩下的1/3将组成测试集。

可以使用train_test_split函数将数据集随机划分为训练子集和测试子集,并返回划分好的训练集测试集样本和训练集测试集标签。

示例

将数据集随机划分为训练子集和测试子集。

复制代码
import numpy as np
# 导入 `train_test_split`
from sklearn.model_selection import train_test_split

# 数据分成训练集和测试集
# `test_size`:如果是浮点数,在0-1之间,表示测试子集占比;如果是整数的话就是测试子集的样本数量,`random_state`:是随机数的种子
X_train, X_test, y_train, y_test, images_train, images_test = train_test_split(data, digits.target, digits.images, test_size=0.33, random_state=42)

# 训练集样本数量和特征值数量
n_samples, n_features = X_train.shape

# 输出样本数量`n_samples`
print(n_samples)

# 输出特征值数量 `n_features`
print(n_features)

# 训练集标签数量
n_digits = len(np.unique(y_train))

# 打印`y_train`
print(len(y_train))
复制代码

随机数种子

随机数的产生取决于种子,随机数和种子之间的关系遵从以下两个规则:
种子不同,产生不同的随机数;种子相同,即使实例不同也产生相同的随机数。

随机数种子,其实就是该组随机数的编号,在需要重复试验的时候,种子相同可以保证得到一组一样的随机数。比如你每次都填1,其他参数一样的情况下,得到的随机数组是一样的,但填0或不填,则每次都会不一样。

输出:

1203
64
1203

可以看到,训练集X_train现在包含1203个样本,正好是原始数据集的2/3,每个样本有64个特征值。y_train训练集也包含原始数据集标签的2/3,测试集X_test和y_test各自包含剩下的594个样本。

 

 posted on   大码王  阅读(566)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具

成都

复制代码

喜欢请打赏

扫描二维码打赏

了解更多

点击右上角即可分享
微信分享提示

目录导航