Машинне навчання - функціонує інженерія з даних дати / часу


45

Які спільні / найкращі практики для обробки даних про час застосування машинного навчання?

Наприклад, якщо в наборі даних є стовпець із часовою позначкою події, наприклад "2014-05-05", як ви можете витягти корисні функції з цього стовпця, якщо такі є?

Спасибі заздалегідь!

Відповіді:


44

Я б почав з графіки часової змінної та інших змінних і шукав тенденції.

Наприклад

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

У цьому випадку спостерігається періодична тижнева тенденція і довгострокова тенденція зростання. Отже, ви хочете кодувати дві змінні часу:

  • day_of_week
  • absolute_time

Загалом

Існує кілька загальних часових рамок, за якими спостерігаються тенденції:

  • absolute_time
  • day_of_year
  • day_of_week
  • month_of_year
  • hour_of_day
  • minute_of_hour

Шукайте тенденції у всьому цьому.

Дивні тенденції

Шукайте і дивні тенденції. Наприклад, ви можете побачити рідкісні, але стійкі тенденції, засновані на часі:

  • is_easter
  • is_superbowl
  • is_national_emergency
  • etc.

Вони часто вимагають, щоб ви перехрещували свої дані проти зовнішнього джерела, яке відображає події в часі.

Чому графік?

Є дві причини, які я вважаю графіком настільки важливим.

  • Дивні тенденції
    Хоча загальні тенденції можна автоматизувати досить легко (просто додайте їх кожен раз), дивні тенденції часто потребують людського ока та знань про світ. Це одна з причин того, що графіку так важливо.

  • Помилки даних
    Надто часто дані мають в ньому серйозні помилки. Наприклад, ви можете виявити, що дати були закодовані у двох форматах і лише один із них був правильно завантажений у вашу програму. Таких проблем існує безліч, і вони напрочуд поширені. Це інша причина, на яку я думаю, що графік важливий не лише для часових рядів, але і для будь-яких даних.


7

Розподіліть дані на вікна та знайдіть такі функції для таких вікон, як коефіцієнти автокореляції, вейвлети тощо, і використовуйте ці функції для навчання.

Наприклад, якщо у вас є дані про температуру та тиск, розбийте їх на окремі параметри та обчисліть такі функції, як кількість локальних мінімумів у цьому вікні та інші, і використовуйте ці функції для вашої моделі.


7

Ще одне, що слід враховувати, крім усього, що сказав Бен Хейлі, - це перетворити місцевий час на користувача . Наприклад, якщо ви намагаєтесь передбачити щось, що відбувається близько 20:00 для всіх користувачів, якщо ви подивитесь на час UTC, передбачити буде важче.


6

У кількох випадках дані та події всередині часового ряду є сезонними. У таких випадках місяць і рік події мають велике значення. Отже, у таких сценаріях ви можете використовувати бінарні змінні, щоб представити, чи відбувається подія протягом певного місяця / року чи ні.

Сподіваюся, що це відповість на ваше запитання. Якщо не люб'язно, будьте трохи більш конкретними щодо того, чого саме ви намагаєтесь досягти


4

Як чудово пояснили Бен і Нар , розбивка об'єкта дати на час на відрізки частин дати та часу допоможе виявити сезонні тенденції, де повний (і, як правило, ще гірший - унікальний) об'єкт дати-часу пропустить його

Ви не згадали про якийсь конкретний алгоритм машинного навчання, який вас цікавить, але у випадку, якщо вас також цікавить кластеризація на основі дистанції, наприклад k-означає, я б узагальнив об’єкт дата-час у формат unix-time . Це дозволило б просте порівняння чисельної відстані для алгоритму, просто вказавши, наскільки знаходяться два значення дати.

У вашому прикладі я б узагальнив значення лише для дати 2014-05-05 до 1399248000 (час Unix, що представляє початок 5 травня 2014 року, UTC).

[Можна стверджувати, що ви можете досягти цього шляхом приєднання дати-часу у кожну можливу частину часу-дати .., але це значно збільшить розміри вашого набору даних. Отже, я б запропонував поєднати unix-time, для вимірювання відстані та деяких відрізків дати]


3

Бен розповідає про статичні особливості та використовує функції часових позначок.

Як розширення, я введу функції відставання , я говорю не про необмежений часовий ряд, а про агрегати на ньому.

Найбільш містична частина полягає в тому, що майбутня цінність для нас небачена, як ми можемо використовувати ці сукупні функції у навчальних даних?

Невеликий приклад: Є щорічні дані про споживання електроенергії з 1991 по 2015 роки, я хочу передбачити споживання електроенергії в наступних 5 роках, 2016 по 2020 рік. Я буду обчислювати останні п’ять років, ковзну середню кількість споживання електроенергії як функціональні значення 2020 року, але 2016–2020 роки для нас невідомі, тому ми, ведучи (навпроти відставання) часовий ряд 5 років, дозволяємо робити ковзний середній показник у 2010–2015 роках, а потім використовуємо це значення як значення функції 2020 року. Отже, ми можемо побудувати дані про майбутні 5 років.

Наступним кроком є ​​просто використання функції переміщення (count \ mean \ median \ min \ max.etc) та спробуйте різні вікна, тоді ви побудуєте безліч функцій!


2

Залежно від того, що вас цікавить з інформацією про дату / час, ви можете просто захотіти передати його. Наприклад, якщо вас цікавить відстань від початкової точки (наприклад, 1 січня 2015 року), і ви хочете виміряти її в місяцях, я б просто зарахував це як місяць 1 (для 1–31 січня 2015 року), 2 (1-28 лютого 2015 р.), 3, 4, 5, 6 і т. Д. Оскільки відстань між датами початку приблизно однакова, це представляє відстань у прямому прямому форматі. І я кажу безперервно, тому що ви можете сказати, що 6,5 місяця, і знаєте, що це півроку до червня 2015 року. Тоді вам не доведеться турбуватися про фактичне кодування дати, і ви можете використовувати всі ваші типові методи класифікації.

Якщо ви хочете виміряти днями, я знаю, що MySql має функцію 'to_days', якщо ви випадково використовуєте це для витягу даних до класифікації. У Python, мабуть, є щось подібне, або використовувати формат unix-time, запропонований mork.

Сподіваюся, це допомагає!


1

Складіть графіки з різними варіаціями часу щодо змінної результату, щоб побачити її вплив. Ви можете використовувати місяць, день, рік як окремі функції, а оскільки місяць є категоричною змінною, ви можете спробувати графік коробки / вуса і побачити, чи є якісь шаблони. Для числових змінних можна використовувати графік розкидання.


1

Я не знаю, чи це звичайна / найкраща практика, але це інша точка зору.

Якщо у вас, скажімо, дата, ви можете розглядати кожне поле як "змінну категорії", а не "суцільну змінну". День мав би значення в наборі {1, 2 ..., 31}, місяць матиме значення у {1, ..., 12}, і за рік ви вибираєте мінімальне та максимальне значення і побудувати набір.

Тоді, оскільки конкретні числові значення днів, місяців та років можуть бути не корисними для пошуку тенденцій в даних, використовуйте двійкове представлення для кодування числових значень, будучи кожним бітом ознакою. Наприклад, 5-й місяць буде 0 0 0 0 1 0 0 0 0 0 0 0(11 0 - це позиція 1 на 5-му місці, кожен біт - функція).

Так, маючи, наприклад, 10 років у "наборі року", дата буде перетворена на вектор із 43 ознак (= 31 + 12 + 10). Використовуючи "розріджені вектори", кількість функцій не повинна бути проблемою.

Щось подібне можна зробити для даних про час, день тижня, день місяця ...

Все залежить від питання, на яке ви хочете відповісти від вашої моделі машинного навчання.


Це не вдається зафіксувати відносини, які, ймовірно, існують, наприклад, що 14-й та 15-й місяці є "подібними". Наскільки ви вважаєте, що кожен день буквально різний, ви також вважаєте, що передбачити завтрашній день неможливо. Також не потрібно однозначно кодувати категорії, не обов'язково.
Шон Оуен

Не можу зрозуміти, чому це не вдається зафіксувати "близькість" найближчих дат. Якщо ви, наприклад, подаєте бінарний вектор до NN, він з’ясує це сам після належної підготовки. Використання бінарних векторів є лише одним із способів представлення категорій.
Пако Бартер

У цьому випадку у вас фактично є стовпці типу "is_12th" та "is_13th", які у вхідному просторі не пов'язані між собою та не мають відношення до "is_1st" і т. Д. Як безперервна функція, було б правильно фіксувати, що 12 та 13-й є в деякому сенсі ближче, ніж 1-й та 12-й. Ви звертаєтесь до того, що модель може зробити висновок, але я говорю про те, що кодують вхідні функції.
Шон Оуен

Добре, я бачу. Ви маєте рацію, функція континууму краще фіксує «близькість» якості побачень. Моя думка полягає в тому, що в даних можуть бути тенденції щодо того, що числові значення дат не мають значення (наприклад, певна схема покупки покупців лише в суботу). Тому пропонуємо іншу точку зору щодо поводження з датами.
Пако Бартер

Actuall, як сказав @PacoBarter, одним гарячим кодуванням ігнорують різну відстань між категоріями. Це не так легко вирішити, оскільки ці функції є суттєвою фазовою інформацією, тоді як у більшості моделей машинного навчання немає фазового вводу. Деякі "Зроби сам" на метриці відстаней, можливо, все-таки.
plpopk

0

Контекст моєї відповіді : До цього часу було чудових відповідей. Але я хочу продовжити розмову, припускаючи, що ви говорите про додаток машинного навчання для прогнозування майбутніх значень цього конкретного часового ряду. Зважаючи на цей контекст, моя порада нижче.

Порада . Спершу вивчіть традиційні стратегічні стратегії прогнозування (наприклад, експоненціальне згладжування, SARIMAX або динамічна регресія) як базову лінію для прогнозування. Незважаючи на те, що машинне навчання показало велику перспективу для різноманітних застосувань, для тимчасових серій існують перевірені і справжні статистичні методи, які можуть служити вам краще для вашої програми. Зверну вашу увагу на дві останні статті:

  1. Статистичні та машинні методи прогнозування: проблеми та шляхи подальшого розвитку від Spyros Makridakis et al. У статті зазначено, що протягом багатьох часових рядів традиційні статистичні аналізи часових рядів перевершують моделі машинного навчання. По суті, ML має тенденцію до перевищення, і будь-які припущення щодо моделі ML щодо незалежних записів порушуються.
  2. Просте порівняно складне прогнозування: дані Kesten C Green та співавт. У статті порівнюється та досліджується вихід часових рядів рецензованих статей журнального звіту про аналіз часових рядів та без порівнянь із різними моделями. На закінчення, дослідники ускладнюють свій аналіз моделями, які складніше інтерпретувати та мають гірші показники. Зазвичай це відбувається через погані стимулюючі структури.

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

Ура,

Ресурси для вивчення статистичного прогнозування : я б почав з перегляду безкоштовного підручника Роб Дж Хайндмана тут: https://otexts.org/fpp2/ . Текст заснований на пакеті R, який ви можете легко включити до свого аналізу: https://otexts.org/fpp2/appendix-using-r.html . Нарешті, будь ласка, будь ласка, пам’ятайте про різницю між валідацією поперечного перерізу та перехресною валідацією часових рядів, як це пояснено тут: https://robjhyndman.com/hyndsight/tscv/ .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.