您已经学习了数据清洗和转换,这些都是基本步骤。然而,即使经过清洗和缩放,您最初的原始特征可能也未处于最佳形式,难以让机器学习算法有效获取信息。这时,特征工程就发挥作用了。它是运用领域知识和统计洞察,从现有数据中创建出新的、信息更丰富的特征的过程。可以将其视为改进数据集,以突显模型可学习的模式。出色的特征工程可以显著提升模型性能,其效果通常优于调整模型超参数。为什么要投入时间进行特征工程?虽然现代机器学习算法,特别是深度学习模型,有时能直接从原始数据中学习复杂表示,但特征工程仍是一项很有价值的技能,原因如下:提升模型性能:精心制作的特征可以使数据中的潜在模式对学习算法更加清晰。这可以使模型具有更高的预测准确性、对未见数据的更好泛化能力以及更快的训练时间。降低模型复杂度:有了信息更丰富的特征,您或许能够用更简单、更易于解释的模型取得良好效果。一个拥有出色特征的线性模型有时可以胜过一个拥有普通特征的复杂黑盒模型。增强可解释性:通过领域专业知识创建的特征可以使模型的预测更易于理解。例如,相比使用原始经纬度,像“到市中心的距离”这样的特征可能更直接地解释。算法兼容性:许多算法都有特定的输入要求。例如,大多数算法预期数值输入。特征工程有助于将不同数据类型(如日期或文本)转换为合适的数值表示。智能处理缺失信息:特征工程可以创建明确表示数据“缺失状态”的特征,而非简单地进行填充,如果该模式本身具有信息价值。核心原则和常用技术特征工程既是一门艺术也是一门科学。它依赖于创造力、领域专业知识和迭代实验。虽然没有万能公式,但一些指导原则和常用技术可以帮助您开始。1. 增强数值特征即使在缩放或标准化(在“数据转换”中讨论过)之后,您通常也可以从数值数据中获得更多价值。多项式特征:如果您怀疑特征 $x$ 与目标变量之间存在非线性关系,您可以创建多项式特征,例如 $x^2$、$x^3$,或交互项,例如 $x_1 \cdot x_2$。例如,一块矩形地块的面积(长 $\times$ 宽)可能比单独考虑长和宽更能预测其价格。变换:应用数学变换,例如对数 ($\log(x)$)、平方根 ($\sqrt{x}$) 或倒数 ($1/x$),可以帮助稳定方差,使分布更接近正态,或使关系线性化。例如,如果一个特征具有非常偏态的分布(例如收入),对数变换通常会很有益。分箱(离散化):如数据转换中所述,将连续数值特征转换为离散箱(一种分类特征)是一种有效技术。这有助于捕获非线性效应或使模型对异常值更具鲁棒性。例如,年龄可以分箱为“0-18”、“19-35”、“36-60”、“60+”。比率和差异:创建表示现有数值特征之间比率或差异的特征可以捕获相对变化或关系。例如,在金融领域,债务收入比可以是一个非常有用的特征。2. 丰富分类特征考虑标准编码技术(如独热编码或标签编码):合并稀疏类别:如果一个分类特征有许多唯一值,其中一些出现频率很低,这些稀有类别可能会增加噪音。您可以将它们归为单个“其他”类别,或根据领域知识进行组合。创建高层类别:如果您有非常细粒度的类别,有时创建更高层级的分组会很有用。例如,具体的职位名称可以归入更广泛的“职业部门”。与其他特征的交互:您可以根据分类特征的组合,或分类特征与数值特征的组合来创建新特征。例如,如果您有“产品类别”和“地区”,您可能会发现“北美电子产品销售”是一个特别强的信号。3. 从日期和时间特征中获取信息原始日期和时间戳很少直接有用。相反,请提取有意义的组成部分:基于时间的组成部分:年、月、当月日期、星期几、一天中的小时、季度,甚至包括“是否是周末?”或“是否是节假日?”的指示符。持续时间和时间差:计算两个日期特征之间经过的时间(例如,“上次购买以来的天数”)或项目的使用时长(“账户时长”)。周期性特征:对于“一天中的小时”或“一年中的月份”这类首尾相接的特征(23:00 接近 00:00),使用正弦和余弦变换可以帮助模型理解这种周期性: $$ \text{特征}{\sin} = \sin(2 \pi \frac{\text{值}}{\text{最大值}}) $$ $$ \text{特征}{\cos} = \cos(2 \pi \frac{\text{值}}{\text{最大值}}) $$ 例如,对于一天中的小时 (0-23),最大值 将是 24。digraph G { rankdir=TB; bgcolor="transparent"; node [shape=box, style="filled,rounded", fillcolor="#e9ecef", fontname="sans-serif", fontsize=10]; edge [fontname="sans-serif", fontsize=10]; RawDate [label="原始日期-时间\n(例如, 2023-10-26 14:30:00)", fillcolor="#a5d8ff"]; Year [label="年份\n(2023)", fillcolor="#d8f5a2"]; Month [label="月份\n(10)", fillcolor="#d8f5a2"]; DayOfWeek [label="星期几\n(星期四)", fillcolor="#c0eb75"]; Hour [label="小时\n(14)", fillcolor="#c0eb75"]; IsWeekend [label="是周末吗?\n(否)", fillcolor="#a9e34b"]; RawDate -> Year; RawDate -> Month; RawDate -> DayOfWeek; RawDate -> Hour; RawDate -> IsWeekend; }从单个日期时间值获取特征的例子。4. 运用领域知识最具影响力的特征通常由此产生。您对问题背景的理解可以指导您创建标准自动化方法可能遗漏的特征。业务规则:如果存在已知的业务规则或阈值,请将其编码为特征。例如,“客户是否符合折扣资格?”外部数据:有时,用外部数据源丰富数据集可以提供新的特征。例如,在冰淇淋销售预测模型中添加天气数据,或将经济指标加入金融预测模型。指示变量:为特定条件或您认为重要的事件创建二元标志(0或1)。例如,“之前购买过”或“商品正在促销”。5. 创建交互特征交互特征捕捉两个或更多特征的组合效应。一个特征的效果可能取决于另一个特征的值。乘积或和:对于数值特征,例如 $X_1 \times X_2$ 或 $X_1 + X_2$。组合分类特征:为现有类别的每个组合创建一个新类别(例如,“男性”和“吸烟者” -> “Male_Smoker”)。请注意,如果原始分类特征有许多级别(高基数),这可能导致特征数量非常庞大。条件特征:结合数值特征和分类特征的特征。例如,特定客户群体的平均购买金额。特征工程的迭代性质特征工程很少是一次性任务。它是一个迭代过程,通常包括:集思广益:根据数据检查(可视化、汇总统计)和领域知识,假设潜在的新特征。创建:实现生成这些新特征的逻辑。测试:使用增强的特征集训练您的机器学习模型。评估:评估模型性能。分析特征重要性或系数(如果您的模型提供这些信息),以了解哪些特征在起作用。改进:根据评估结果,您可能会弃用无益(甚至损害性能)的特征,改进现有特征,或重新思考新想法。这是一个实验的循环。不要害怕尝试各种想法,即使它们起初看起来非传统。然而,始终要使用评估策略(例如在第3章讨论的交叉验证)验证新特征的影响,以避免对训练数据过拟合。当模型过度学习训练数据中的噪声,包括来自过于具体的工程特征的虚假模式时,就会发生过拟合,从而导致在新、未见数据上表现不佳。有效特征工程的心态保持好奇:全面检查您的数据。提出关于不同变量如何相互关联并与目标结果关联的问题。理解您的数据和领域:您越理解数据的背景,就越有可能创建有意义的特征。从简单开始:从显而易见或直接的特征开始,然后逐步增加复杂度。迭代和验证:持续测试您的新特征并验证它们对模型性能的影响。通过理解这些原则,您将更有能力不再仅仅将原始数据输入算法。下一节将指导您使用Julia强大的数据操作能力来实现其中一些特征工程技术。