Классификация временных рядов - очень плохие результаты

11

Я работаю над проблемой классификации временных рядов, когда вводом являются данные об использовании голоса во временных рядах (в секундах) за первые 21 день использования учетной записи мобильного телефона. Соответствующей целевой переменной является ли эта учетная запись отменена в диапазоне 35-45 дней. Так что это проблема бинарной классификации.

Я получаю очень плохие результаты от всех методов, которые я пробовал до сих пор (в разной степени). Сначала я попробовал классификацию k-NN (с различными модификациями) и получил очень плохие результаты. Это привело меня к извлечению признаков из временного ряда - то есть среднего значения, дисперсии, максимума, минимума, дней с полным нулем, дней с полным нулевым трейлингом, разницы между первым полусредним и вторым полусредним и т. Д. дни с нулями и общее количество дней с трейлингом (с использованием нескольких алгоритмов классификации). Это показало лучшее, но выступление было не очень хорошим.

Моя следующая стратегия состояла в том, чтобы пересмотреть негативные примеры в моем тренировочном наборе, так как их было очень мало. Это привело к более правильному прогнозу отмены, но за счет большего количества ложных срабатываний.

Я начинаю думать, что, возможно, сами данные использования временных рядов просто не очень предсказуемы (хотя здравый смысл говорит, что так и должно быть). Возможно, есть какая-то скрытая переменная, которую я не рассматриваю. Просмотр данных также показывает странное поведение. то есть некоторые примеры показывают очень небольшое или уменьшающееся использование (или иногда вообще ничего) и не отменяют, а некоторые показывают увеличение использования, которое отменяет. Возможно, это противоречивое поведение не создает четкой границы решения для классификатора.

Другим возможным источником ошибки является тот факт, что многие обучающие примеры очень редки (например, много дней с использованием 0). Одна идея, которую я еще не попробовал, - это разбить временные ряды на сегменты и создать некоторые функции таким образом, но я не возлагаю больших надежд.

user1893354
источник
1
Для начала рекомендую попробовать варианты следующего.1. Агрегируйте данные об использовании по часам / дням. 2. Исходя из данных тренировок, наложите графики этих временных рядов, чтобы увидеть схемы в этих двух группах. 3. Изучите различные модели временных рядов / регрессии, которые хорошо соответствуют вашим данным. 4. Используйте коэффициенты модели как функции для вашего классификатора.
ramhiser
Мне нравится ваша техника извлечения признаков. Я попробую. Я убедился, что мои данные слишком скудны, чтобы найти шаблоны, но кто знает. Благодаря!
user1893354

Ответы:

13

Я довольно успешно применял KNN с динамическим искажением времени в качестве метрики расстояния.

Мое исследование (pdf) показывает, что этот подход очень трудно победить. Ниже приведена схема из моей реализации на Python KNN и DTW на github . Или просмотреть в IPython Notebook

KNN и DTW

Если вы обучаете массиву данных очень большого размера, я предлагаю выполнить иерархическую кластеризацию матрицы расстояний. Затем выполните выборку из желаемых кластеров, чтобы получить меньший набор данных для обучения. Это hclustобеспечит наличие у вас временных рядов, которые представляют широкий диапазон характеристик временных рядов в ваших данных.

Марк Реган
источник
4
Не могли бы вы обновить ссылку на вашу исследовательскую работу?
тилапримера
10

Два подхода к классификации временных рядов

Есть два способа справиться с временным структурированным вводом для задач классификации:

  1. Модель выделенного временного ряда: алгоритм машинного обучения включает в себя временные ряды напрямую. Я считаю KNN с моделью DTW в этой категории.
  2. Подход, основанный на особенностях: здесь временные ряды отображаются в другое, возможно, низкоразмерное представление. Это означает, что алгоритм извлечения признаков рассчитывает такие характеристики, как среднее или максимальное значение временного ряда. Затем функции передаются в виде матрицы признаков в «нормальное» машинное обучение, такое как нейронная сеть, случайный лес или машина опорных векторов. Этот подход имеет преимущество лучшей объяснимости результатов. Кроме того, это позволяет нам использовать хорошо разработанную теорию контролируемого машинного обучения.

В прошлом я также успешно развертывал KNN с DTW. Тем не менее, я почти всегда был в состоянии превзойти его точность с моделью, которая использует хорошо разработанные функции. Кроме того, KNN с DTW для двоичных классификаций масштабируется с O (n_t · m_ {train} · m_ {test}), где n_t - длина временного ряда, mtrain и mtest - количество устройств в наборе train и test соответственно. , Это означает, что расчеты занимают довольно много времени ..

Поэтому я бы порекомендовал использовать функциональный подход.

Цфреш рассчитывает огромное количество функций

Пакет python tsfresh вычисляет огромное количество таких функций из pandas.DataFrame, содержащей временные ряды. Вы можете найти его документацию на http://tsfresh.readthedocs.io .

введите описание изображения здесь

Вы можете попробовать это, чтобы рассчитать огромное количество функций. Позже вы сможете отфильтровать функции по их значимости и выявить перспективных кандидатов.

Отказ от ответственности: я один из авторов tsfresh.

MaxBenChrist
источник
Большое спасибо за ваш замечательный пост. У меня действительно небольшой временной ряд (например, 10 точек данных за временной ряд). В таком случае, вы бы порекомендовали использовать tsfresh для моего набора данных? Спасибо :)
EmJ