Генерирование признаков и автообоработка временных рядов

# импортируем необходимые функции из библиотеки
from tsfresh.examples.har_dataset import download_har_dataset, load_har_dataset, load_har_classes
from tsfresh import extract_features, extract_relevant_features, select_features
from tsfresh.utilities.dataframe_functions import impute
from tsfresh.feature_extraction import settings

 

Подробнее https://otus.ru/nest/post/1024/

#сумма, медиана, среднее, длина, стандартное отклонение, дисперсия, максимальное и минимальное значения
settings_minimal = settings.MinimalFCParameters()

#линейный тренд, значение коэффициента R2, intercept, slope, стандартная ошибка, p-value с новыми признаками для объекта

settings_time = settings.TimeBasedFCParameters()
settings_time.update(settings_minimal)

#коэффициенты skewness и kurtosis, считается, сколько раз повторялось значение минимума и максимума, квантили, оконные статистики, автокорреляции и др.

settings_efficient = settings.EfficientFCParameters()

#самый большой и полный вариант

settings_comprehensive = settings.ComprehensiveFCParameters()
len(settings_comprehensive)

data_long = pd.DataFrame({0: data.values.flatten(),
1: np.arange(data.shape[0]).repeat(data.shape[1])})
print(data_long.shape)
data_long.head()

X_train, X_test, y_train, y_test = train_test_split(data, y, test_size=.2)

X = extract_features(data_long, column_id=1, impute_function=impute, default_fc_parameters=settings_efficient)
print(X.shape)

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.2)

relevant_features = set()

for label in y.unique():
# select_features работает с бинарной классификацией, поэтому переводим задачу
# в бинарную для каждого класса и повторяем по всем классам
y_train_binary = y_train == label
X_train_filtered = select_features(X_train, y_train_binary)
relevant_features = relevant_features.union(set(X_train_filtered.columns))

len(relevant_features)

X_train_filtered = X_train[list(relevant_features)]
X_test_filtered = X_test[list(relevant_features)]

cl = DecisionTreeClassifier()
cl.fit(X_train_filtered, y_train)
print(classification_report(y_test, cl.predict(X_test_filtered)))