数学特征#

MathFeatures() 对特征组应用基本函数,返回一个或多个额外的变量作为结果。它使用 pandas.agg() 来创建特征,因此本质上,你可以传递任何被该方法接受的函数。一个例外是,MathFeatures() 不接受字典作为参数 func

函数可以作为字符串传递,numpy 方法,即 np.mean,或者您创建的任何函数,只要它从向量返回一个标量。

有关支持的聚合函数,请参阅 pandas 文档

作为一个例子,如果我们有变量:

  • number_payments_first_quarter

  • number_payments_second_quarter

  • number_payments_third_quarter

  • number_payments_fourth_quarter

我们可以使用 MathFeatures() 来计算总支付次数和平均支付次数,如下所示:

transformer = MathFeatures(
    variables=[
        'number_payments_first_quarter',
        'number_payments_second_quarter',
        'number_payments_third_quarter',
        'number_payments_fourth_quarter'
    ],
    func=['sum','mean'],
    new_variables_name=[
        'total_number_payments',
        'mean_number_payments'
    ]
)

Xt = transformer.fit_transform(X)

转换后的数据集 Xt 将包含额外的特征 total_number_paymentsmean_number_payments,以及原始的变量集。

变量 total_number_payments 是通过将 variables 中指示的特征相加得到的,而变量 mean_number_payments 是这4个特征的平均值。

示例#

让我们深入探讨如何更详细地使用 MathFeatures()。首先,让我们创建一个玩具数据集:

import numpy as np
import pandas as pd
from feature_engine.creation import MathFeatures

df = pd.DataFrame.from_dict(
    {
        "Name": ["tom", "nick", "krish", "jack"],
        "City": ["London", "Manchester", "Liverpool", "Bristol"],
        "Age": [20, 21, 19, 18],
        "Marks": [0.9, 0.8, 0.7, 0.6],
        "dob": pd.date_range("2020-02-24", periods=4, freq="T"),
    })

print(df)

数据集看起来是这样的:

    Name        City  Age  Marks                 dob
0    tom      London   20    0.9 2020-02-24 00:00:00
1   nick  Manchester   21    0.8 2020-02-24 00:01:00
2  krish   Liverpool   19    0.7 2020-02-24 00:02:00
3   jack     Bristol   18    0.6 2020-02-24 00:03:00

我们现在可以使用字符串来指示函数,对数值变量 Age 和 Marks 应用多个函数:

transformer = MathFeatures(
    variables=["Age", "Marks"],
    func = ["sum", "prod", "min", "max", "std"],
)

df_t = transformer.fit_transform(df)

print(df_t)

我们得到了以下数据集,其中新变量以用于获取它们的函数命名,再加上用于计算的变量组:

    Name        City  Age  Marks                 dob  sum_Age_Marks  \
0    tom      London   20    0.9 2020-02-24 00:00:00           20.9
1   nick  Manchester   21    0.8 2020-02-24 00:01:00           21.8
2  krish   Liverpool   19    0.7 2020-02-24 00:02:00           19.7
3   jack     Bristol   18    0.6 2020-02-24 00:03:00           18.6

   prod_Age_Marks  min_Age_Marks  max_Age_Marks  std_Age_Marks
0            18.0            0.9           20.0      13.505740
1            16.8            0.8           21.0      14.283557
2            13.3            0.7           19.0      12.940054
3            10.8            0.6           18.0      12.303658

为了更灵活,我们可以将现有函数传递给 func 参数,如下所示:

transformer = MathFeatures(
    variables=["Age", "Marks"],
    func = [np.sum, np.prod, np.min, np.max, np.std],
)

df_t = transformer.fit_transform(df)

print(df_t)

我们得到以下数据框:

    Name        City  Age  Marks                 dob  sum_Age_Marks  \
0    tom      London   20    0.9 2020-02-24 00:00:00           20.9
1   nick  Manchester   21    0.8 2020-02-24 00:01:00           21.8
2  krish   Liverpool   19    0.7 2020-02-24 00:02:00           19.7
3   jack     Bristol   18    0.6 2020-02-24 00:03:00           18.6

   prod_Age_Marks  amin_Age_Marks  amax_Age_Marks  std_Age_Marks
0            18.0             0.9            20.0      13.505740
1            16.8             0.8            21.0      14.283557
2            13.3             0.7            19.0      12.940054
3            10.8             0.6            18.0      12.303658

我们可以选择将参数 drop_original 设置为 True,以在执行计算后删除变量。

我们可以如下获取转换数据中所有特征的名称:

transformer.get_feature_names_out(input_features=None)

这将返回转换数据中所有变量的名称:

['Name',
 'City',
 'Age',
 'Marks',
 'dob',
 'sum_Age_Marks',
 'prod_Age_Marks',
 'amin_Age_Marks',
 'amax_Age_Marks',
 'std_Age_Marks']

新变量名#

尽管transformer允许自动组合变量,但其使用旨在结合领域知识来组合变量。在这种情况下,我们通常希望为变量赋予有意义的名称。我们可以通过参数 new_variables_names 来实现这一点。

new_variables_names 接受一个字符串列表,其中包含新变量的名称。在这个参数中,您需要输入为新创建的特征命名的列表。您必须为 func 参数中指示的每个函数输入一个名称。也就是说,如果您想执行特征的均值和总和,您应该输入 2 个新变量名称。如果您只计算特征的均值,请输入 1 个变量名称。

变量的名称应与 func 中函数的顺序一致。也就是说,如果你设置 func = ['mean', 'prod'],第一个新变量名称将被分配给变量的均值,第二个变量名称将被分配给变量的乘积。

让我们看一个例子。在下面的代码片段中,我们将两个变量相加,并找出它们的最大值和最小值,这产生了3个新的特征。我们在一个列表中添加了新特征的名称:

transformer = MathFeatures(
    variables=["Age", "Marks"],
    func = ["sum", "min", "max"],
    new_variables_names = ["sum_vars", "min_vars", "max_vars"]
)

df_t = transformer.fit_transform(df)

print(df_t)

生成的数据框包含我们在变量名下提供的新特征:

    Name        City  Age  Marks                 dob  sum_vars  min_vars  \
0    tom      London   20    0.9 2020-02-24 00:00:00      20.9       0.9
1   nick  Manchester   21    0.8 2020-02-24 00:01:00      21.8       0.8
2  krish   Liverpool   19    0.7 2020-02-24 00:02:00      19.7       0.7
3   jack     Bristol   18    0.6 2020-02-24 00:03:00      18.6       0.6

   max_vars
0      20.0
1      21.0
2      19.0
3      18.0

其他资源#

有关此方法和其他特征工程方法的更多详细信息,请查看以下资源:

../../_images/feml.png

机器学习的特征工程#











或者阅读我们的书:

../../_images/cookbook.png

Python 特征工程手册#














我们的书籍和课程都适合初学者和更高级的数据科学家。通过购买它们,您正在支持 Feature-engine 的主要开发者 Sole。