功能创建#
特征创建是数据预处理中的常见步骤,包括从数据集的原始特征构建新变量。通过结合两个或多个变量,我们开发的新特征可以提高机器学习模型的性能,捕捉变量之间的额外信息或关系,或者在我们工作的领域内更有意义。
数据科学中最常见的特征创建方法之一是 独热编码 ,这是一种特征工程技术,用于将分类特征转换为多个代表每个类别的二进制变量。
另一个常见的特征提取过程包括从时间序列数据的过去值中创建新特征,例如通过使用滞后和窗口。
一般来说,创建特征需要一定的领域知识,并且需要投入大量时间来分析原始数据,包括评估数据集中自变量或预测变量与因变量或目标变量之间的关系。
特征创建可以是特征工程中更具创造性的方面之一,新特征可以帮助提高预测模型的性能。
最后,数据科学家应该注意,创建新特征可能会显著增加数据集的维度。例如,对高基数分类特征进行独热编码会产生大量的二进制变量,高次多项式组合也是如此。这可能会对所使用的机器学习算法产生下游影响。例如,决策树以无法处理大量特征而闻名。
使用 Feature-engine 创建新特征#
Feature-engine 有几个转换器可以创建并添加新特征到数据集中。其中最流行的一个是 OneHotEncoder,它可以从分类特征中创建虚拟变量。
通过 Feature-engine,我们还可以通过使用 LagFeatures 或 WindowFeatures 从时间序列数据中创建新的特征,通过滞后和窗口。
Feature-engine 的创建模块支持通过不同的数学或统计操作组合现有特征,或通过特征转换来创建和添加新特征到 pandas DataFrame 的转换器。这些转换器操作于数值变量,即具有整数和浮点数据类型的变量。
Feature-engine 的特征创建转换器概述:
CyclicalFeatures - 对每个变量应用正弦和余弦三角函数操作,从而创建两个新特征。
MathFeatures - 通过应用基本数学函数(如求和、均值、最大值或标准差)将一组特征组合成新的变量。
RelativeFeatures - 利用一组变量与一个或多个参考特征之间的基本数学函数,将新生成的特征附加到 pandas 数据框中。
DecisionTreeFeatures - 基于一个或多个特征组合训练的决策树创建新特征作为输出。
实践中的特征工程#
在这里,你将体验到来自 Feature-engine 的特征创建模块中的转换器。我们将使用葡萄酒质量数据集。该数据集由 11 个特征组成,包括 alcohol、ash 和 flavonoids,并以 quality 作为其目标变量。
通过探索性数据分析和我们的领域知识,包括现实世界的实验,即品尝各种品牌/类型的葡萄酒,我们相信通过将原始特征与各种数学运算相结合,可以创建更好的特征来训练我们的算法。
让我们从 Scikit-learn 加载数据集。
import pandas as pd
from sklearn.datasets import load_wine
from feature_engine.creation import RelativeFeatures, MathFeatures
X, y = load_wine(return_X_y=True, as_frame=True)
print(X.head())
下面我们看到的是葡萄酒质量数据集:
alcohol malic_acid ash alcalinity_of_ash magnesium total_phenols \
0 14.23 1.71 2.43 15.6 127.0 2.80
1 13.20 1.78 2.14 11.2 100.0 2.65
2 13.16 2.36 2.67 18.6 101.0 2.80
3 14.37 1.95 2.50 16.8 113.0 3.85
4 13.24 2.59 2.87 21.0 118.0 2.80
flavanoids nonflavanoid_phenols proanthocyanins color_intensity hue \
0 3.06 0.28 2.29 5.64 1.04
1 2.76 0.26 1.28 4.38 1.05
2 3.24 0.30 2.81 5.68 1.03
3 3.49 0.24 2.18 7.80 0.86
4 2.69 0.39 1.82 4.32 1.04
od280/od315_of_diluted_wines proline
0 3.92 1065.0
1 3.40 1050.0
2 3.17 1185.0
3 3.45 1480.0
4 2.93 735.0
现在,我们通过从总酚中去除非类黄酮酚来创建一个新特征,以获得非类黄酮的酚。
rf = RelativeFeatures(
variables=["total_phenols"],
reference=["nonflavanoid_phenols"],
func=["sub"],
)
rf.fit(X)
X_tr = rf.transform(X)
print(X_tr.head())
我们在 pandas 数据框的右侧看到新功能及其数据点:
alcohol malic_acid ash alcalinity_of_ash magnesium total_phenols \
0 14.23 1.71 2.43 15.6 127.0 2.80
1 13.20 1.78 2.14 11.2 100.0 2.65
2 13.16 2.36 2.67 18.6 101.0 2.80
3 14.37 1.95 2.50 16.8 113.0 3.85
4 13.24 2.59 2.87 21.0 118.0 2.80
flavanoids nonflavanoid_phenols proanthocyanins color_intensity hue \
0 3.06 0.28 2.29 5.64 1.04
1 2.76 0.26 1.28 4.38 1.05
2 3.24 0.30 2.81 5.68 1.03
3 3.49 0.24 2.18 7.80 0.86
4 2.69 0.39 1.82 4.32 1.04
od280/od315_of_diluted_wines proline \
0 3.92 1065.0
1 3.40 1050.0
2 3.17 1185.0
3 3.45 1480.0
4 2.93 735.0
total_phenols_sub_nonflavanoid_phenols
0 2.52
1 2.39
2 2.50
3 3.61
4 2.41
现在让我们通过结合3个现有变量的子集来创建新特征:
mf = MathFeatures(
variables=["flavanoids", "proanthocyanins", "proline"],
func=["sum", "mean"],
)
mf.fit(X_tr)
X_tr = mf.transform(X_tr)
print(X_tr.head())
我们在生成的 pandas 数据框右侧看到新功能:
alcohol malic_acid ash alcalinity_of_ash magnesium total_phenols \
0 14.23 1.71 2.43 15.6 127.0 2.80
1 13.20 1.78 2.14 11.2 100.0 2.65
2 13.16 2.36 2.67 18.6 101.0 2.80
3 14.37 1.95 2.50 16.8 113.0 3.85
4 13.24 2.59 2.87 21.0 118.0 2.80
flavanoids nonflavanoid_phenols proanthocyanins color_intensity hue \
0 3.06 0.28 2.29 5.64 1.04
1 2.76 0.26 1.28 4.38 1.05
2 3.24 0.30 2.81 5.68 1.03
3 3.49 0.24 2.18 7.80 0.86
4 2.69 0.39 1.82 4.32 1.04
od280/od315_of_diluted_wines proline \
0 3.92 1065.0
1 3.40 1050.0
2 3.17 1185.0
3 3.45 1480.0
4 2.93 735.0
total_phenols_sub_nonflavanoid_phenols \
0 2.52
1 2.39
2 2.50
3 3.61
4 2.41
sum_flavanoids_proanthocyanins_proline \
0 1070.35
1 1054.04
2 1191.05
3 1485.67
4 739.51
mean_flavanoids_proanthocyanins_proline
0 356.783333
1 351.346667
2 397.016667
3 495.223333
4 246.503333
在上面的例子中,我们使用了 RelativeFeature() 和 MathFeatures 对输入数据进行自动特征工程,通过在 variables 和 reference 参数中识别的特征上应用 func 参数中定义的变换。
现在可以使用原始和新特征来训练回归模型,或用于预测葡萄酒 质量 的多类分类算法。
摘要#
通过特征工程和特征创建,我们可以优化机器学习算法的学习过程并提高其性能指标。
我们强烈建议基于领域知识、探索性数据分析和深入的数据挖掘来创建特征。我们也理解这并不总是可能的,特别是在处理大数据集和每个项目分配的有限时间时。在这种情况下,我们可以将特征创建与特征选择过程结合起来,让机器学习算法选择最适合它们的内容。
祝你的模型好运!

