特征提取控制通过消除系统中的冗余特征和噪声来选择重要且有用的特征,以产生最佳预测输出。
动机 - 为什么需要提取特征?
特征提取仍然是机器学习算法中用于识别强弱相关属性的最初步步骤之一。虽然在特征工程期间使用许多特征提取算法来进行标准分类和回归问题,但是对于时间序列分类和回归问题,每个标签或回归目标同时与多个时间序列和元信息相关联,问题变得越来越困难。
这样的场景在从工业重型制造设备,机械,物联网中获得的大型数据集中非常普遍,这些数据集经常进行维护或优化生产线优化,在不同的时间序列中展示不同的成功和失败指标。
本文的主要目标仍然是了解从多个时间序列中提取相关特征的过程以及使用真实数据集的模型。结构如下:
- 评估时间序列特征提取对分类和回归问题的重要性。
- 模拟工业应用中机器人执行失败率的实际用例。
- 在分布式实时环境中突出显示模型的优点。
什么是时间序列数据的特征提取及其重要性?
特征提取控制通过消除系统中的冗余特征和噪声来选择重要且有用的特征,以产生最佳预测输出。在时间序列数据的背景下,它旨在:
- 从时间序列中提取特征特征,例如最小值,最大值,平均值,百分位数或其他数学推导。
- 从位于不同时间序列尺度的分布式异构信息源中整合特征提取和选择过程,以预测目标输出。
- 允许基于其相关性从提取的特征中进行时间序列聚类(非监督学习)。
- 提取的相关和非相关特征可以帮助我们在分类和回归建模中识别时间序列属性和维度的有新见解。
?工业大数据,机器人和其他信息资源来产生大量的有不同速度与变异性(不一致)和真实性(不精确)的信息。需要仔细地合并和集成这些数据,以通过分析和提取不同时间间隔中最有意义的特征来预测系统状态。
特征提取与选择过程
下图说明了特征提取和选择过程中涉及的步骤。使用特征提取来组合现有特征以生成更有用的特征,特征选择有助于选择在现有特征中进行训练的最有用特征。
图1给出了使用来自n个不同时间序列的数学运算创建特征集的详细理解,然后是特征聚合和特征重要性/相关性测试,以对它们进行排序并到达最终选择的特征列表。图2给出了完整过程的高级表示,涵盖了可在可伸缩分布式环境中使用的特征工程,排名和测试过程。
Tsfresh及其用法
我们使用Tsfresh来建模时间序列特征提取和相关性测试。Tsfresh是一种高效,可扩展的特征提取算法,用于时间序列分类或回归问题。该算法在ML管道的开头构建有特征重要性过滤器,根据其重要性分数提取相关特征。
Tsfresh的算法可以概括为:
- 通过考虑其他功能和元信息来建立功能映射。
- 通过量化其预测目标输出的重要性的p值独立评估每个单独的特征向量。
- 应用于工业过程 - 可能包括预测机器的寿命,预测连铸过程中钢坯的质量,预测机器人和IIoT传感器的成功和失败率。
建模实际用例
在这里,我们模拟通过传感器读数获得的机器人执行失败率。从这5个不同的数据源收集并合并的执行状态:
- 掌握位置的方法失败。
- 部件转移失败。
- 转移失败后部件的位置。
- 接近ungrasp位置的失败。
- 部分运动失败
?此外,该数据集是多变量的,由6个不同的时间序列数据组成。
每个特征都是数字,表示故障检测后测量的力或扭矩; 每个故障实例的特征在于在故障检测后立即开始以规则的时间间隔收集的15个力或扭矩样本,每个故障实例的总观察窗口为315毫秒。
安装:
Installation : pip install tsfresh import tsfresh.examples.robot_execution_failures as robot robot.download_robot_execution_failures() df_ts, y = robot.load_robot_execution_failures() print(df_ts.head()) print(y.tail())
每次观察6个不同的时间序列
为了隔离和单独查看不成功的操作的成功操作,使用两个不同的图和两个不同的ID。
normal = df_ts[df_ts.id == 3][['time', 'F_x', 'F_y', 'F_z', 'T_x', 'T_y', 'T_z']] normal[['time', 'F_x', 'F_y', 'F_z', 'T_x', 'T_y', 'T_z']].plot(x="time", kind="line") plt.title('Success example (id 3)') plt.savefig('normal.png')
failure = df_ts[df_ts.id == 20][['time', 'F_x', 'F_y', 'F_z', 'T_x', 'T_y', 'T_z']] failure[['time', 'F_x', 'F_y', 'F_z', 'T_x', 'T_y', 'T_z']].plot(x="time", kind="line") plt.title('Success example (id 20)') plt.savefig('failure.png')
在下一步中,从6个不同的时间序列中提取相关的特征集并显示。一些功能包括范围计数,标准偏差,方差,自相关,线性趋势,分位数和分位数的变化。
from tsfresh import extract_relevant_features X = extract_relevant_features(df_ts, y, column_id='id', column_sort='time') print(X.info()) print(X.head())
特征意义和相关性
特征显着性由显着性测试确定,这些显着性测试帮助我们确定是否可以拒绝或接受给定特征的零假设。
在时间序列特征提取的上下文中,错误添加的特征是特征Xφ,即使Hφ0为真,零假设Hφ0也被相应的特征重要性测试拒绝。这种假阳性结果的风险是通过针对个体特征调整的假设检验来完成的。
然而,当同时比较多个假设和特征时,推理中的误差倾向于累积。在多次测试中,所有拒绝中的错误拒绝的预期比例称为错误发现率(FDR),其作为过滤特征提取中的最后一个组件。
p值(称为特征选择器)有助于确定在控制FDR时拒绝哪些假设。对于每个特征,进行单变量特征选择测试,其产生p值,然后由Benjamini Hochberg过程评估以确定要保留哪些特征以及删除哪些特征。
FDR_LEVEL = 0.05 X = extract_features(df_ts, column_id='id', column_sort='time', X_selected = select_features(X, y) print(X.shape) print(X_selected.shape) default_fc_parameters=ComprehensiveFCParameters(), impute_function=impute) X = X.loc[:, X.apply(pd.Series.nunique) != 1] df_pvalues_mann = calculate_relevance_table(X, y, fdr_level=FDR_LEVEL, test_for_binary_target_real_feature='mann') print("Total \t", len(df_pvalues_mann)) print("Relevant \t", (df_pvalues_mann["relevant"] == True).sum()) print(Irrelevant \t", (df_pvalues_mann["relevant"] == False).sum(), "( # constant", (df_pvalues_mann["type"] == "const").sum(), ")") (88, 1968) (88, 631) # 631 features selected from 1968 Total 1968 Relevant 631 Irrelevant 1337
具有p-score(使用Mann-Whitney)列表的相关特征集由下式给出:
具有p-score(使用Mann-Whitney)列表的不相关特征集由下式给出:
Mann-Whitney U检验是对独立样本t检验的非参数替代检验。它用于比较来自相同总体的两个样本均值,并用于测试两个样本均值是否相等。
在tsfresh中使用Mann-Whitney U检验来计算二元目标的实值特征的特征重要性作为p值。
? m = len(df_pvalues_mann.loc[~(df_pvalues_mann.type == "const")]) K = list(range(1, m + 1)) C = [sum([1.0 / i for i in range(1, k + 1)]) for k in K] rejection_line_mann = [defaults.FDR_LEVEL * k / m * 1.0 / c for k, c in zip(K, C)] df_pvalues_mann.index = pd.Series(range(0, len(df_pvalues_mann.index))) df_pvalues_mann.p_value.where(df_pvalues_mann.relevant)\ .plot(style=".", label="relevant features") df_pvalues_mann.p_value.where(~df_pvalues_mann.relevant & (df_pvalues_mann.type != "const"))\ .plot(style=".", label="irrelevant features") df_pvalues_mann.p_value.fillna(1).where(df_pvalues_mann.type == "const")\ .plot(style=".", label="irrelevant (constant) features") plt.plot(rejection_line_mann, label="rejection line (FDR = " + str(FDR_LEVEL) + ")") plt.xlabel("Feature #") plt.ylabel("p-value") plt.title("Mann-Whitney-U") plt.legend() plt.plot()
选择时,fdr_level是一个要调整的超参数。它是所有创建的特征中不相关特征的理论预期百分比。默认情况下,它设置为5%。但是,它可能需要增加到0.9,具体取决于所选分类器如何处理非信息功能。
功能重要性过滤器也可以应用于标准分类或回归算法。在这里,我使用RandomForestClassifier来评估要素重要性。
clf = RandomForestClassifier() clf.fit(X,y) importance = pd.Series(clf.feature_importances_) importance.sort_values(ascending = False) print(importance)
提取的特征系数表示其重要性
通过条形图绘制相对要素重要性,可得出以下特征重要性图。
imp_frame = importance.to_frame() imp_frame.plot(kind = “bar”) plt.xticks([]) plt.xlabel('Features') plt.ylabel('Importances') plt.title('Feature Importance Plot') plt.savefig('importance.png')
分类
标准分类器Logistic回归,Boosting和Bagging可应用于提取的特征集(X)。在将选定的特征集(X)拆分为训练和测试子集之后,我们使用RandomForestClassifier来说明机器人执行失败和成功类。
from sklearn.ensemble import RandomForestClassifier from sklearn.metrics import classification_report testtrain_xy = train_test_split(X, y,test_size=.4,random_state=50) X_train, X_test, y_train, y_test = testtrain_xy print(X_train.shape, X_test.shape, y_train.shape, y_test.shape)
(52,631)(36,631)(52,)(36,)
在测试数据集上评估训练的分类器,以通过精确度,召回率和f1分数来评估其性能。
clf = RandomForestClassifier() clf.fit(X_train, y_train) y_pred = clf.predict(X_test) print(classification_report(y_test, y_pred)) print(np.sum(y_test == y_pred), y_test.shape)
from sklearn.model_selection import cross_val_predict predicted = cross_val_predict(clf, X, y, cv=5) print(classification_report(y, predicted))
进一步的特征提取和模型分类也可以使用scikit-learn的Pipeline进行,FeatureAugmentor在开始时跟随任何分类器如RandomForest。
from sklearn.pipeline import Pipeline from sklearn.ensemble import RandomForestClassifier from tsfresh.transformers import RelevantFeatureAugmenter
?在拟合阶段,计算由set_params函数设置的所有可能的时间序列特征(如果未通过传递feature_extraction_settings对象手动更改特征)。然后,使用统计方法计算它们对目标的重要性和相关性,并且通过应用合适的算法(如Benjamini Hochberg)程序仅选择相关的那些。
在变换步骤(fit_transform)中,使用关于哪些特征与拟合步骤相关的信息,并且从时间序列中提取这些特征。然后将这些提取的特征添加到输入到分类器的输入数据样本中。
pipeline = Pipeline([('augmenter', RelevantFeatureAugmenter(column_id='id', column_sort='time')), ('classifier', RandomForestClassifier())]) X = pd.DataFrame(index=y.index) pipeline.set_params(augmenter__timeseries_container=df_ts) pipeline.fit(X_train, y_train) y_pred = pipeline.predict(X_test) print(classification_report(y_test, y_pred))
管道中具有时间序列特征提取的精度,召回,F分数(RelevantFeatureAugmentor和RandomForestClassifier)
结论
该模型可用于分布式工业大数据应用,用于以下目的:
- 除了几个元信息之外,它还允许考虑每个标签的几种不同的时间序列类型。
- 并行分布式功能有助于功能提取和过滤可扩展。数据在分布式架构中处理,用于在广泛的基础架构上分散数据,限制数据聚合和集中式基础架构上的处理。
- 它允许从更专业的机器学习算法轻松组合特定于域的和可能的有状态特征映射。
- 该算法有助于对具有有限领域知识和低计算复杂度的不同工业大数据用例进行建模。
- 该模型与样本数和时间序列长度成线性比例。