决策树特征#

class feature_engine.creation.DecisionTreeFeatures(variables=None, features_to_combine=None, precision=None, cv=3, scoring='neg_mean_squared_error', param_grid=None, regression=True, random_state=0, missing_values='raise', drop_original=False)[源代码][源代码]#

DecisionTreeFeatures() 向数据中添加新变量,这些变量是由使用一个或多个特征训练的决策树的输出结果。

由决策树预测结果产生的特征很可能与目标呈单调关系,因此可以提高线性模型的性能。在各种特征上训练的决策树所产生的特征可以帮助捕捉到简单模型可能遗漏的特征交互。

DecisionTreeFeatures() 仅适用于数值变量。你可以传递一个变量列表作为决策树的输入。或者,转换器将自动选择并组合所有数值变量。

在使用此转换器之前,应先对缺失数据进行插补。

更多详情请参见 用户指南

参数
变量: 列表, 默认=无

要转换的数值变量的列表。如果为 None,转换器将自动查找并选择所有数值变量。

features_to_combine: 整数, 列表或元组, 默认=None

用于确定如何通过使用决策树将`variables`中指示的变量组合以获得新特征。如果为`integer`,则该值对应于特征之间允许的最大组合大小。例如,如果你想组合三个变量,[“var_A”, “var_B”, “var_C”],并且:

  • features_to_combine = 1,转换器基于此返回新的特征。

    基于每个单独变量训练的决策树的预测,生成3个新特征。

  • features_to_combine = 2,转换器返回特征来自

    features_to_combine=1,加上基于决策树对所有可能的两变量组合的预测结果生成的新特征,即(“var_A”,“var_B”),(“var_A”,“var_C”),和(“var_B”,“var_C”),总共生成6个新特征。

  • features_to_combine = 3,转换器返回特征来自

    features_to_combine=2,再加上基于对3个变量[“var_A”, “var_B”, “var_C”]训练的决策预测的额外特征,总共生成7个新特征。

如果是 list,该列表必须包含整数,表示应作为决策树输入的特征数量。例如,如果数据有 4 个变量,[“var_A”, “var_B”, “var_C”, “var_D”],并且 features_to_combine = [2,3],那么将返回所有可能的 2 个和 3 个变量的组合。这将产生以下组合:(“var_A”, “var_B”), (“var_A”, “var_C”), (“var_A”, “var_D”), (“var_B”, “var_C”), (“var_B”, “var_D”), (“var_C”, “var_D”), (“var_A”, “var_B”, “var_C”), (“var_A”, “var_B”, “var_D”), (“var_A”, “var_C”, “var_D”), 和 (“var_B”, “var_C”, “var_D”)。

|

如果 tuple,该元组必须包含字符串和/或元组,指示如何组合变量以创建新特征。例如,如果 features_to_combine=("var_C", ("var_A", "var_C"), "var_C", ("var_B", "var_D"),那么,转换器将基于元组中的每个值训练决策树,从而生成4个新特征。

|

如果 None,那么转换器将创建所有可能的 1 个或更多特征的组合,并将这些组合作为决策树的输入。这等同于传递一个等于要组合的变量数量的整数。

精度: int, 默认=None

预测的精度。换句话说,新特征值在小数点后的位数。

cv: int, 交叉验证生成器或可迭代对象, 默认=3

确定交叉验证的分割策略。cv 的可能输入包括:

对于int/None输入,如果估计器是分类器且y是二分类或多分类,则使用StratifiedKFold。在所有其他情况下,使用KFold。这些分割器以`shuffle=False`实例化,因此分割将在多次调用中保持一致。更多详情请查看Scikit-learn的`cross_validate`文档。

scoring: str, 默认=’neg_mean_squared_error’

期望的指标以优化树的性能。来自sklearn.metrics。更多选项请参见DecisionTreeRegressor或DecisionTreeClassifier模型评估文档:https://scikit-learn.org/stable/modules/model_evaluation.html

param_grid: 字典, 默认=None

用于决策树的网格搜索的超参数。param_grid 可以包含 Scikit-learn 的 DecisionTreeRegressor() 或 DecisionTreeClassifier() 允许的任何超参数。如果为 None,则 param_grid 将在 [1, 2, 3, 4] 上优化 ‘max_depth’。

回归: 布尔值, 默认=True

指示离散器是否应该训练回归或分类决策树。

random_stateint, 默认=None

用于初始化决策树训练的 random_state。它是 Scikit-learn 的 DecisionTreeRegressor() 或 DecisionTreeClassifier() 的参数之一。为了可重复性,建议将 random_state 设置为一个整数。

missing_values: string, default=’raise’

指示是否应忽略缺失值或引发异常。如果设置为 'raise',当 fittransform 的数据集包含缺失值时,转换器将返回错误。如果设置为 'ignore',在学习参数或执行转换时将忽略缺失数据。

drop_original: bool, default=False

如果为 True,则转换的原始变量将从数据框中删除。

属性
变量_

将要被转换的变量组。

input_features_ = list

包含用于创建新特征的所有特征组合的列表。

estimators_: 列表

在特征组合上训练的决策树。

feature_names_in_:

列出在 fit 过程中看到的特征名称。

n_features_in_:

在拟合中使用的训练集中的特征数量。

参考文献

1

Niculescu-Mizil 等人。“通过集成选择赢得KDD杯Orange挑战赛”。JMLR: 研讨会和会议论文集 7: 23-34. KDD 2009 http://proceedings.mlr.press/v7/niculescu09/niculescu09.pdf

示例

>>> import pandas as pd
>>> from feature_engine.creation import DecisionTreeFeatures
>>> X = dict()
>>> X["Name"] = ["tom", "nick", "krish", "megan", "peter",
>>>              "jordan", "fred", "sam", "alexa", "brittany"]
>>> X["Age"] = [20, 44, 19, 33, 51, 40, 41, 37, 30, 54]
>>> X["Height"] = [164, 150, 178, 158, 188, 190, 168, 174, 176, 171]
>>> X["Marks"] = [1.0, 0.8, 0.6, 0.1, 0.3, 0.4, 0.8, 0.6, 0.5, 0.2]
>>> X = pd.DataFrame(X)
>>> y = pd.Series([4.1, 5.8, 3.9, 6.2, 4.3, 4.5, 7.2, 4.4, 4.1, 6.7])
>>> dtf = DecisionTreeFeatures(features_to_combine=2)
>>> dtf.fit(X, y)
>>> dtf.transform(X)
           Name  Age  Height  ...  tree(['Age', 'Height'])  tree(['Age', 'Marks'])
0       tom   20     164  ...                    4.100                     4.2
1      nick   44     150  ...                    6.475                     5.6
2     krish   19     178  ...                    4.000                     4.2
3     megan   33     158  ...                    6.475                     6.2
4     peter   51     188  ...                    4.400                     5.6
5    jordan   40     190  ...                    4.400                     4.2
6      fred   41     168  ...                    6.475                     7.2
7       sam   37     174  ...                    4.400                     4.2
8     alexa   30     176  ...                    4.000                     4.2
9  brittany   54     171  ...                    6.475                     5.6
   tree(['Height', 'Marks'])
0             6.00
1             6.00
2             4.24
3             6.00
4             4.24
5             4.24
6             6.00
7             4.24
8             4.24
9             6.00

方法

拟合:

训练决策树。

fit_transform:

拟合数据,然后进行转换。

get_feature_names_out:

获取转换后的输出特征名称。

get_params:

获取此估计器的参数。

设置参数:

设置此估计器的参数。

转换:

创建新功能。

fit(X, y)[源代码][源代码]#

基于输入变量组合,使用交叉验证和网格搜索来拟合决策树的超参数。

参数
X: pandas 数据框,形状为 [n_samples, n_features]

训练输入样本。可以是整个数据框,而不仅仅是需要转换的变量。

y: pandas Series 或 np.array = [n_samples,]

用于训练决策树的目标变量。

fit_transform(X, y=None, **fit_params)[源代码]#

拟合数据,然后进行转换。

使用可选参数 fit_params 将变换器拟合到 Xy,并返回 X 的变换版本。

参数
X类似数组的形状 (n_samples, n_features)

输入样本。

y类数组的形状 (n_samples,) 或 (n_samples, n_outputs),默认=None

目标值(无监督变换为None)。

**拟合参数dict

附加的拟合参数。

返回
X_newndarray 数组,形状为 (n_samples, n_features_new)

转换后的数组。

get_feature_names_out(input_features=None)[源代码]#

获取转换后的特征名称。换句话说,返回转换后的数据框的变量名称。

参数
input_features数组或列表,默认=None

此参数仅为了与 Scikit-learn 管道兼容而存在。

  • 如果 None,则使用 feature_names_in_ 作为特征名称。

  • 如果是一个数组或列表,那么 input_features 必须与 feature_names_in_ 匹配。

返回
feature_names_out: 列表

转换后的特征名称。

rtype

List[Union[str, int]] ..

get_metadata_routing()[源代码]#

获取此对象的元数据路由。

请查看 用户指南 以了解路由机制的工作原理。

返回
路由MetadataRequest

一个封装了路由信息的 MetadataRequest

get_params(deep=True)[源代码]#

获取此估计器的参数。

参数
深度bool, 默认=True

如果为真,将返回此估计器及其包含的作为估计器的子对象的参数。

返回
参数dict

参数名称映射到它们的值。

set_params(**params)[源代码]#

设置此估计器的参数。

该方法适用于简单的估计器以及嵌套对象(如 Pipeline)。后者的参数形式为 <component>__<parameter>,因此可以更新嵌套对象的每个组件。

参数
**参数dict

估计器参数。

返回
自身估计器实例

估计器实例。

transform(X)[源代码][源代码]#

创建并添加新变量。

参数
X: 羞耻的 Pandas DataFrame = [n_samples, n_features]

要转换的数据。

返回
X_new: Pandas 数据框。

原始数据框加上新特征,或者仅包含新特征的数据框。

rtype

DataFrame ..