特征理解与探索

本节定位
特征工程是机器学习项目里投入产出比最高的环节之一,但它不是一上来就“造新列”。真正的第一步是理解数据:每一列代表什么、分布是否异常、和目标有没有关系、会不会泄漏未来信息。
学习目标
- 掌握数值、类别、时间、文本等常见特征类型
- 能用分布图和统计摘要发现异常、偏斜和缺失
- 能分析特征和目标变量的关系
- 能初步识别冗余特征和目标泄漏风险
先建立一张地图
这一步做得越稳,后面越不容易盲目试模型。很多模型效果差,并不是算法不够高级,而是数据含义、异常值、目标泄漏或训练测试分布差异没有看清。
一、特征类型
不同类型决定了后续处理方式。数值型可能需要缩放或分箱,类别型可能需要编码,时间型常常要拆出周期特征,文本型可能需要向量化或 embedding。
二、快速识别特征类型
import pandas as pd
import seaborn as sns
df = sns.load_dataset("titanic")
print(df.head())
print(df.dtypes)
num_cols = df.select_dtypes(include="number").columns.tolist()
cat_cols = df.select_dtypes(include=["object", "category", "bool"]).columns.tolist()
print("数值特征:", num_cols)
print("类别特征:", cat_cols)
自动识别只是起点,不是最终判断。比如邮编、用户 id、商品 id 可能看起来是数字,但业务上是类别或标识符,不能直接当连续数值使用。
三、分布分析
分布分析要回答三个问题:数值范围是否合理,是否有明显偏斜,是否存在极端值。
import matplotlib.pyplot as plt
num_cols = ["age", "fare", "sibsp", "parch"]
fig, axes = plt.subplots(2, 2, figsize=(12, 8))
for ax, col in zip(axes.ravel(), num_cols):
df[col].hist(bins=30, ax=ax, color="steelblue", edgecolor="white", alpha=0.8)
ax.axvline(df[col].mean(), color="red", linestyle="--", label="mean")
ax.axvline(df[col].median(), color="green", linestyle="--", label="median")
ax.set_title(col)
ax.legend()
plt.tight_layout()
plt.show()
如果均值和中位数差距很大,通常说明分布偏斜。偏斜不一定要处理,但你应该知道它存在。比如收入、消费额、访问次数经常是长尾分布。
四、类别特征分析
类别特征要重点看取值数量、长尾类别和是否有未知类别风险。
for col in ["sex", "embarked", "class"]:
print(col)
print(df[col].value_counts(dropna=False))
如果一个类别特征有上千个取值,直接 one-hot 可能会让特征维度暴涨。如果训练集中没有出现的新类别在测试或线上出现,也需要提前用 handle_unknown="ignore" 这类策略处理。
五、与目标变量的关系
特征探索不能只看单列,还要看它和目标变量的关系。
pd.crosstab(df["sex"], df["survived"], normalize="index")
数值特征可以按目标分组看分布,类别特征可以看不同类别的目标均值。但要小心:相关不等于因果。你看到某个特征和目标关系很强,只能说明它可能有预测价值,还不能说明它导致了结果。