如何在 sklearn 中使用时间序列数据进行分类

Posted

技术标签:

【中文标题】如何在 sklearn 中使用时间序列数据进行分类【英文标题】:How to use time-series data in classification in sklearn 【发布时间】:2019-12-13 17:07:19 【问题描述】:

我有一个时间序列数据集,如下所示,我为每个传感器记录了 2 个时间序列。 Label 列描述了传感器是否有故障(即01)。

sensor, time-series 1, time-series 2, Label
x1, [38, 38, 35, 33, 32], [18, 18, 12, 11, 09], 1
x2, [33, 32, 35, 36, 32], [13, 12, 15, 16, 12], 0
and so on ..

目前,我正在考虑来自两个时间序列的不同特征(例如,最小值、最大值、中值、斜率等),并考虑在 sklearn 中的随机森林分类器中对它们进行如下分类。

df = pd.read_csv(input_file)
X = df[[myfeatures]]
y = df['Label']

#Random Forest classifier
clf=RandomForestClassifier(random_state = 42, class_weight="balanced", criterion = 'gini', max_depth = 3, max_features = 'auto', n_estimators = 500)

k_fold = StratifiedKFold(n_splits=10, shuffle=True, random_state=0)

output = cross_validate(clf, X, y, cv=k_fold, scoring = 'roc_auc', return_estimator =True)
for idx,estimator in enumerate(output['estimator']):
    print("Features sorted by their score for estimator :".format(idx))
    feature_temp_importances = pd.DataFrame(estimator.feature_importances_,
                                       index = mylist,
                                        columns=['importance']).sort_values('importance', ascending=False)
    print(feature_temp_importances)

但是,我的结果非常低。我想知道是否可以将时间序列数据原样提供给random forest 分类器。例如,将x1 特征赋予为[38, 38, 35, 33, 32], [18, 18, 12, 11, 09]。如果可能的话,我想知道如何在 sklearn 中做到这一点?

如果需要,我很乐意提供更多详细信息。

【问题讨论】:

你试过滞后吗? @BlueSheepToken 感谢您的评论。我是时间序列分类的新手。所以,我不确定你所说的滞后是什么意思。你能给我更多的细节吗? :) 【参考方案1】:

如果您想将整个时间序列提供给模型并使用它来进行预测,您应该尝试使用 RNN。

如果您想继续使用 sklearn,另一种选择是将滚动平均值或滚动标准应用于您的时间序列,因此时间 t 的 x 将受时间 t - 1 的 x 影响,依此类推。 通过这种相关性,您将能够将每个点分类到特定的类别,从而对对应点的主要标签的整个时间序列进行分类。

【讨论】:

感谢您的回答。如果你能告诉我我如何在 sklearn 中做 rolling mean or rolling std,那将是非常棒的,因为我是时间序列的新手,并且对时间序列中的这些术语也很陌生 :) 这篇文章可能对machinelearningmastery.com/…有帮助【参考方案2】:

是的,您可以使用整个时间序列数据作为分类器的特征。

为此,只需使用原始数据,连接每个传感器的 2 个时间序列并将其输入分类器。

from sklearn.model_selection import StratifiedKFold, cross_validate
from sklearn.ensemble import RandomForestClassifier
import numpy as np

n_samples = 100

# generates 2 n_samples random time series with integer values from 0 to 100.
x1 = np.array([np.random.randint(0, 100, 5) for _ in range(n_samples)])
x2 = np.array([np.random.randint(0, 100, 5) for _ in range(n_samples)])

X = np.hstack((x1, x2))


# generates n_samples random binary labels.
y = np.random.randint(0, 2, n_samples)

#Random Forest classifier
clf=RandomForestClassifier(random_state = 42, class_weight="balanced", criterion = 'gini', max_depth = 3, max_features = 'auto', n_estimators = 500)

k_fold = StratifiedKFold(n_splits=10, shuffle=True, random_state=0)

output = cross_validate(clf, X, y, cv=k_fold, scoring = 'roc_auc', return_estimator =True)

但是,您可能不想使用具有这些功能的随机森林。看看 LSTM 甚至 1-D CNN,它们可能更适合这种使用整个时间序列作为输入的方法。

【讨论】:

以上是关于如何在 sklearn 中使用时间序列数据进行分类的主要内容,如果未能解决你的问题,请参考以下文章

在 sklearn 逻辑回归中使用分类数据作为特征

使用sklearn进行高斯朴素贝叶斯分类的数据类型,如何清理数据[重复]

使用 SKlearn 进行多标签分类 - 如何使用验证集?

使用 sklearn 或 pandas 进行一次热编码后,如何在混合数据集(数值 + 分类)上应用 KNN

如何在 sklearn 中使用训练有素的 NB 分类器预测电子邮件的标签?

使用 sklearn 进行音乐流派分类:如何准确评估不同的模型