
特征工程的完整指南,以获得更好的模型性能
特征工程有助于提高模型的性能。它涉及选择和修改数据以改进预测。本文解释了特征工程以及如何使用它来获得更好的结果。
什么是特征工程?
原始数据通常是混乱的,未准备好进行预测。特征是数据中的重要细节。它们有助于模型理解和进行预测。特征工程改进了这些特征,使它们更有用。建模使用这些改进的特征来预测结果。分析模型的结果可以提供见解。精心设计的特征使这些见解更清晰。这有助于您更好地理解数据模式并提高模型性能。

为什么特征工程很重要?
- 提高准确性:良好的特征有助于模型学习更好的模式。这可以带来更准确的预测。
- 减少过拟合:更好的特征有助于模型很好地泛化到新数据。这降低了过拟合的几率。
- 算法灵活性:许多算法在使用干净且准备充分的特征时表现更好。
- 易于解释:清晰的特征使理解模型如何做出决策变得更容易。
特征工程过程
特征工程可能涉及几个过程
- 特征提取:从现有数据中创建新特征。使用 PCA 或嵌入等方法来实现此目的。
- 特征选择:选择最重要的特征来帮助您的模型更好地工作。这使模型专注于重要的细节。
- 特征创建:从现有特征创建新特征,以帮助模型做出更好的预测。这为模型提供了更多有用信息。
- 特征转换:修改特征以使其更适合模型。归一化将值缩放到 0 到 1 的范围内。标准化将特征调整为均值为 0,标准差为 1。
特征工程技术
让我们讨论一些常见的特征工程技术。
处理缺失值
处理缺失值对于构建准确的模型很重要。以下是一些删除它们的方法
- 插补:使用均值、中位数或众数等方法,根据列中的其他数据填补缺失值。
- 删除:如果缺失值数量很少且不会显着影响分析,则删除包含缺失值的行或列。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
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”列中的缺失值已用中位数填充。

对分类变量进行编码
分类变量需要转换为数值,以便机器学习模型使用。以下是一些常用方法
- 独热编码:为每个类别生成新列。每个类别都有自己的列,值为 1 或 0。
- 标签编码:为每个类别分配一个唯一的数字。适用于顺序很重要(序数数据)的数据。
- 二进制编码:将类别转换为二进制数,然后拆分为单独的列。此方法适用于基数较高的数据。
|
1 2 3 4 5 6 7 8 9 10 11 12 |
import pandas as pd 从 sklearn.preprocessing 导入 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”列被分成新的列。每列代表一个类别,值为二进制。

分箱
分箱将连续值分组到离散的箱或范围内。它简化了数据,并有助于处理噪声数据。
- 等宽分箱:将范围分成等宽的区间。每个值都落入这些区间之一。
- 等频分箱:将数据分成箱,使每个箱具有大致相同数量的值。
|
1 2 3 4 5 6 7 8 9 10 11 |
import pandas as pd # 加载数据集 df = pd.read_csv('data.csv') # 将年龄分为 3 类(年轻、中年、老年) 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()) |
在这里,年龄根据分箱被归类为“年轻”、“中年”或“老年”。

处理异常值
异常值是与其他数据点不同的数据点。它们可能会扰乱结果并影响模型的性能。以下是一些处理异常值的常用方法
- 移除:排除不符合总体模式的极端值。
- 截尾:将极端值限制在最大或最小阈值。
- 转换:使用对数转换等技术来减少异常值的影响。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
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)方法移除异常值后的数据集。这些行不再包含超出定义的异常值边界的薪资条目。

缩放
缩放调整特征值的范围。它确保特征在模型训练中做出相等的贡献。
- 归一化:将值重新缩放到一个范围,通常是 0 到 1。例如:最小-最大缩放。
- 标准化:将值中心化在均值 0 附近,并按标准差进行缩放。例如:Z 分数归一化。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
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_scaler = MinMaxScaler() df[['Salary_Norm', 'Age_Norm']] = min_max_scaler.fit_transform(df[['Salary', 'Age']]) # 标准化特征(Z 分数归一化) 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”,生成 Salary_Norm 和 Age_Norm。它还使用 Z 分数归一化标准化了这些特征。

特征工程最佳实践
以下是一些改进特征工程的技巧
- 迭代和实验:特征工程通常是一个迭代过程。测试不同的转换和交互,并使用交叉验证对其进行验证。
- 工具自动化:使用 Featuretools 等工具进行自动化特征工程,或使用执行特征选择和转换的 AutoML 框架。
- 了解特征的影响:始终跟踪新特征对模型性能的影响。有时,复杂的特征可能不像预期那样提供好处。
- 利用领域知识:结合领域专家的见解来创建捕捉行业特定模式和细微差别的特征。这可以提供有价值的上下文并提高模型的相关性。
结论
特征工程有助于改进机器学习模型。它使您的数据更有用。通过创建和选择正确的特征,您可以获得更好的预测。此过程是机器学习成功的关键。






暂无评论。