【精选优质专栏推荐】
- 《AI 技术前沿》 —— 紧跟 AI 最新趋势与应用
- 《网络安全新手快速入门(附漏洞挖掘案例)》 —— 零基础安全入门必看
- 《BurpSuite 入门教程(附实战图文)》 —— 渗透测试必备工具详解
- 《网安渗透工具使用教程(全)》 —— 一站式工具手册
- 《CTF 新手入门实战教程》 —— 从题目讲解到实战技巧
- 《前后端项目开发(新手必知必会)》 —— 实战驱动快速上手
每个专栏均配有案例与图文讲解,循序渐进,适合新手与进阶学习者,欢迎订阅。

前言
特征工程有助于提升模型效果。它涉及选择和修改数据,以改进预测结果。本文将解释特征工程及其应用方法,以获得更佳效果。
什么是特征工程?
原始数据通常较为杂乱,无法直接用于预测。特征是数据中的重要细节,它们帮助模型理解并进行预测。特征工程通过改进这些特征,使其更有用。建模过程利用改进后的特征进行结果预测。对模型结果的分析能够提供洞见。经过良好设计的特征能让这些洞见更加清晰,从而帮助更好地理解数据模式并提升模型性能。

为什么特征工程很重要?
-
提高准确率:
优质特征能帮助模型学习更好的模式,从而提升预测准确性。 -
减少过拟合:
更好的特征能帮助模型在新数据上有更好的泛化能力,从而降低过拟合风险。 -
提升算法灵活性:
许多算法在处理干净且准备充分的特征时效果更好。 -
易于解释:
清晰的特征能让人更容易理解模型的决策过程。
特征工程过程
特征工程通常包含以下几个过程:
特征提取:从现有数据中生成新的特征,例如使用 PCA 或嵌入方法。
特征选择:选择最重要的特征来提升模型性能,使模型专注于关键细节。
特征构造:通过已有特征组合或衍生出新的特征,帮助模型做出更好的预测。
特征变换:修改特征以使其更适合模型。例如:
- 归一化:将数值缩放到 0 到 1 的范围内。
- 标准化:调整特征使其均值为 0,标准差为 1。
特征工程技术
以下是一些常见的特征工程技术:
处理缺失值
处理缺失数据对于构建准确模型非常关键。常见方法有:
- 插补(Imputation):用均值、中位数或众数填补缺失值。
- 删除(Deletion):如果缺失数据量较小,可以删除包含缺失值的行或列。
import pandas as pd
from sklearn.impute import SimpleImputer
# 从CSV文件加载数据
df = pd.read_csv('data.csv')
# 清洗前打印数据
print("Data before cleaning:")
print(df.head())
# 去掉“Salary”列中的逗号并转为数值
df['Salary'] = df['Salary'].str.replace(',', '').astype(float)
# 用中位数填补数值型缺失值
imputer = SimpleImputer(strategy='median')
df[['Age', 'Salary']] = imputer.fit_transform(df[['Age', 'Salary']])
# 填补后打印数据
print("\nData after imputing missing values:")
print(df.head())
在上述示例中,“Age” 与 “Salary” 列中的缺失值会被中位数填补。

编码分类变量
在机器学习模型中,分类变量需要转换为数值型。常见方法包括:
- 独热编码(One-Hot Encoding):为每个类别生成新列,每列用 1 或 0 表示该类别是否存在。
- 标签编码(Label Encoding):为每个类别分配一个唯一数字。适用于有序数据(顺序有意义)。
- 二进制编码(Binary Encoding):将类别转换为二进制数,再拆分为多个列。适用于高基数数据。
import pandas as pd
from sklearn.preprocessing import LabelEncoder
# 读取数据集
df = pd.read_csv('data.csv')
# 对 Department 列进行独热编码
df = pd.get_dummies(df, columns=['Department'], drop_first=True)
# 显示编码后的数据
print("Data after encoding categorical variables:")
print(df.head())
在上述示例中,Department 列经过独热编码后被拆分为多个新列,每个列代表一个类别,并以二进制值表示。

分箱(Binning)
分箱是将连续数值划分为离散的区间或范围。它能简化数据,并对噪声数据起到一定缓解作用。
- 等宽分箱(Equal-Width Binning):将数值范围划分为宽度相同的区间,每个值落入某个区间。
- 等频分箱(Equal-Frequency Binning):将数据划分为区间,使每个区间包含大致相同数量的值。
import pandas as pd
# 读取数据集
df = pd.read_csv('data.csv')
# 将 Age 分为 3 个类别(Young, Middle-Aged, Senior)
df['Age_Binned'] = pd.cut(df['Age'], bins=3, labels=['Young', 'Middle-Aged', 'Senior'])
# 显示 Age 与 Age_Binned 列(前5行)
print("Data after binning Age (first 5 rows):")
print(df[['Age', 'Age_Binned']].head())
在上述示例中,Age 被分箱为 “Young”、“Middle-Aged” 或 “Senior” 三类。

处理异常值(Outliers)
异常值是与大多数数据差异较大的点。它们可能影响结果,降低模型性能。常见处理方法:
- 移除(Removal):删除不符合整体模式的极端值。
- 截断(Capping):将极端值限制在最大或最小阈值范围内。
- 变换(Transformation):通过对数变换等方法降低异常值的影响。
import pandas as pd
import numpy as np
from scipy import stats
# 读取数据集
df = pd.read_csv('data.csv')
# 去掉 Salary 列中的逗号并转为数值
df['Salary'] = df['Salary'].str.replace(',', '').astype(float)
# 使用四分位距(IQR)方法检测异常值
Q1 = df['Salary'].quantile(0.25)
Q3 = df['Salary'].quantile(0.75)
IQR = Q3 - Q1
# 定义异常值边界
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
# 标记异常值
df['IQR_Outlier'] = (df['Salary'] < lower_bound) | (df['Salary'] > upper_bound)
# 根据 IQR 移除异常值
df_cleaned_iqr = df[~df['IQR_Outlier']]
# 打印清理后的前5行数据
print(df_cleaned_iqr.head())
上述输出展示了基于四分位距(IQR)方法移除异常值后的数据集,这些行不再包含超出定义边界的工资记录。

缩放(Scaling)
缩放用于调整特征值的范围,确保各特征在模型训练中贡献均衡。
- 归一化(Normalization):将数值缩放到固定范围,通常为 0 到 1。例如:最小-最大(Min-Max)缩放。
- 标准化(Standardization):以均值为 0、标准差为 1 对数据进行缩放。例如:Z-score 标准化。
import pandas as pd
from sklearn.preprocessing import MinMaxScaler, StandardScaler
# 读取数据集
df = pd.read_csv('data.csv')
# 去掉 Salary 列中的逗号并转为数值
df['Salary'] = df['Salary'].str.replace(',', '').astype(float)
# 归一化(Min-Max Scaling)
min_max_scaler = MinMaxScaler()
df[['Salary_Norm', 'Age_Norm']] = min_max_scaler.fit_transform(df[['Salary', 'Age']])
# 标准化(Z-score Normalization)
standard_scaler = StandardScaler()
df[['Salary_Std', 'Age_Std']] = standard_scaler.fit_transform(df[['Salary', 'Age']])
# 打印原始数据前5行
print("Original Data:")
print(df[['EmployeeID', 'Salary', 'Age']].head())
# 打印归一化结果前5行
print("\nData after normalization (Min-Max Scaling):")
print(df[['EmployeeID', 'Salary_Norm', 'Age_Norm']].head())
# 打印标准化结果前5行
print("\nData after standardization (Z-score Normalization):")
print(df[['EmployeeID', 'Salary_Std', 'Age_Std']].head())
在该示例中:
- Salary 和 Age 经过 Min-Max 缩放 得到 Salary_Norm 与 Age_Norm。
- 同时,这些特征也通过 Z-score 标准化 得到 Salary_Std 与 Age_Std。

特征工程最佳实践
以下是一些提升特征工程效果的建议:
- 迭代与实验:特征工程通常是一个迭代过程。尝试不同的转换与交互,并通过交叉验证进行验证。
- 工具自动化:利用 Featuretools 等工具实现自动化特征工程,或使用 AutoML 框架执行特征选择与转换。
- 理解特征影响:始终跟踪新特征对模型性能的影响。有时复杂特征带来的收益可能并不如预期。
- 利用领域知识:结合领域专家的见解,创建能捕捉行业特有模式与细节的特征。这能提供宝贵的上下文并提升模型相关性。
总结
特征工程有助于提升机器学习模型的性能,使数据更具价值。通过创建和选择合适的特征,可以获得更准确的预测。这一过程是机器学习成功的关键。

1333

被折叠的 条评论
为什么被折叠?



