原文:
www.kdnuggets.com/2019/08/4-tips-advanced-feature-engineering-preprocessing.html
由 Maarten Grootendorst,数据科学家,I/O 心理学家 & 临床心理学家
www.analyticsvidhya.com/blog/2018/11/data-engineer-comprehensive-list-resources-get-started/data-engineer/
1. 谷歌网络安全证书 - 快速进入网络安全职业生涯。
2. 谷歌数据分析专业证书 - 提升你的数据分析技能
3. 谷歌 IT 支持专业证书 - 支持你组织的 IT
可以说,开发机器学习模型的两个最重要的步骤是特征工程和数据预处理。特征工程包括特征的创建,而数据预处理涉及数据的清理。
“折磨数据,它会承认任何事情*。” — 罗纳德·科斯
我们通常会花费大量时间将数据提炼成对建模有用的形式。为了使这项工作更高效,我想分享 4 个技巧和窍门,帮助你在特征工程和数据预处理中。
我应该指出,尽管这可能听起来很陈词滥调,领域知识可能是特征工程中最重要的东西之一。它可以帮助你通过更好地理解你使用的特征来防止欠拟合和过拟合。
你可以在这里找到包含分析的笔记本。
在实践中,你会经常遇到不平衡的数据。如果你的目标变量只有轻微的不平衡,这不一定会成为问题。你可以通过使用适当的验证措施来解决这个问题,比如平衡准确度、精准度-召回曲线或F1 分数。
不幸的是,这并不总是如此,你的目标变量可能高度不平衡(例如,10:1)。相反,你可以使用一种叫做SMOTE的技术来对少数类目标进行过采样,从而引入平衡。
SMOTE代表Synthetic Minority Oversampling Technique,是一种用于增加少数类样本的过采样技术。
它通过查看目标的特征空间并检测最近邻来生成新样本。然后,它简单地选择类似样本,并在邻近样本的特征空间内随机改变一列。
实现 SMOTE 的模块可以在imbalanced-learn包中找到。你可以简单地导入该包并应用 fit_transform:
如你所见,模型成功地对目标变量进行了过采样。使用 SMOTE 进行过采样时,你可以采取几种策略:
-
**'minority'**
:仅对少数类进行重新采样; -
**'not minority'**
:对除少数类外的所有类进行重新采样; -
**'not majority'**
:对除多数类外的所有类进行重新采样; -
**'all'**
:对所有类进行重新采样; -
当
**dict**
时,键对应于目标类。值对应于每个目标类所需的样本数量。
我选择使用字典来指定我希望过采样数据的程度。
附加提示 1:如果你的数据集中有分类变量,SMOTE 可能会为这些变量创建无法发生的值。例如,如果你有一个名为 isMale 的变量,只能取 0 或 1,SMOTE 可能会创建 0.365 作为值。
另外,你可以使用 SMOTENC,它考虑了分类变量的性质。这个版本也可以在imbalanced-learn包中找到。
附加提示 2:确保在创建训练/测试拆分后再进行过采样,这样你只会过采样训练数据。你通常不希望在合成数据上测试你的模型。
为了提高模型的质量和预测能力,通常会从现有变量中创建新特征。我们可以在每对变量之间创建一些交互(例如,乘法或除法),希望找到一个有趣的新特征。然而,这个过程很繁琐,需要大量编码。幸运的是,这可以通过Deep Feature Synthesis自动化。
深度特征合成(DFS)是一种算法,可以快速创建具有不同深度的新变量。例如,你可以先乘以列 A 和列 B,然后再加上列 C。
首先,让我介绍一下我将用于示例的数据。我选择使用HR 分析数据,因为特征易于解释:
基于我们的直觉,我们可以将**average_monthly_hours**
除以**number_project**
识别为一个有趣的新变量。然而,如果我们仅依靠直觉,可能会错过更多的关系。
包确实需要理解它们对 Entities 的使用。然而,如果你只使用一个表,可以简单地遵循下面的代码:
第一步是从中创建一个**entity**
,如果需要,可以与其他表创建关系。接下来,我们可以简单地运行**ft.dfs**
来创建新变量。我们通过参数**trans_primitives**
指定如何创建变量。我们选择将数字变量相加或相乘。
正如你在上面的图片中看到的,我们仅用几行代码就创建了额外的 668 个特征。以下是创建的一些特征示例:
-
**last_evaluation**
乘以**satisfaction_level**
-
**left**
乘以**promotion_last_5years**
-
**average_monthly_hours**
乘以**satisfaction_level**
再加上**time_spend_company**
额外提示 1: 请注意,这里的实现相对基础。DFS 的优点在于它可以通过表之间的聚合创建新变量(例如,事实和维度)。有关示例,请参见这个链接。
额外提示 2: 运行**ft.list_primitives()**
以查看所有可以进行的聚合列表。它甚至处理时间戳、空值和经纬度信息。
像往常一样,没有一种最佳的方法来处理缺失值。根据你的数据,可能仅用某些组的均值或众数来填补缺失值就足够了。然而,还有一些先进的技术使用已知的数据部分来填补缺失值。
一种方法叫做IterativeImputer,这是 Scikit-Learn 中的一个新包,基于流行的 R 算法 MICE 用于填补缺失变量。
虽然 Python 是开发机器学习模型的出色语言,但仍然有一些方法在 R 中效果更好。例如,R 中的成熟插补包:missForest、mi、mice 等。
Iterative Imputer由 Scikit-Learn 开发,将每个具有缺失值的特征建模为其他特征的函数。它将此作为填补的估计。在每一步,选择一个特征作为输出y
,所有其他特征作为输入X
。然后在X
和y
上拟合回归器,并用于预测y
的缺失值。这对每个特征都这样做,并重复进行几轮填补。
让我们来看一个例子。我使用的数据是著名的泰坦尼克号数据集。在这个数据集中,Age
列有缺失值,我们希望填补这些值。代码一如既往地简单:
这个方法的一个好处是它允许你使用你选择的估算器。我使用了 RandomForestRegressor 来模拟 R 中常用的 missForest 的行为。
附加提示 1: 如果你拥有足够的数据,简单地删除缺失数据的样本可能是一个有吸引力的选项。然而,请记住,这可能会在数据中产生偏差。也许缺失的数据遵循某种模式,你会错过这些模式。
附加提示 2: 迭代插补器允许使用不同的估算器。经过一些测试,我发现你甚至可以使用Catboost作为估算器!不幸的是,由于其随机状态名称不同,LightGBM 和 XGBoost 不适用。
如果没有对数据的良好理解,异常值很难被检测到。如果你对数据很熟悉,就可以更容易地指定数据仍然有意义的阈值。
有时这并不可能,因为对数据的完美理解难以实现。相反,你可以利用一些异常检测算法,例如流行的孤立森林。
在孤立森林算法中,关键词是孤立。从本质上讲,该算法检查一个样本被孤立的难易程度。这会产生一个孤立数,该数值通过在随机决策树中分割所需的次数来计算。然后,将所有树上的孤立数取平均。
孤立森林过程。来源于: donghwa-kim.github.io/iforest.html
如果算法只需进行少量分割就能找到一个样本,那么它更可能是一个异常值。分割本身也是随机分割的,因此会产生更短的异常路径。因此,当所有树上的孤立数值较低时,该样本很可能是异常值。
为了举例说明,我再次使用了之前使用过的信用卡数据集:
附加提示 1: 有一个扩展版的孤立森林,它改进了一些不足之处。然而,也有褒贬不一的评论。
希望本文中的技巧和窍门能帮助你进行特征工程和预处理。包含代码的笔记本可以在这里找到。
任何反馈和评论一如既往地受到高度赞赏!
这是Emset发布的一个(至少)每月系列中的第四篇文章,我们展示了应用和开发机器学习技术的新方法和令人兴奋的技术。
个人简介:Maarten Grootendorst 是一名数据科学家、工业与组织心理学家以及临床心理学家。他对任何与 AI 相关的事物充满热情!请联系:www.linkedin.com/in/mgrootendorst/'
原文。经许可转载。
相关内容:
-
在 Pytorch 中训练快速神经网络的 9 个技巧
-
处理小数据的 7 个技巧
-
掌握 Python 机器学习数据准备的 7 个步骤 — 2019 年版