为机器学习准备数据

发布日期:2026-07-10 18:44:04   来源 : 杭州电子商务研究院    浏览量 :10
杭州电子商务研究院 发布日期:2026-07-10 18:44:04  
10

介绍

众所周知,输出的质量取决于输入的质量。机器学习模型也不例外。机器学习模型预测的准确性取决于数据的质量和输入的数据量。虽然我们无法控制数据量,但我们当然可以控制数据的质量。在典型的机器学习项目中,团队花费 50%-60% 的时间来准备数据并不罕见。

在本文中,您将学习使用一些标准 Python 库(例如 pandas 和 numpy)将原始数据转换为质量数据的不同技术。

数据准备基础知识

机器学习项目中的数据准备大致可以分为两大类。

1. 数据整理。也称为数据清洗,这是规范化数据、识别缺失数据并执行清理的过程,以删除缺失数据或使用基本统计操作(如平均值或中位数)转换现有数据以估算缺失值。

2. 特征工程。在机器学习术语中,一列数据通常被称为“特征”。在大多数情况下,我们可能需要组合两个或多个特征来创建单个特征或基于现有特征集派生出新特征。例如,如果数据的特征之一是“员工受雇日期”,我们可以通过减去当前日期和受雇日期来得出员工在公司的年龄。

在本文中,我们将使用一家在美国各地设有分店的假想商店。样本数据包括总库存商品列和特定日期特定分店售出的商品数量。这可以看作是庞大数据集的一个小样本。

让我们导入熊猫并打印数据集。

      import pandas as pd
df = pd.read_csv('Downloads/inventory.csv')
print(df)
    
      Date   Amount  SKU  dept  # Sold  branch id branch loc  Tot Inv
0   9/10/2019  3231.00  232   100     125       1123         tx      225
1   9/10/2019  4455.00  345   100     343       1123         tx      400
2    9/9/2019   322.90  231   100       5       2343         il       25
3   9/16/2019    33.88  342   100       1       2341         ma       10
4   9/17/2019    34.44  456   300       2       3323         ma       25
5   9/14/2019      NaN  238   300      44       4565         ma      100
6   9/15/2019   181.90  678   300      23       1123         tx       50
7   9/13/2019  3434.77  567   300     771       2343         il     1000
8    9/9/2019    22.11  453   400       2       2343         il        5
9   9/16/2019    23.10  560   400       3       1123         ca        5
10  9/10/2019    33.56  789   200      34       3456         ca       50
11   9/9/2019    67.88  679   200      45       6655         ca       50
12  9/16/2019    23.33  134   200       2       3438         ri        5
13  9/14/2019    34.00  567   300      33       3356         ny       50
14  9/14/2019  6777.77  667   700    7788       6678         ny    10000
15  9/15/2019   233.33  889   700     233       2234         tx      500
16  9/13/2019   989.99  898   700     213       2245         sc      500
17  9/15/2019  9899.88  901   900     234       3344         nc      500
18  9/10/2019      NaN  998   900      33       2233         fl      100
    

数据整理

缺失数据

处理缺失数据的方法包括删除、填补或预测。

1. 删除。处理数据中的空值的一种更简单的方法就是删除它们。如果空值数量相对较少,则这是一种首选方法。如果不是,我们可能会因为删除它们而丢失一些有意义的信息。Pandas 具有 dropna() 函数,可用于删除所有空值。在我们的示例数据中,有两行具有空值。

      df.dropna()
    

一旦我们执行上述语句,您就可以看到删除了空行的结果数据。

      Date  Amount     SKU   dept  # Sold     branch id     branch loc Tot Inv
0    9/10/2019  3231.00    232   100   125   1123     tx    225
1    9/10/2019  4455.00    345   100   343   1123     tx    400
2    9/9/2019   322.90     231   100   5     2343     il    25
3    9/16/2019  33.88 342   100   1    2341  ma     10
4    9/17/2019  34.44 456   300   2    3323  ma     25
6    9/15/2019  181.90     678   300   23    1123     tx    50
7    9/13/2019  3434.77    567   300   771   2343     il    1000
8    9/9/2019   22.11 453   400   2    2343  il    5
9    9/16/2019  23.10 560   400   3    1123  ca    5
10    9/10/2019  33.56 789   200   34    3456  ca     50
11    9/9/2019   67.88 679   200   45    6655  ca     50
12    9/16/2019  23.33 134   200   2    3438  ri    5
13    9/14/2019  34.00 567   300   33    3356  ny     50
14    9/14/2019  6777.77    667   700   7788  6678     ny    10000
15    9/15/2019  233.33     889   700   233   2234     tx    500
16    9/13/2019  989.99     898   700   213   2245     sc    500
17    9/15/2019  9899.88    901   900   234   3344     nc    500
    

2. 归纳。有些情况下我们不能放弃现有数据,特别是当数据的样本量相对较小或空值比例相对较高时。在这些情况下,我们需要归纳缺失数据,为此可以使用不同的策略。连续数据的一些常用方法是特征的平均值、中位数或众数。对于分类数据,众数始终是首选方法。Pandas 有 fillna() 方法来实现这一点。

3. 预测。在这种情况下,我们不能猜测错误的值。我们不是输入随机值,而是使用机器学习算法来预测值。我们使用回归模型来预测连续数据,使用分类模型来预测分类数据。

检测异常值

在准备数据时,我们必须注意极端值。其中一些值可能是真实的情况,但有些可能是错误的。异常值的存在会严重影响建模过程,从而影响预测准确性。

例如,在上面的数据中,您可以看到观察值(行)17 的价格非常极端。查看其他数据,似乎很有可能这是用户错误。

观察值的 z 分数是检测异常值的常用方法。要计算“金额”特征的 z 分数,我们将使用以下公式。

      zscore = (Amount - Mean Amount)
          ----------------------------
          Standard Deviation of Amount
    

我们可以为标准差设置一个特定的阈值(> 2.0 或 2.5),一旦 z 分数超过此值,我们就可以安全地拒绝这些值作为异常值。让我们计算“金额”特征的 z 分数并绘制一个图表。

      df['Amount_zscore'] = (df['Amount'] - df['Amount'].mean())/df['Amount'].std()
print(df['Amount_zscore'])
    
      0     0.508907
1     0.930321
2    -0.492328
3    -0.591836
4    -0.591643
6    -0.540874
7     0.579064
8    -0.595888
9    -0.595547
10   -0.591946
11   -0.580130
12   -0.595468
13   -0.591794
14    1.730032
15   -0.523167
16   -0.262655
17    2.804950
    
      df['Amount_zscore'].plot.kde()
    

! zscore 图表

这是用于检测和消除异常值的一种技术。还有其他技术,如 Dbscan 和 Isolation Forest,可根据特定数据使用。这些的解释超出了本文的范围。

正常化

如果您的数据包含多个特征,并且每个特征的测量单位都不同,则数据出现偏差的可能性很高。因此,将所有可能的特征转换为相同的标准比例非常重要。这种技术称为规范化或特征缩放。

例如,在我们的数据中,库存数量范围从 1 到 1000,而成本范围从 1 到 10000。

最小-最大缩放是标准化数据时常用的技术。 公式为:

      Feature(Normalized) = (Feature Value - Min. Feature Value)
                      --------------------------------------------
                     (Max. Feature Value - Min. Feature Value)
    

在对数据进行标准化之前,应用上述异常值技术非常重要。否则,您将面临将数据中的正常值偏向较小间隔的风险。

编码数据

数据并不总是数字。例如,您可能拥有分类的文本数据。参考我们的数据集,虽然大多数特征都是数字,但“分支位置”是指特定分支所在的州,它包含文本数据。作为准备数据的一部分,将此特征转换为数字数据很重要。有很多方法可以做到这一点。我们将使用“标签编码”技术。

      df["branch loc"] = df["branch loc"].astype('category')
df["branch_loc_cat"] = df["branch loc"].cat.codes
print (df[["branch loc", "branch_loc_cat"]])
    
      branch loc  branch_loc_cat
0          tx               7
1          tx               7
2          il               1
3          ma               2
4          ma               2
6          tx               7
7          il               1
8          il               1
9          ca               0
10         ca               0
11         ca               0
12         ri               5
13         ny               4
14         ny               4
15         tx               7
16         sc               6
17         nc               3
    

您可以看到,每个州都分配了一个数值。我们首先将此特征转换为分类类型,然后再对其应用分类代码。

特征工程

特征工程需要专业知识和技术知识。数据中的特征太少可能会导致模型性能不佳,而特征太多可能会导致模型过于复杂。当训练数据中的特征太多时,模型很可能过度拟合数据 - 即在训练数据上表现准确,但在新的未经训练的测试数据上表现不佳。选择最佳特征数量以帮助我们设计性能更好的模型非常重要。选择最佳特征集是一个两步过程:

  1. 从特征列表中删除不需要的特征,也称为“特征选择”。

  2. 从现有的特征集中提取新的特征,也称为“特征提取”。

降维

数据中的特征过多会增加模型预测的复杂性、训练时间和计算成本,并且可能由于变量过多而降低预测的准确性。因此,建议减少在预测过程中可以产生最佳准确性的特征数量。实现此目的的一种技术是降维。它通过两种不同的方式实现:

  1. 识别与训练过程相关的特征,并消除那些冗余且对数据意义较小的特征。

  2. 组合多个特征并创建一组新特征,而不会丢失这些特征所传达的信息。

还有许多其他技术可用于实现此目的。 一些最常见的技术包括:

  • 主成分分析(PCA)

  • 随机森林

  • 低方差过滤器

  • 高相关滤波器

数据不平衡

对于信用卡欺诈检测、垃圾邮件过滤或医疗诊断等业务问题,实际数据可能不到实际样本量的 1%。在这种情况下,我们需要小心,不要将准确数据视为噪声或异常值而拒绝。如果我们使用准确度作为此模型的性能指标,那么很明显,该模型将以 99% 的准确度预测每笔信用卡交易。但企业更关心的是 1% 的虚假信用卡交易。因此,准确度在这种情况下并不是最好的性能指标,我们可能需要依赖其他性能指标,如精确度、召回率和敏感度。一旦我们制作了混淆矩阵,就可以得出所有这些指标。

一些常用的提高预测分数的技术包括:

  • 重采样——欠采样多数类:当我们的样本数据集中有大量正数据(有效信用卡/有效电子邮件)与负数据(无效信用卡/垃圾邮件)相比时,我们可以使用此技术删除一些正数据的观察值。通过降低正数据的比例,我们有效地增加了负样本数据的比例。

  • 重采样——对少数类进行过采样:在这种技术中,我们向样本数据集中添加更多负面数据(无效信用卡/垃圾邮件)的副本。我们需要小心,不要陷入过度拟合数据的风险。

  • SMOTE 技术:合成少数过采样技术(SMOTE)用于生成新的合成数据,可用作训练数据来训练模型。

结论

虽然本指南介绍了准备数据的重要方面,但这只是冰山一角。根据数据类型,可以使用多种其他方法和技术。Python 生态系统提供了多个库,可以完美地解决此问题。这也是一个迭代过程,您可能需要多次执行其中一些步骤来微调数据,以准备更好的预测模型。

以上内容来自杭州电子商务研究院推送
关注
关于我们
热门推荐
合作伙伴
免责声明:本站部分资讯来源于网络,如有侵权请及时联系客服,我们将尽快处理
Copyright © 2025-2027 ToB产业网址导航 公安备案 浙公网安备33010602013138号 浙ICP备16025413号-9
支持 反馈 关注 数据