为机器学习准备数据
介绍
众所周知,输出的质量取决于输入的质量。机器学习模型也不例外。机器学习模型预测的准确性取决于数据的质量和输入的数据量。虽然我们无法控制数据量,但我们当然可以控制数据的质量。在典型的机器学习项目中,团队花费 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()
这是用于检测和消除异常值的一种技术。还有其他技术,如 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
您可以看到,每个州都分配了一个数值。我们首先将此特征转换为分类类型,然后再对其应用分类代码。
特征工程
特征工程需要专业知识和技术知识。数据中的特征太少可能会导致模型性能不佳,而特征太多可能会导致模型过于复杂。当训练数据中的特征太多时,模型很可能过度拟合数据 - 即在训练数据上表现准确,但在新的未经训练的测试数据上表现不佳。选择最佳特征数量以帮助我们设计性能更好的模型非常重要。选择最佳特征集是一个两步过程:
从特征列表中删除不需要的特征,也称为“特征选择”。
从现有的特征集中提取新的特征,也称为“特征提取”。
降维
数据中的特征过多会增加模型预测的复杂性、训练时间和计算成本,并且可能由于变量过多而降低预测的准确性。因此,建议减少在预测过程中可以产生最佳准确性的特征数量。实现此目的的一种技术是降维。它通过两种不同的方式实现:
识别与训练过程相关的特征,并消除那些冗余且对数据意义较小的特征。
组合多个特征并创建一组新特征,而不会丢失这些特征所传达的信息。
还有许多其他技术可用于实现此目的。 一些最常见的技术包括:
主成分分析(PCA)
随机森林
低方差过滤器
高相关滤波器
数据不平衡
对于信用卡欺诈检测、垃圾邮件过滤或医疗诊断等业务问题,实际数据可能不到实际样本量的 1%。在这种情况下,我们需要小心,不要将准确数据视为噪声或异常值而拒绝。如果我们使用准确度作为此模型的性能指标,那么很明显,该模型将以 99% 的准确度预测每笔信用卡交易。但企业更关心的是 1% 的虚假信用卡交易。因此,准确度在这种情况下并不是最好的性能指标,我们可能需要依赖其他性能指标,如精确度、召回率和敏感度。一旦我们制作了混淆矩阵,就可以得出所有这些指标。
一些常用的提高预测分数的技术包括:
重采样——欠采样多数类:当我们的样本数据集中有大量正数据(有效信用卡/有效电子邮件)与负数据(无效信用卡/垃圾邮件)相比时,我们可以使用此技术删除一些正数据的观察值。通过降低正数据的比例,我们有效地增加了负样本数据的比例。
重采样——对少数类进行过采样:在这种技术中,我们向样本数据集中添加更多负面数据(无效信用卡/垃圾邮件)的副本。我们需要小心,不要陷入过度拟合数据的风险。
SMOTE 技术:合成少数过采样技术(SMOTE)用于生成新的合成数据,可用作训练数据来训练模型。
结论
虽然本指南介绍了准备数据的重要方面,但这只是冰山一角。根据数据类型,可以使用多种其他方法和技术。Python 生态系统提供了多个库,可以完美地解决此问题。这也是一个迭代过程,您可能需要多次执行其中一些步骤来微调数据,以准备更好的预测模型。
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
请先 登录后发表评论 ~