游乐游手机版
首页/AI热点日报/热点详情

机器学习为何需要数据预处理的原因解析

类型:热点整理2026-07-19
数据预处理是将原始数据清理、重构为机器学习模型可识别格式的基础步骤,包括处理缺失值与噪声、编码分类变量、拆分训练集与测试集及特征缩放等流程,直接决定模型准确性与效率。

数据预处理——将原始数据转化为机器学习模型能够识别的格式。尽管这项任务看似基础,但它实际上是决定整个机器学习项目成功与否的关键环节,其重要性怎么强调都不为过。

在实际项目中,我们面对的往往不是干净整洁、格式完美的数据。噪声、缺失值、格式不兼容等问题才是常态。因此,数据预处理的核心任务就是将这些“脏乱差”的原始数据清理、重构,再输入模型。这一步如果做得扎实,模型的准确性和效率才能得到有效保障。

为什么数据预处理必不可少?

现实世界的数据通常存在诸多问题,比如大量噪声、缺失值,甚至格式不兼容导致模型无法直接读取。数据预处理正是为了解决这些难题,使数据变得“可用”。可以说,它是提升模型性能的基础工程,不可或缺。

整个流程大致可以分为以下几个关键步骤:

  • 获取数据集
  • 导入必要的库
  • 导入数据集
  • 处理缺失数据
  • 编码分类数据
  • 拆分训练集和测试集
  • 特征缩放

1)获取数据集

机器学习模型完全依赖数据,因此第一步就是找到合适的数据集。数据集的形式取决于具体问题——商业模型和医疗模型的数据集显然不同,每个数据集都有其独特性。为便于代码处理,通常将其保存为CSV文件,有时也可能是HTML或xlsx格式。

CSV文件是什么? 全称为“逗号分隔值”,是一种能够保存表格数据的文件格式,功能类似于电子表格,尤其适合处理大型数据集。

这里我们使用一个演示数据集。对于实际商业项目,可以从Kaggle、UCI等公开数据源获取,也可以通过Python的各种API抓取数据,自行构建数据集。

2)导入库

在Python中进行数据预处理,需要借助几个强大的库:

Numpy: 处理数学运算的基础包,支持大型多维数组和矩阵。导入代码示例如下:

import numpy as nm

Matplotlib: 一个2D绘图库,常用于绘制图表。通常我们会导入它的子库pyplot:

import matplotlib.pyplot as mpt

Pandas: 应用最广泛的库之一,用于数据导入、管理和分析。它是开源的数据操作利器:

import pandas as pd

3)导入数据集

数据集到手后,下一步就是将其读入代码中。前提是先把当前工作目录设置到存放数据集的文件夹。

在Spyder等IDE中,将Python文件保存到数据集所在目录,然后在文件资源管理器里选择目标目录,执行代码即可。

read_csv() 函数: 这是Pandas库读取CSV文件的核心函数。无论是本地文件还是远程URL,都能轻松处理:

data_set = pd.read_csv('数据集.csv')

执行成功后,数据就成功导入到变量data_set里了。在变量资源管理器里双击该变量,即可查看数据内容。注意,Python的默认索引是从0开始的。

提取自变量和因变量: 这一步非常关键。我们需要区分出特征矩阵(自变量)和要预测的结果(因变量)。在演示数据集中,自变量是Country、Age和Salary,因变量是Purchase。

提取自变量:

使用Pandas的iloc[]方法,选择所有行以及除了最后一列的所有列:

x = data_set.iloc[:,:-1].values

输出结果是一个包含三个变量的数组。

提取因变量:

同样使用iloc[],但这次只取最后一列:

y = data_set.iloc[:,3].values

输出结果是一个包含'No'和'Yes'的数组。

在Python中做机器学习,这一步是必须的。但对于R语言用户,则不是。

4)处理缺失数据

数据集中存在缺失值,对机器学习模型来说是致命的,必须加以处理。

常见的方法有两种:

删除包含空值的行/列: 最简单直接,但容易丢失信息,导致模型不够准确。

用平均值填充: 计算某列或某行的平均值,填入缺失的位置。这种方法对年龄、薪水这类数值型特征效果不错。我们这里采用的就是这种方式。

具体实现上,需要用到Scikit-learn库中的Imputer类:

from sklearn.preprocessing import Imputer
imputer = Imputer(missing_values='NaN', strategy='mean', axis=0)
imputer = imputer.fit(x[:, 1:3])
x[:, 1:3] = imputer.transform(x[:, 1:3])

输出结果中,缺失值已经被替换成了该列剩余值的平均值。

5)编码分类数据

机器学习模型只能识别数字。如果数据中包含像“国家”、“是否购买”这样的分类变量,就必须进行编码转换。

对于“国家”变量:

首先用LabelEncoder()把文本标签转换成数字:

from sklearn.preprocessing import LabelEncoder
label_encoder_x = LabelEncoder()
x[:, 0] = label_encoder_x.fit_transform(x[:, 0])

转换后,“India”变成2,“France”变成0,“Germany”变成1。但问题在于:模型可能会误认为这些数字之间存在大小关系(比如2 > 1),这毫无意义。为了消除这种误导,需要引入虚拟编码

虚拟变量: 值为0或1的变量。有几个类别就生成几列。用OneHotEncoder实现:

from sklearn.preprocessing import LabelEncoder, OneHotEncoder
label_encoder_x = LabelEncoder()
x[:, 0] = label_encoder_x.fit_transform(x[:, 0])
onehot_encoder = OneHotEncoder(categorical_features=[0])
x = onehot_encoder.fit_transform(x).toarray()

输出效果很直观:三个国家被拆成了三列,属于哪个国家,对应列就是1,其余是0。

对于“是否购买”变量:

这个变量只有两个类别,直接用LabelEncoder编码成0和1即可,不需要虚拟编码:

labelencoder_y = LabelEncoder()
y = labelencoder_y.fit_transform(y)

6)拆分训练集和测试集

这是提升模型性能的关键一步。用一个数据集训练,再用另一个完全未见过的新数据集来测试,这样才能真实评估模型的表现,有效避免过拟合。

训练集: 用来训练模型,训练时我们知道真实的输出结果。
测试集: 用来测试模型,让模型在这上面进行预测,检验准确性。

使用Scikit-learn的train_test_split函数来完成拆分:

from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=0)

参数解析:test_size=0.2表示20%的数据用于测试,80%用于训练。random_state用于设置随机种子,确保每次运行都能得到相同的拆分结果,常用值为42。

执行后,在变量资源管理器里就能看到4组不同的变量了。

7)特征缩放

这是数据预处理的最后一步,目的是将不同范围的自变量统一到相同的尺度内。

举个简单的例子:在演示数据集中,“年龄”和“薪水”的取值范围天差地别。机器学习模型计算时通常使用欧几里得距离,如果特征不统一尺度,薪水数值就会主导距离计算,导致年龄特征几乎失去作用。

欧几里得距离计算:

为了解决这个问题,特征缩放有两种常用手段:

标准化

归一化

这里我们使用标准化方法。通过Scikit-learn的StandardScaler类来实现:

from sklearn.preprocessing import StandardScaler
st_x = StandardScaler()
x_train = st_x.fit_transform(x_train)
x_test = st_x.transform(x_test)

注意:对测试集只需要调用transform(),而不是fit_transform(),因为拟合已经在训练集上完成了。

最终,所有变量都被缩放到了-1到1的范围内。

关于因变量: 这里我们没有缩放因变量,因为它只有0和1两个值。如果因变量的取值范围很大,那也需要缩放。

完整流程代码整合:

import numpy as nm
import matplotlib.pyplot as mtp
import pandas as pd

# 导入数据集
data_set = pd.read_csv('数据集.csv')

# 提取自变量
x = data_set.iloc[:, :-1].values

# 提取因变量
y = data_set.iloc[:, 3].values

# 处理缺失数据
from sklearn.preprocessing import Imputer
imputer = Imputer(missing_values='NaN', strategy='mean', axis=0)
imputer = imputer.fit(x[:, 1:3])
x[:, 1:3] = imputer.transform(x[:, 1:3])

# 编码分类数据
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
label_encoder_x = LabelEncoder()
x[:, 0] = label_encoder_x.fit_transform(x[:, 0])
onehot_encoder = OneHotEncoder(categorical_features=[0])
x = onehot_encoder.fit_transform(x).toarray()
labelencoder_y = LabelEncoder()
y = labelencoder_y.fit_transform(y)

# 拆分数据集
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=0)

# 特征缩放
from sklearn.preprocessing import StandardScaler
st_x = StandardScaler()
x_train = st_x.fit_transform(x_train)
x_test = st_x.transform(x_test)

上述代码集成了数据预处理的完整流程。当然,并非所有步骤对所有机器学习模型都是必须的,可以根据具体需求灵活调整。

来源:https://m.elecfans.com/article/2222216.html

相关热点

继续查看同栏目近期热点。

延伸阅读

补充最近整理过的热点入口。