本节你会学到
- 说清楚「特征工程是什么?模型为什么不能直接理解原始数据」解决的核心问题
- 知道它在「传统机器学习基础(21~34)」中的位置
- 把 特征工程、机器学习、分类与回归 这些关键词联系起来
特征工程不是随便增加几列,而是把原始业务数据整理成模型能稳定学习的信号。
学习路线:传统机器学习基础(21~34) · 第 24 课
补齐文本分类项目背后的数据处理、算法、评估和模型选择知识。
学完本阶段你能做到:拿到一份结构化表格数据,独立完成清洗、特征工程、建模、评估、模型选择和保存,并用规范流程比较多个算法。
推荐读法:建议系统读。做项目时遇到数据和模型选择问题,也可以按需回查。
查看完整阶段 · 14 篇先看目标,再带着问题读正文。读完后用练习确认自己真的理解了。
合格答案不是复述标题,而是说清它在“数据进入模型、模型学习、结果评估或项目落地”中的作用。
它应该为下一课「类别特征如何处理:Label Encoding 与 One-Hot Encoding」铺路:读完后要知道下一课为什么自然出现。
学完数据清洗以后,下一步不是马上选算法,而是把数据变成模型能真正学习的样子。
很多初学者会把“有数据”和“能训练”看成一件事。其实不是。原始数据只是业务记录,它里面有文字、日期、类别、单位、缺失、重复和各种隐含含义。模型并不理解这些业务语言,它只会根据输入的特征去学习统计关系。
特征工程就是把原始数据转换成模型能理解、能学习、能泛化的输入信息。
比如一张用户表里有这些字段:
注册时间、城市、年龄、会员等级、最近一次购买时间、总消费金额
这些字段直接丢给模型,未必好用。我们可能需要把它们处理成:
注册天数、是否一线城市、年龄分组、会员等级编码、距离上次购买天数、平均客单价
这一步就是特征工程。
它不是为了让表格看起来更复杂,而是为了把更有预测价值的信息放到模型面前。
人看到“会员等级=黄金会员”,会自然理解它代表更高价值或更高活跃度。
但模型看到的是输入矩阵。它并不知道“黄金会员”比“普通会员”意味着什么,除非我们把这个信息转换成合适的数字形式。
再比如“注册时间”这个字段,人能理解早注册的用户可能更稳定;模型却不能直接从一个日期字符串里理解“老用户”这个概念。我们需要把日期拆成模型能用的特征:
import pandas as pd
df["register_date"] = pd.to_datetime(df["register_date"])
df["days_since_register"] = (pd.Timestamp("2026-06-25") - df["register_date"]).dt.days
这样模型拿到的就不是一个复杂日期,而是一个明确的数字:这个用户注册了多少天。
特征工程可以先分成三类。
第一类是选择特征。
不是所有字段都应该进入模型。明显无关的字段、唯一 ID、泄露答案的字段,都要谨慎处理。
比如预测用户是否会购买时,如果把“是否已经付款”放进特征里,模型当然会很准,但这已经把答案提前告诉模型了。
第二类是转换特征。
常见转换包括:
第三类是构造特征。
构造特征就是从已有字段里组合出新信息。比如:
df["avg_order_value"] = df["total_amount"] / df["order_count"]
df["is_high_value_user"] = df["total_amount"] > 1000
df["days_since_last_order"] = (
pd.Timestamp("2026-06-25") - pd.to_datetime(df["last_order_date"])
).dt.days
这些新字段往往比原始字段更接近业务问题。
假设我们要预测一个用户是否会复购,原始数据长这样:
user_id, city, member_level, total_amount, order_count, last_order_date, repurchase
可以先做一版简单特征:
import pandas as pd
df = pd.read_csv("users.csv")
df["last_order_date"] = pd.to_datetime(df["last_order_date"])
df["days_since_last_order"] = (
pd.Timestamp("2026-06-25") - df["last_order_date"]
).dt.days
df["avg_order_value"] = df["total_amount"] / df["order_count"].replace(0, 1)
df = pd.get_dummies(df, columns=["city", "member_level"], drop_first=True)
X = df.drop(columns=["user_id", "last_order_date", "repurchase"])
y = df["repurchase"]
这段代码做了几件事:
X 和标签 y。这才是模型真正开始学习前要做的准备。
第一个坑是数据泄漏。
如果某个特征包含未来信息,模型在测试集上会表现得非常好,但上线后效果会崩。比如预测用户是否会流失时,把“流失后客服回访次数”放进特征里,就是泄漏。
第二个坑是训练和预测规则不一致。
训练时怎么编码、怎么填缺失、怎么缩放,上线预测时也必须完全一样。否则模型拿到的输入分布就变了。
第三个坑是只追求复杂特征。
特征不是越多越好。无关特征会增加噪声,重复特征会让模型更不稳定。好的特征应该解释得通、能重复生成、在新数据上仍然存在。
特征工程是从数据清洗走向建模的关键步骤。
这一课先记住四句话:
下一课我们继续处理一类非常常见的特征:类别特征。重点讲 Label Encoding 和 One-Hot Encoding 到底怎么选。
留言讨论