1

我使用了 sktime 库的 TimeSeriesForestClassifier 类来执行多元时间序列分类。

代码如下

import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.pipeline import Pipeline

from sktime.classification.compose import ColumnEnsembleClassifier
from sktime.classification.interval_based import TimeSeriesForestClassifier
from sktime.datasets import load_basic_motions
from sktime.transformations.panel.compose import ColumnConcatenator

X, y = load_basic_motions(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)

steps = [
    ("concatenate", ColumnConcatenator()),
    ("classify", TimeSeriesForestClassifier(n_estimators=100)),
]
clf = Pipeline(steps)
clf.fit(X_train, y_train)
clf.score(X_test, y_test)

我想检查feature_importances_的值,它与输入的长度不同,而是一个与特征数长度相同的数组。

clf.steps[1][1].feature_importances_

我想知道每个重要性对应于输入的哪一部分。有什么方法可以获取有关 TimeSeriesForestClassifier 计算特征的输入部分的信息?

4

1 回答 1

1

您可以从以下位置获取集合中每棵树的间隔(开始和结束索引):

clf.steps[1][1].intervals_

sktime 现在还实现了更新的Canonical Interval Forecast

当我们第一次实现时间序列森林算法时,我们最终得到了两个版本。您正在使用的是推荐的,但旧版本为特征重要性图提供了自己的功能(见下文)。

import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.pipeline import Pipeline

from sktime.classification.compose import ColumnEnsembleClassifier
from sktime.classification.compose import ComposableTimeSeriesForestClassifier
from sktime.datasets import load_basic_motions
from sktime.transformations.panel.compose import ColumnConcatenator

X, y = load_basic_motions(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)

steps = [
    ("concatenate", ColumnConcatenator()),
    ("classify", ComposableTimeSeriesForestClassifier(n_estimators=100)),
]
clf = Pipeline(steps)
clf.fit(X_train, y_train)
clf.score(X_test, y_test)

clf.steps[-1][-1].feature_importances_.rename(columns={"_slope": "slope"}).plot(xlabel="time", ylabel="feature importance")

在此处输入图像描述

在计算和解释特征重要性时要注意一些微妙的问题。相关问题在这里:

于 2021-12-04T00:57:14.913 回答