机器学习项目的数据准备
机器学习项目的数据准备
我们为机器学习收集的数据必须经过预处理,然后才能用于拟合模型。数据准备本质上是将原始数据修改为可用于建模的形式的任务,主要是通过数据添加、删除或其他数据转换技术。
我们需要在输入任何算法之前对数据进行预处理,主要是由于以下原因:
- 混乱的数据——现实世界的数据是混乱的,有缺失值、冗余值、超出范围的值、错误和噪音。
- 机器学习算法需要数字数据。
- 通常情况下,算法对输入数据有要求,例如,一些算法假设数据有一定的概率分布,如果预测变量高度相关,其他算法可能表现更差等。
数据准备任务主要取决于我们正在使用的数据集,并且在某种程度上取决于模型的选择。然而,在对数据和 EDA 进行初步分析后,这一点变得更加明显。例如,查看汇总统计数据,我们知道是否需要对预测变量进行缩放。查看相关矩阵,您可以找出是否存在高度相关的预测变量。查看各种图,例如箱线图,您可以找到是否需要处理异常值等等。
尽管每个数据集都不同,但我们可以定义一些通用步骤,这些步骤可以指导我们准备数据以输入我们的学习算法。
有助于数据预处理的一些常见任务是:
- 数据清洗
- 特征选择
- 数据转换
- 特征工程
- 降维
- 数据清洗: 可以概括为纠正数据中的错误的过程。错误的形式可能是缺失值、冗余行或列、方差为零或接近零的变量等等。因此,数据清理涉及以下几个或全部子任务:
- 冗余样本或重复行: 应该被识别并从数据集中删除。在 Python 中,Pandas 中的函数如 duplicated() 可用于识别此类样本,而 drop_duplicates() 可用于删除此类行。
- 冗余特性: 如果数据集具有高度相关的特征,则可能会导致混乱(不规则的回归系数估计)。这样的列可以使用相关矩阵来识别,并且应该删除一对高度相关的特征。类似地,对于所有样本具有相同值的接近零方差特征对数据的方差没有贡献。应识别此类列并将其从数据集中删除。
- 异常值检测: 异常值是远离其他观测值的极端值。异常值可能会扭曲数据的描述性统计数据,从而误导数据解释并对模型性能产生负面影响。因此,检测和处理异常值非常重要。可以通过箱线图和散点图等数据可视化技术检测异常值。
使用箱线图检测异常值的示例:
异常值也可以通过计算 z 分数或四分位数范围来检测。使用 z 分数时,与平均值相差超过 3 个标准差的数据点通常被视为异常值。但是,这可能会因数据集的大小而异。当使用四分位距时,低于 Q1–1.5 四分位距或高于 Q3 + 1.5 四分位距的点被认为是异常值,其中 Q1 是第一个四分位数,Q3 是第三个四分位数。
下图显示了与平均值相差超过 3 个标准差的异常值:
如果有一些异常值,您可以选择丢弃具有异常值的样本。否则,如果异常值太多,可以单独建模。我们也可以选择将异常值限制在第 95 个百分位或第 5 个百分位值。但是,您可以通过分析数据的十分位数来选择适当的替换值。
- 缺失值: 缺失值的数据不能用于建模;因此任何缺失的值都应该被识别和清理。如果预测变量或样本中的数据稀疏,我们可能会选择删除整个列/行。否则,我们可以用平均值或中位数来估算缺失值。分类变量中的缺失值可以替换为最常见的类。
要记住的要点:
特征选择:有时数据集有数百个输入变量,并非所有这些变量都是目标的良好预测器,并且可能会导致数据中的噪声。特征选择技术用于寻找能够最有效地预测目标变量的输入变量,以减少输入变量的数量。特征选择技术可以进一步分为监督选择技术和无监督选择技术。顾名思义,无监督选择技术在消除输入变量的同时不考虑目标变量。这将包括使用相关性来消除高度相关的预测变量或消除低方差预测变量等技术。监督特征选择技术考虑选择要消除的特征的目标变量。这些可以进一步分为三组,即内在、过滤和包装技术。
- 固有的 - 特征选择过程嵌入在模型构建过程本身中,例如基于树的算法,它为分割挑选最佳预测器。类似地,像套索这样的正则化技术会缩小预测变量的系数,使得某些预测变量的系数可以缩小到零,因此被排除在模型之外。多元自适应回归样条 (MARS) 模型也属于这一类。这种方法的一个主要优点是,由于特征选择是模型构建过程的一部分,它相对较快。然而,模型依赖性也可能被证明是不利的,例如一些基于树的算法是贪婪的,因此可能会选择可能导致次优拟合的预测器。
- 筛选 - 基于过滤器的选择技术使用一些统计方法对每个预测变量分别与目标变量进行评分,并选择得分最高的预测变量。它主要是单变量分析,即单独评估每个预测变量。它不考虑自变量之间的相关性。
根据输入变量的类型(即数值或分类)和输出变量的类型,可以使用适当的统计量度来评估特征选择的预测变量:例如,Pearson 相关系数、Spearmon 相关系数、ANOVA、卡方。
数据转换: 我们可能需要转换数据以改变其数据类型、规模或分布。
类型:我们需要在一开始就分析输入变量,以了解预测变量是否用适当的数据类型表示,并在进行 EDA 和建模之前进行所需的转换。例如,有时布尔值被编码为真和假,我们可以将它们转换为取值 0 和 1。类似地,有时我们可能会遇到整数变量,将其视为分类变量可能更合适。例如,在处理数据集以预测汽车价格时,将变量“门数”视为分类变量会更合适,该变量占用值 {2,4}。
分类变量应先转换为数值,然后才能用于建模。有许多分类变量编码技术,如 N-1 虚拟编码、1 热编码、标签编码、频率编码。当我们想要指定和维护序数变量的顺序时,可以使用序数编码。
尺度:预测变量可能有不同的单位(公里、美元、年等),因此也有不同的尺度。例如,我们可能在数据集中有输入变量,如年龄和薪水。可变薪水的比例总是远高于年龄,因此可能对模型的贡献不均,并产生偏差。因此,我们转换预测变量以将它们带到一个共同的尺度。归一化和标准化是最广泛使用的缩放技术。
- 正常化: 有助于缩放数据,使所有值都位于 0 和 1 之间。scikit-learn 库方法甚至允许指定首选范围。
标准化前后的数据:
- 标准化: 我们通过以均值为中心对数据进行标准化,然后按标准差对数据进行缩放。换句话说,从输入变量的每个值中减去变量的平均值,然后将差值除以变量的标准差。结果数据的均值为零,标准差为 1。标准化假设数据服从高斯分布。 python 中的 Scikit 学习库可用于规范化 (MinMaxScaler()) 和标准化 (StandardScaler())。
标准化前后的数据:
- 分配: 许多算法假设基础数据的高斯分布。如果数据不是高斯分布或类似高斯分布,我们可以对数据进行变换以减少偏度。 Box-Cox 变换或 Yeo-Johnson 变换可用于对数据执行幂变换。 Box-Cox 变换根据 lambda 的值对数据应用不同的变换。例如,对于 Lambda = -1,它进行逆变换,对于 Lambda=0,它进行对数转换,对于 Lambda = 0.5,它进行平方根转换,对于 Lambda = -0.5,它进行平方根倒数转换。
python scikit 库中的 PowerTransformer() 类可用于进行这些幂变换。
对数转换前后的数据:
- 应在训练数据集上进行数据转换,以便仅从训练集估计转换所需的统计量,然后将其应用于验证集。
- 决策树和其他基于树的集合,如随机森林和提升算法,不受输入变量不同规模的影响。因此可能不需要缩放。
- 使用输入变量的加权和的线性回归和神经网络以及计算预测变量之间距离或点积的 K 近邻或 SVM 将受到预测变量规模的影响,因此应为这些模型调整输入变量。
- 在标准化和标准化之间,当数据服从高斯分布时应该标准化,否则标准化。
特征工程: 是数据预处理的一部分,我们使用一个或多个现有特征推导出新特征。例如,在处理出租车票价预测问题时,我们可能会使用乘车起点和终点的纬度和经度坐标推导出一个新特征,即乘车行驶的距离。或者在预测零售业务的销售额或客流量时,我们可能需要添加一个新特征来考虑假期、周末和节日对目标变量的影响。因此,我们可能需要设计这些新的预测变量并将它们输入到我们的模型中,以有效地识别潜在模式。
结论:
数据准备是机器学习项目中一个重要且不可或缺的步骤。有多种技术可用于各种数据清理任务。但是,没有最好或最差的数据清理技术。每个机器学习问题都是独一无二的,基础数据也是如此。我们需要应用不同的技术,并根据数据和手头的问题查看最有效的方法。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明