特征工程机器学习数据分析【免费下载链接】tsfreshAutomatic extraction of relevant features from time series:项目地址https://gitcode.com/gh_mirrors/ts/tsfresh点击查看免费下载导读本文讲解 tsfresh 官方文档中面向滚动 / 时间序列预测Rolling / Time Series Forecasting的完整方案如何通过tsfresh.utilities.dataframe_functions.roll_time_series将一条长时序切成一组逐步右移的短时序窗口再对每个窗口提取 tsfresh 特征从而把预测下一个时刻的值转化为标准的监督学习问题。读完本文你将掌握max_timeshift、min_timeshift、rolling_direction三个窗口参数的语义与源码级实现细节会用make_forecasting_frame一步构造特征容器与目标向量并理解正负滚动方向、子序列命名规则及其在股票价格、工业流式数据等场景中的实战用法。tsfresh 提取的特征可用于时间序列分类、压缩以及预测等多种任务。本文聚焦预测设想你拥有某只股票例如 Apple过去 100 个时间步的价格想要构建一个基于特征feature-based的模型来预测未来价格。如果只删掉今天这一个值、对截至今天的历史序列提取特征来预测今天你只能得到一个训练样本。更聪明的做法是对价格序列的每一天都执行同样的操作——删除当前值对截至该值的历史数据提取特征训练模型去预测被删除的那一天的值。这等价于在排序好的时间序列数据上滑动一个裁切窗口cut-out window每移动一步就用窗口中看到的数据构造一条更短的新时间序列只对它提取特征然后继续滑动。在 tsfresh 中这个过程被称为rolling滚动。一、为什么需要 Rolling从单条时序到多条时序Rolling 的本质是把一条时间序列变成多条时间序列其中每一条都比前一条晚一个或 n 个时间步结束。tsfresh 的滚动工具帮助你把数据重塑成可以直接喂给tsfresh.extract_features的格式也就是说窗口切分与特征提取两个步骤被明确分离。需要特别强调的是这里的 time 并不一定指时钟时间。tsfresh 支持的数据格式见 Data Formats 文档中column_sort列只是给各条测量记录一个顺序状态对时间序列而言它可以是时间维度对其他场景则可以是位置、频率等。1.1 流式数据场景以工业 4.0 为例滚动机制同样适用于流式数据。例如在工业 4.0Industry 4.0应用中你通常一次只收到一行新数据并用它来预测机器故障。为了训练模型你可以假装在流式播放数据先给分类器喂第一个时间步之后的数据再喂前两个时间步之后的数据依此类推——这与滚动窗口的构造方式完全一致。二、数据格式基础回顾rolling 适用于 tsfresh 支持的所有时序格式。以最常见的**扁平 DataFrameFlat DataFrame / 宽表**为例数据包含四种关键列类型column_id标识时间序列所属的实体特征将按 id 分别提取column_sort提供排序依据的值如时间戳省略时假定 DataFrame 已按升序排好column_value/column_kind仅堆叠格式需要分别存放序列值与序列类型名。注意上述任何一列都不允许出现NaN、Inf或-Inf。完整的三种输入格式扁平 DataFrame、堆叠 DataFrame、kind 字典与输出格式说明见 Data Formats 文档滚动函数对这些格式全部兼容。三、滚动机制The Rolling Mechanism逐步演示3.1 构造示例数据考虑下面的扁平 DataFrame两个实体id 1 和 2的两个传感器 x、y分别在 4 个和 2 个时间步上测量idtimexy1115122613371448281012291113生成这段数据的 Python 代码import pandas as pd df pd.DataFrame({ id: [1, 1, 1, 1, 2, 2], time: [1, 2, 3, 4, 8, 9], x: [1, 2, 3, 4, 10, 11], y: [5, 6, 7, 8, 12, 13], })3.2 执行滚动并观察窗口可以想象有一个窗口在时间序列上滑动把窗口内能看到的所有数据都提取出来。窗口有三个可调参数max_timeshift定义窗口最大能有多大。提取出的时间序列长度最多为max_timeshift 1也可能更短因为序列开头的时间戳没有足够的历史值。min_timeshift定义每个窗口的最小尺寸。更短的时间序列通常是序列开头部分会被直接丢弃。rolling_direction高级参数决定沿正sort 递增还是负sort 递减方向滑动。绝大多数场景不需要负方向建议保持默认该参数的绝对值决定每次切窗移动多少步。列参数与常规数据格式一致。对我们的示例数据执行from tsfresh.utilities.dataframe_functions import roll_time_series df_rolled roll_time_series(df, column_idid, column_sorttime)新数据集只包含旧数据集的值但带上了新的 idsort 列的值这里是time会被原样复制。按id分组后你会得到如下窗口分组(1,1)[(time1, x1, y5)]分组(1,2)[(time1, x1, y5), (time2, x2, y6)]分组(1,3)[(time1, x1, y5), (time2, x2, y6), (time3, x3, y7)]分组(1,4)[(time1, x1, y5), (time2, x2, y6), (time3, x3, y7), (time4, x4, y8)]分组(2,8)[(time8, x10, y12)]分组(2,9)[(time8, x10, y12), (time9, x11, y13)]3.3 对滚动结果提取特征滚动完成后即可对每个窗口运行常规的特征提取流程from tsfresh import extract_features df_features extract_features(df_rolled, column_idid, column_sorttime)每个窗口都会得到一组特征可以直接用于训练预测模型。例如对示例数据x__abs_energy与x__absolute_sum_of_changes两列结果如下省略其余特征idx__abs_energyx__absolute_sum_of_changes...(1,1)1.00.0...(1,2)5.01.0...(1,3)14.02.0...(1,4)30.03.0...(2,8)100.00.0...(2,9)221.01.0...例如 id 为(1,3)的特征是用id1截至并包含t3的数据即t1、t2、t3提取出来的。四、用 make_forecasting_frame 一键构建特征矩阵与目标向量如果目标是训练预测模型tsfresh 还提供tsfresh.utilities.dataframe_functions.make_forecasting_frame便捷封装帮你正确对齐目标向量target vector。其思路是紫色的滚动子序列作为构造特征矩阵X的基础f即extract_features函数绿色的数据点是需要被模型预测的值作为目标向量y的行。限制make_forecasting_frame只适用于单条一维时间序列单一 id、单一 kind。from tsfresh.utilities.dataframe_functions import make_forecasting_frame # x 可以是 np.array 或 pd.Series传入 pd.Series 时其 index 会被用作 id df_shift, y make_forecasting_frame( xrange(4), # 单条时序 kindtest, # 时序类型名 max_timeshift1, # 窗口最多包含 2 个历史点 rolling_direction1, # 正向滚动 )从源码实现看tsfresh/utilities/dataframe_functions.py该函数内部做了三件事把输入x包装成{id: id, time: t, value: x, kind: kind}的扁平 DataFramex为pd.Series时t取它的 index否则取range(n)并调用roll_time_series完成滚动通过一个mask_first掩码删除每个窗口的最后一行result[-1] 0其余为 1——因为这一行就是要被预测的目标点不应出现在特征矩阵中以df[value][1:]构建目标向量y第一个点没有历史可预测故剔除把y的索引重写为(id, 时间戳)形式的多元索引并只保留与滚动后df_shift中实际存在的 id 对齐的行。单元测试tests/units/utilities/test_dataframe_functions.py验证了三种输入形态——list、np.arange与带DatetimeIndex的pd.Series——下df/y的精确形状与取值例如xrange(4), max_timeshift1, rolling_direction1时df的 id 为[(id, 1), (id, 2), (id, 3)]、y为[1, 2, 3]test_make_forecasting_frame_feature_extraction还验证了返回的df可直接送入extract_relevant_features完成特征提取与选择。五、参数与实现细节命名规则、正负滚动与边界校验5.1 子序列的命名规则为了标识每一条子序列tsfresh 用将被预测的那个点的时间戳旧 id组成新 id正向滚动positive rollingtimeshift是子序列中最后一个时间戳负向滚动negative rollingtimeshift是子序列中第一个时间戳。例如示例 DataFrame 做负向滚动rolling_direction-1会得到以下窗口可用于用未来值预测当前值如果你的场景合理的话idtimexy(1,1)115(1,1)226(1,1)337(1,1)448(1,2)226(1,2)337(1,2)448(1,3)337(1,3)448(1,4)448(2,8)81012(2,8)91113(2,9)911135.2 参数边界行为使用非默认的max_timeshift或min_timeshift会让提取出的子序列更短甚至被完全移除。例如正向滚动下取min_timeshift 1则(1,1)即id1, timeshift1的窗口会消失——因为它的长度不满足最小尺寸要求。rolling_direction的绝对值大于 1例如 2 或 -2会跳过部分窗口——在这个例子里每隔一个窗口才被保留一次每次移动 2 步。5.3 源码层面的参数校验与实现tsfresh/utilities/dataframe_functions.pyroll_time_series的完整签名如下roll_time_series(df_or_dict, column_id, column_sortNone, column_kindNone, rolling_direction1, max_timeshiftNone, min_timeshift0, chunksizedefaults.CHUNKSIZE, n_jobsdefaults.N_PROCESSES, show_warningsdefaults.SHOW_WARNINGS, disable_progressbardefaults.DISABLE_PROGRESSBAR, distributorNone)从源码可以确认以下行为输入校验rolling_direction 0会抛出ValueError(Rolling direction of 0 is not possible)max_timeshift 0抛出ValueError(max_timeshift needs to be positive!)min_timeshift 0抛出ValueError(min_timeshift needs to be positive or zero!)column_id缺失列时抛AttributeError未传column_id时抛ValueErrorcolumn_sort含NaN时抛ValueError整个容器只有 0 或 1 行时无法滚动抛ValueError。这些校验行为都被 tests/units/utilities/test_dataframe_functions.py 的RollingTestCase.test_with_wrong_input覆盖。排序与均匀采样检查若传了column_sort且其 dtype 不是 object函数会先按column_sort排序然后计算每个 id及 kind分组内相邻 sort 值的差分如果差分不全部相等会发出警告 Your time stamps are not uniformly sampled, which makes rolling nonsensical in some domains.——即滚动假设时序是均匀采样的。窗口切分逻辑核心切分在内部辅助函数_roll_out_time_seriesdataframe_functions.py中完成。正向滚动时窗口右端随timeshift移动shift_from max(shift_until - max_timeshift - 1, 0)负向滚动时窗口左端随timeshift移动shift_from max(timeshift - 1, 0)。max_timeshift未指定时默认取整个分组内最大行数prediction_steps即无限大窗口。并行与分发n_jobs 0或1时使用单进程MapDistributor否则使用多进程MultiprocessingDistributordistributor参数允许你传入自定义分发器参见 tsfresh/utilities/distribution.py例如在集群或 Dask/PySpark 场景下复用大规模并行基础设施。chunksize控制每个 job 处理的窗口数。字典输入若df_or_dict是字典column_kind必须为None否则抛ValueError函数会对每个 kind 递归执行滚动并返回同构的字典。结果所有分片通过pd.concat合并并按[id, column_sort]排序返回。注意该方法一定会生成新的 id六、完整预测流程小结把上述内容串成一条可直接落地的特征级预测管道import pandas as pd from tsfresh import extract_features from tsfresh.utilities.dataframe_functions import make_forecasting_frame # 1. 准备单条时序示例4 个历史点 x pd.Series([0, 1, 2, 3]) # 2. 构造滚动特征容器与目标向量 df_shift, y make_forecasting_frame( xx, kindprice, max_timeshift2, rolling_direction1 ) # 3. 对每个窗口提取特征df_shift 为扁平格式需指定 value/kind 列 X extract_features( df_shift, column_idid, column_sorttime, column_valuevalue, column_kindkind, ) # 4. X 的每一行对应一个截至某时刻的历史窗口特征y 对应待预测值 # 两者按 (id, 时间戳) 多元索引对齐可直接用于训练回归/分类模型要点回顾窗口切分rolling与特征提取extract_features是两个解耦步骤max_timeshift控制窗口上限子序列最长max_timeshift 1min_timeshift过滤过短的窗口rolling_direction的符号控制方向、绝对值控制步长make_forecasting_frame只适用于单一 id 单一 kind 的一维时序且会删除每个窗口的末行以构建严格对齐的(X, y)。对于工业流式数据、股票价格等需要用历史特征预测下一时刻的任务这套机制是 tsfresh 官方推荐的标准数据准备路径。赞分享特征工程机器学习数据分析【免费下载链接】tsfreshAutomatic extraction of relevant features from time series:项目地址https://gitcode.com/gh_mirrors/ts/tsfresh点击查看免费下载相关推荐whichllm命令行详解一文掌握所有参数与高级用法whichllm命令行详解一文掌握所有参数与高级用法 想要在本地硬件上找到最佳运行的大语言模型吗whichllm 是一个强大的开源工具它能自动检测你的硬件人工智能大模型本地部署CLIMindSpore-Lab/consistency路线图未来发展方向与技术展望MindSpore Lab/consistency路线图未来发展方向与技术展望 MindSpore Lab/consistency是一个基于Consisten上一篇Zola 快速上手实战用 zola init 与 Tera 模板从零搭建一个多页面博客站点下一篇CopilotKit Headless 模式完整版Headless Complete实战与验证指南以 Langroid 集成 demo 为例创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
