数学特征#
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_payments 和 mean_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
其他资源#
有关此方法和其他特征工程方法的更多详细信息,请查看以下资源:
或者阅读我们的书:
我们的书籍和课程都适合初学者和更高级的数据科学家。通过购买它们,您正在支持 Feature-engine 的主要开发者 Sole。