tsfresh.feature_selection 包

子模块

tsfresh.feature_selection.relevance 模块

包含一种特征选择方法,该方法评估不同提取特征的重要性。为此,对每个特征通过单变量检验评估其对目标的影响,并计算 p 值。计算 p 值的方法称为特征选择器。

然后,Benjamini Hochberg 程序(一种多重检验程序)根据 p 值决定保留哪些特征以及剔除哪些特征。

tsfresh.feature_selection.relevance.calculate_relevance_table(X, y, ml_task='auto', multiclass=False, n_significant=1, n_jobs=1, show_warnings=False, chunksize=None, test_for_binary_target_binary_feature='fisher', test_for_binary_target_real_feature='mann', test_for_real_target_binary_feature='mann', test_for_real_target_real_feature='kendall', fdr_level=0.05, hypotheses_independent=False)

计算特征矩阵 X 中特征相对于目标向量 y 的相关性表。该相关性表是根据预期的机器学习任务 ml_task 计算的。

为此,对输入 pandas.DataFrame 中的每个特征执行单变量特征显著性检验。这些检验生成 p 值,然后通过 Benjamini Hochberg 程序评估这些 p 值,以决定保留哪些特征以及删除哪些特征。

我们检验

H_0 = 该特征不相关,不应添加

对照

H_1 = 该特征相关,应保留

换句话说

H_0 = 目标与特征相互独立 / 该特征对目标没有影响

H_1 = 目标与特征关联 / 相关

当目标是二分类时,这变为

H_0 = \left( F_{\text{target}=1} = F_{\text{target}=0} \right)

H_1 = \left( F_{\text{target}=1} \neq F_{\text{target}=0} \right)

其中 F 是目标的分布。

同样,当特征是二分类时,我们可以陈述假设

H_0 =  \left( T_{\text{feature}=1} = T_{\text{feature}=0} \right)

H_1 = \left( T_{\text{feature}=1} \neq T_{\text{feature}=0} \right)

这里 T 是目标的分布。

TODO: 那么对于实数值呢?

参数:
  • X (pandas.DataFrame) – 特征矩阵,格式如前所述,将仅保留相关特征。可同时包含二分类和实数值特征。

  • y (pandas.Seriesnumpy.ndarray) – 目标向量,用于检验哪些特征是相关的。可以是二分类或实数值。

  • ml_task (str) – 预期的机器学习任务。可以是 ‘classification’ (分类)、‘regression’ (回归) 或 ‘auto’ (自动)。默认为 ‘auto’,表示根据 y 推断预期任务。如果 y 具有布尔、整数或对象 dtype,则假定任务是分类;否则为回归。

  • multiclass (bool) – 问题是否为多分类。这会改变特征选择的方式。多分类要求特征对于预测 n_significant 个类别具有统计显著性。

  • n_significant (int) – 特征应具有统计显著性预测能力的类别数量,以被视为“相关”特征

  • test_for_binary_target_binary_feature (str) – 二分类目标、二分类特征(当前未使用)使用的检验方法

  • test_for_binary_target_real_feature (str) – 二分类目标、实数值特征使用的检验方法

  • test_for_real_target_binary_feature (str) – 实数值目标、二分类特征(当前未使用)使用的检验方法

  • test_for_real_target_real_feature (str) – 实数值目标、实数值特征(当前未使用)使用的检验方法

  • fdr_level (float) – 应遵守的 FDR 水平,这是所有创建特征中不相关特征的理论预期百分比。

  • hypotheses_independent (bool) – 特征的显著性是否可以假定为独立?通常应设为 False,因为特征从未独立(例如,均值和中位数)

  • n_jobs (int) – p 值计算期间使用的进程数

  • show_warnings (bool) – p 值计算期间显示警告(计算器调试所需)。

  • chunksize (Noneint) – 提交给工作进程进行并行化的一个块的大小。其中一个块被定义为一个特征的数据。如果将 chunksize 设置为 10,则意味着一个任务是过滤 10 个特征。如果将其设置为 None,则根据分发器,将使用启发式方法寻找最优块大小。如果遇到内存不足异常,可以尝试使用 dask 分发器和更小的 chunksize。

返回:

一个 pandas.DataFrame,其中输入 DataFrame X 的每一列作为索引,包含该特定特征的显著性信息。该 DataFrame 包含列:“feature”(特征)、“type”(类型,二分类、实数或常数)、“p_value”(该特征作为 p 值的显著性,越低表示越显著)、“relevant”(如果 Benjamini Hochberg 程序对该特征拒绝了零假设 [该特征不相关],则为 True)。如果问题是 n 个类别的 multiclass,则 DataFrame 将包含 n 个名为“p_value_CLASSID”的列,而不是“p_value”列。CLASSID 在此指 y 中设置的不同值。还将有 n 个名为 relevant_CLASSID 的列,表示该特征是否与该类别相关。

返回类型:

pandas.DataFrame

tsfresh.feature_selection.relevance.combine_relevance_tables(relevance_tables)

将相关性表列表聚合成一个组合的相关性表,汇总 p 值和相关性。

参数:

relevance_tables (List[pd.DataFrame]) – 相关性表列表

返回:

组合的相关性表

返回类型:

pandas.DataFrame

tsfresh.feature_selection.relevance.get_feature_type(feature_column)

对于给定的特征,确定它是实数、二分类还是常数。这里的二分类表示特征中只出现两个唯一值。

参数:

feature_column (pandas.Series) – 特征列

返回:

‘constant’(常数)、‘binary’(二分类)或 ‘real’(实数)

tsfresh.feature_selection.relevance.infer_ml_task(y)

推断要选择的机器学习任务。结果将是 ‘regression’(回归)或 ‘classification’(分类)。如果目标向量仅包含整数类型值或对象,则假定任务是 ‘classification’;否则为 ‘regression’

参数:

y (pandas.Series) – 目标向量 y。

返回:

‘classification’ 或 ‘regression’

返回类型:

str

tsfresh.feature_selection.selection 模块

本模块包含提取特征的筛选过程。该筛选过程也可用于非时间序列的特征。

tsfresh.feature_selection.selection.select_features(X, y, test_for_binary_target_binary_feature='fisher', test_for_binary_target_real_feature='mann', test_for_real_target_binary_feature='mann', test_for_real_target_real_feature='kendall', fdr_level=0.05, hypotheses_independent=False, n_jobs=1, show_warnings=False, chunksize=None, ml_task='auto', multiclass=False, n_significant=1)

检查特征矩阵 X 中所有特征(列)的显著性,并返回一个可能已缩减、仅包含相关特征的特征矩阵。

特征矩阵必须是 pandas.DataFrame,格式如下:

索引

feature_1

feature_2

feature_N

A

B

每一列都将被视为一个特征,并检验其对目标的显著性。

目标向量必须是 pandas.Series 或 numpy.array,形式如下:

索引

目标

A

B

.

.

并且必须包含特征矩阵中的所有 id。如果 y 是没有索引的 numpy.array,则假定 y 与 X 具有相同的顺序和长度,并且行相互对应。

示例

>>> from tsfresh.examples import load_robot_execution_failures
>>> from tsfresh import extract_features, select_features
>>> df, y = load_robot_execution_failures()
>>> X_extracted = extract_features(df, column_id='id', column_sort='time')
>>> X_selected = select_features(X_extracted, y)
参数:
  • X (pandas.DataFrame) – 特征矩阵,格式如前所述,将仅保留相关特征。可同时包含二分类和实数值特征。

  • y (pandas.Seriesnumpy.ndarray) – 目标向量,用于检验哪些特征是相关的。可以是二分类或实数值。

  • test_for_binary_target_binary_feature (str) – 二分类目标、二分类特征(当前未使用)使用的检验方法

  • test_for_binary_target_real_feature (str) – 二分类目标、实数值特征使用的检验方法

  • test_for_real_target_binary_feature (str) – 实数值目标、二分类特征(当前未使用)使用的检验方法

  • test_for_real_target_real_feature (str) – 实数值目标、实数值特征(当前未使用)使用的检验方法

  • fdr_level (float) – 应遵守的 FDR 水平,这是所有创建特征中不相关特征的理论预期百分比。

  • hypotheses_independent (bool) – 特征的显著性是否可以假定为独立?通常应设为 False,因为特征从未独立(例如,均值和中位数)

  • n_jobs (int) – p 值计算期间使用的进程数

  • show_warnings (bool) – p 值计算期间显示警告(计算器调试所需)。

  • chunksize (Noneint) – 提交给工作进程进行并行化的一个块的大小。其中一个块被定义为一个特征的数据。如果将 chunksize 设置为 10,则意味着一个任务是过滤 10 个特征。如果将其设置为 None,则根据分发器,将使用启发式方法寻找最优块大小。如果遇到内存不足异常,可以尝试使用 dask 分发器和更小的 chunksize。

  • ml_task (str) – 预期的机器学习任务。可以是 ‘classification’ (分类)、‘regression’ (回归) 或 ‘auto’ (自动)。默认为 ‘auto’,表示根据 y 推断预期任务。如果 y 具有布尔、整数或对象 dtype,则假定任务是分类;否则为回归。

  • multiclass (bool) – 问题是否为多分类。这会改变特征选择的方式。多分类要求特征对于预测 n_significant 个特征具有统计显著性。

  • n_significant (int) – 特征应具有统计显著性预测能力的类别数量,以被视为“相关”。仅在 multiclass=True 时指定

返回:

与 X 相同的 DataFrame,但列数(=特征数)可能已减少。

返回类型:

pandas.DataFrame

抛出异常:

ValueError 当目标向量与特征矩阵不匹配或 ml_task 不是 ‘auto’‘classification’‘regression’ 中的一个时。

tsfresh.feature_selection.significance_tests 模块

包含以下关于 FRESH 算法的论文中的方法 [2]

Fresh 基于假设检验,该检验单独检查每个生成特征对目标的显著性。它确保只保留与当前的回归或分类任务相关的特征。Fresh 根据特征和目标是否为二分类来决定四种设置。

这四个函数名为

  1. target_binary_feature_binary_test():目标和特征均为二分类

  2. target_binary_feature_real_test():目标是二分类,特征是实数

  3. target_real_feature_binary_test():目标是实数,特征是二分类

  4. target_real_feature_real_test():目标和特征均为实数

参考文献

tsfresh.feature_selection.significance_tests.target_binary_feature_binary_test(x, y)

计算二分类特征与二分类目标的特征显著性,得到 p 值。使用 fisher_exact() 的双侧单变量 Fisher 检验。

参数:
  • x (pandas.Series) – 二分类特征向量

  • y (pandas.Series) – 二分类目标向量

返回:

特征显著性检验的 p 值。p 值越低表示特征显著性越高

返回类型:

float

抛出异常:

ValueError 如果目标或特征不是二分类。

tsfresh.feature_selection.significance_tests.target_binary_feature_real_test(x, y, test)

计算实数值特征与二分类目标的特征显著性,得到 p 值。为此,使用 mannwhitneyu()Mann-Whitney U 检验 或 ks_2samp()Kolmogorov Smirnov 检验。

参数:
  • x (pandas.Series) – 实数值特征向量

  • y (pandas.Series) – 二分类目标向量

  • test (str) – 要使用的显著性检验。对于 Mann-Whitney-U 检验使用 'mann',对于 Kolmogorov-Smirnov 检验使用 'smir'

返回:

特征显著性检验的 p 值。p 值越低表示特征显著性越高

返回类型:

float

抛出异常:

ValueError 如果目标不是二分类。

tsfresh.feature_selection.significance_tests.target_real_feature_binary_test(x, y)

计算二分类特征与实数值目标的特征显著性,得到 p 值。为此,使用 ks_2samp()Kolmogorov-Smirnov 检验。

参数:
  • x (pandas.Series) – 二分类特征向量

  • y (pandas.Series) – 实数值目标向量

返回:

特征显著性检验的 p 值。p 值越低表示特征显著性越高。

返回类型:

float

抛出异常:

ValueError 如果特征不是二分类。

tsfresh.feature_selection.significance_tests.target_real_feature_real_test(x, y)

计算实数值特征与实数值目标的特征显著性,得到 p 值。为此,使用 kendalltau()Kendall’s tau

参数:
  • x (pandas.Series) – 实数值特征向量

  • y (pandas.Series) – 实数值目标向量

返回:

特征显著性检验的 p 值。p 值越低表示特征显著性越高。

返回类型:

float

模块内容

feature_selection 模块包含特征选择算法。这些方法适用于从大量特征中挑选出解释性最好的特征。通常,在特征多于样本的情况下需要挑选特征。传统的特征选择方法可能不适合这种情况,因此我们提出一种基于 p 值的方法,该方法单独检查特征的显著性,以避免过拟合和虚假相关性。