特征工程
发布: (2025年12月17日 GMT+8 14:57)
4 min read
原文: Dev.to
Source: Dev.to
什么是特征工程?
- 特征 只是一列数据(例如,年龄、工资、购买次数)。
- 特征工程 指创建、修改或选择合适的特征,使模型学习得更好。
- 可以把它想象成烹饪前的食材准备——需要把食材清洗、切碎,才能做出美味的菜肴。
为什么需要特征工程?
- 原始数据往往杂乱、不完整或格式不合适。
- 良好的特征帮助算法更清晰地捕捉模式。
- 更好的特征 → 更好的预测、更快的训练和更高的准确性。
常见的特征工程技术
| 技术 | 含义 | 简单示例 |
|---|---|---|
| 处理缺失值 | 填补空白或删除不完整的数据 | 用平均年龄替换缺失的年龄 |
| 编码分类数据 | 将文本标签转换为数字 | “红、蓝、绿” → 0, 1, 2 |
| 缩放/归一化 | 将数值放在相似的范围内 | 薪资 (₹10,000–₹1,00,000) 缩放到 0–1 |
| 特征创建 | 将已有数据组合或转换为新特征 | 从“出生日期” → 创建“年龄” |
| 特征选择 | 只保留最有用的特征 | 删除无关列,如“用户ID” |
| 分箱 | 将连续值分组为类别 | 年龄 0–12 = 儿童, 13–19 = 青少年, 20+ = 成人 |
简单示例
想象你有以下数据集:
| 姓名 | 出生日期 | 薪资 | 城市 |
|---|---|---|---|
| Alice | 1995-06-12 | 50,000 | Delhi |
| Bob | 1988-03-05 | 80,000 | Mumbai |
特征工程后:
- 年龄 由出生日期计算得出。
- 城市 被编码为数字(Delhi = 0,Mumbai = 1)。
- 薪资 被缩放到 0 到 1 之间。
现在数据更干净,模型更容易理解。
关键要点
- 特征工程 = 准备和改进数据特征。
- 它让模型更智能,预测更准确。
- 核心技术包括处理缺失值、编码、缩放、创建新特征以及选择最佳特征。
Python 中的特征工程
确保已安装 pandas 和 scikit-learn:
pip install pandas scikit-learn
import pandas as pd
from sklearn.preprocessing import LabelEncoder, MinMaxScaler
# Example dataset
data = {
'Name': ['Alice', 'Bob', 'Charlie'],
'Date_of_Birth': ['1995-06-12', '1988-03-05', '2000-12-20'],
'Salary': [50000, 80000, None], # Missing value
'City': ['Delhi', 'Mumbai', 'Delhi']
}
df = pd.DataFrame(data)
print("Original Data:\n", df)
# 🔹 Handling Missing Values
df['Salary'].fillna(df['Salary'].mean(), inplace=True)
# 🔹 Feature Creation (Age from Date of Birth)
df['Date_of_Birth'] = pd.to_datetime(df['Date_of_Birth'])
df['Age'] = pd.Timestamp.now().year - df['Date_of_Birth'].dt.year
# 🔹 Encoding Categorical Data (City)
label_encoder = LabelEncoder()
df['City_encoded'] = label_encoder.fit_transform(df['City'])
# 🔹 Scaling Numerical Data (Salary)
scaler = MinMaxScaler()
df['Salary_scaled'] = scaler.fit_transform(df[['Salary']])
print("\nAfter Feature Engineering:\n", df)
代码功能说明
- 通过填充平均薪资来处理缺失值。
- 从
Date_of_Birth创建新特征(年龄)。 - 将分类数据(城市)编码为数字。
- 将数值数据(薪资)缩放到 0 到 1 之间。
最后说明
可以把特征工程想象成打磨钻石。原石(数据)本身有价值,但通过塑形和精炼(特征)才能释放其真正的光彩。