趋近智
好的,让我们动手操作吧!理论很有帮助,但将这些数据准备技术付诸实践能让它们记忆更深。在本节中,我们将通过一个实际例子来处理一个小型、混乱的数据集,使其为机器学习算法做好准备。
“假设我们有一个包含二手车信息的数据集,我们希望预测它们的价格。数据通常看起来不那么完美,就像这个样本一样:”
原始汽车数据集
| 里程 (公里) | 车龄 (年) | 发动机类型 | 车况 | 价格 ($) |
|---|---|---|---|---|
| 50000 | 3 | Petrol | Good | 15000 |
| 120000 | 8 | Diesel | Fair | 8000 |
| 80000 | 5 | Petrol | Good | 11000 |
| NaN | 10 | Diesel | Excellent | 9500 |
| 65000 | 4 | NaN | Good | 13000 |
| 150000 | 12 | Petrol | Fair | NaN |
| 95000 | 6 | Hybrid | Excellent | 18000 |
我们可以立即看出算法会不喜欢的一些问题:
NaN(非数字)条目。让我们一步步处理这些问题。
首先,我们需要处理 NaN 条目。如前所述,常见策略包括删除行/列或填充(补齐缺失值)。由于我们的数据集较小,删除行可能会丢弃过多信息。我们来尝试填充。
数值特征(“里程”、“价格”): 我们可以使用列的均值或中位数来填充缺失的数值。如果数据可能存在异常值(极端值)而导致均值出现偏差,通常更倾向于使用中位数。让我们根据非缺失值计算“里程”和“价格”的中位数:
类别特征(“发动机类型”): 对于类别数据,我们可以用众数(最常出现的值)填充缺失值。
处理缺失值后的数据集如下:
填充后数据集
| 里程 (公里) | 车龄 (年) | 发动机类型 | 车况 | 价格 ($) |
|---|---|---|---|---|
| 50000 | 3 | Petrol | Good | 15000 |
| 120000 | 8 | Diesel | Fair | 8000 |
| 80000 | 5 | Petrol | Good | 11000 |
| 87500 | 10 | Diesel | Excellent | 9500 |
| 65000 | 4 | Petrol | Good | 13000 |
| 150000 | 12 | Petrol | Fair | 12000 |
| 95000 | 6 | Hybrid | Excellent | 18000 |
注意:“价格”列通常是我们的目标变量(我们希望预测的值)。根据情况,如果目标值缺失,我们可能会选择完全删除该行,因为填充目标值可能会扭曲模型的学习。在此示例中,我们对其进行了填充以演示该技术,但请记住这个考虑因素。
机器学习算法处理数字。我们需要将类别特征(“发动机类型”、“车况”)转换为数值格式。一种常用方法是独热编码。
发动机类型: 这包括“Petrol”、“Diesel”、“Hybrid”等类别。独热编码为每个类别创建一个新的二进制(0或1)列。
车况: 这包括“Good”、“Fair”、“Excellent”等类别。同样,我们为每个类别创建一个新的二进制列。请注意,“车况”可能具有固有的顺序(例如,Fair < Good < Excellent)。独热编码会忽略此顺序,但如果模型认为此顺序重要,其他编码方法(如序数编码)可以保留它。为简单起见,这里我们使用独热编码。
应用独热编码后,数据集结构发生变化:
独热编码后数据集
| 里程 (公里) | 车龄 (年) | 发动机_汽油 | 发动机_柴油 | 发动机_混合动力 | 车况_良好 | 车况_一般 | 车况_优秀 | 价格 ($) |
|---|---|---|---|---|---|---|---|---|
| 50000 | 3 | 1 | 0 | 0 | 1 | 0 | 0 | 15000 |
| 120000 | 8 | 0 | 1 | 0 | 0 | 1 | 0 | 8000 |
| 80000 | 5 | 1 | 0 | 0 | 1 | 0 | 0 | 11000 |
| 87500 | 10 | 0 | 1 | 0 | 0 | 0 | 1 | 9500 |
| 65000 | 4 | 1 | 0 | 0 | 1 | 0 | 0 | 13000 |
| 150000 | 12 | 1 | 0 | 0 | 0 | 1 | 0 | 12000 |
| 95000 | 6 | 0 | 0 | 1 | 0 | 0 | 1 | 18000 |
现在,我们的所有特征列都是数值型的了。
请看“里程”和“车龄”列。“里程”范围从 50,000 到 150,000,而“车龄”范围从 3 到 12。某些算法对这种量纲上的巨大差异很敏感。让我们对数值特征(“里程”、“车龄”)应用缩放。我们将使用归一化(最小-最大缩放),它使用以下公式将数据缩放到 0 到 1 的范围:
x′=最大值(x)−最小值(x)x−最小值(x)让我们将此应用于“里程”和“车龄”:
“价格”列是我们的目标变量。是否缩放目标变量取决于具体的模型和情境。通常情况下,它不进行缩放。我们在此将其保留为未缩放状态。独热编码的特征已经是二进制(0或1),因此通常不需要缩放。
我们最终的、预处理过的特征集(不包括目标“价格”)如下:
缩放后数据集(仅特征)
| 里程 (归一化后) | 车龄 (归一化后) | 发动机_汽油 | 发动机_柴油 | 发动机_混合动力 | 车况_良好 | 车况_一般 | 车况_优秀 |
|---|---|---|---|---|---|---|---|
| 0.0 | 0.0 | 1 | 0 | 0 | 1 | 0 | 0 |
| 0.7 | 0.56 | 0 | 1 | 0 | 0 | 1 | 0 |
| 0.3 | 0.22 | 1 | 0 | 0 | 1 | 0 | 0 |
| 0.375 | 0.78 | 0 | 1 | 0 | 0 | 0 | 1 |
| 0.15 | 0.11 | 1 | 0 | 0 | 1 | 0 | 0 |
| 1.0 | 1.0 | 1 | 0 | 0 | 0 | 1 | 0 |
| 0.45 | 0.33 | 0 | 0 | 1 | 0 | 0 | 1 |
让我们可视化“里程”和“车龄”缩放后的效果。
“里程”与“车龄”在归一化前(左侧,蓝色)和归一化后(右侧,橙色)的比较。请注意,缩放后的特征现在在两个坐标轴上都处于 0 到 1 之间。
回顾前一节和第 2 章,训练之前的最后一步通常是将数据分割成训练集和测试集。我们会取我们完全清洗和准备好的数据(上面的特征表和对应的“价格”列)进行分割,通常保留大约 70-80% 用于模型训练,20-30% 用于在未见过的数据上测试其表现。
我们在此不执行分割,但这是在将数据输入到线性回归或 KNN 等算法之前的紧接下一步操作。
在本次动手实践中,我们处理了一个带有常见问题的原始数据集,并应用了基本清洗步骤:
这些处理过的数据现在对于大多数机器学习算法来说,处于更好的格式。尽管这些是基本技术,但它们是数据准备工作的重要部分,也是任何机器学习项目的重要组成部分。
这部分内容有帮助吗?
© 2026 ApX Machine Learning用心打造