Мені потрібна допомога щодо того, яким повинен бути наступний крок у алгоритмі, який я розробляю.
Через NDAs я не можу розкрити багато, але я постараюся бути загальним і зрозумілим.
В основному, після кількох кроків в алгоритмах, я маю це:
Для кожного клієнта, який я маю, і події, які він проводить протягом місяця, під час перших кроків я поділив події на кілька категорій (кожен клієнт розділить події на категорії, що переходять від 1 до x, а х від 1 до 25, зазвичай перші категорії мають більшу щільність подій, ніж інші).
Для кожної категорії та замовника я створив часовий ряд, який агрегує події місяця за годину (отримуючи схеми, коли ці події проводяться). Також я використовую пару нормуючих змінних на основі кількості днів протягом місяця (30 днів), що хлопець проводить принаймні одну подію, і кількості днів, принаймні однієї події, протягом загальної кількості днів, принаймні однієї подія (об'єднання всіх кластерів). Перший дає мені співвідношення того, наскільки активний клієнт протягом місяця, а другий зважує категорію проти інших.
Фінальний стіл виглядає приблизно так
|*Identifier*| *firstCat* | *feature1* | *feature2* | { *(TIME SERIES)* }
CustomerID | ClusterID | DaysOver30 | DaysOverTotal | Events9AM Events10AM ...
xx | 1 | 0,69 | 0,72 | 0,2 0,13 ...
xx | 2 | 0,11 | 0,28 | 0,1 0,45 ...
xy | 1 | 0,23 | 0,88 | 0,00 0,60 ...
xy | 2 | 0,11 | 0,08 | 1,00 0,00 ...
xy | 3 | 0,10 | 0,04 | 0,40 0,60 ...
Змінні часового ряду - це відсоток від загальної кількості подій на день для кожної конкретної категорії (це означає, що в кожному рядку, що додає всі змінні, має бути 1). Причина робити це так, тому що, наприклад, часовий ряд з подіями 0 0 0 1 0
і 1 1 1 2 1
зовсім інші, а стандартизація до нормальної дала б аналогічні результати. І завдяки високому перекосу між різними категоріями я перевіряю значення часового ряду незалежно від інших.
Що мені зараз потрібно зробити - це визначити ці категорії (пам’ятайте, що вони можуть бути від 1 до x, це будь-яке x, будь-яке число від 1 до 25) у 3 теги: тег A, тег B і жодна з них. Дивлячись на ці змінні, я можу вручну визначити, до якого тегу вони належать, і ідея полягає в тому, щоб ідентифікувати вручну стільки, скільки я можу, і використовувати будь-який алгоритм класифікатора, щоб дізнатися з цього і ідентифікувати їх усіх.
Моя ідея полягала у використанні на столі декількох логістичних регресій, але всі змінні часових рядів співвідносяться (оскільки вони є лінійною комбінацією один одного), тому я подумав, що краще використовувати алгоритм кластеризації лише протягом часового ряду за допомогою евклідової відстань для категоризації різних моделей та використання результату та двох інших нормалізуючих змінних в логістичній регресії.
Інша стурбованість, яку я маю, полягає в тому, що цей підхід приймає кожен рядок незалежно від інших, і теоретично для кожного замовника повинно бути лише 0 або 1 тег A, 0 або 1 тег B, а решта з них повинна бути None (інший Порада полягає в тому, що зазвичай теги A і B знаходяться між першими категоріями, оскільки вони сильно залежать від нормалізуючих особливостей (якщо кількість днів перевищує велику, велика ймовірність, що рядок є або A, або B, залежно від шаблону часових рядів) .
Редагувати: Це вже не викликає занепокоєння, я просто виконую дві різні логістичні регресії, одну для тегу А або інше та іншу для тегу В або іншої, з імовірністю результатів я можу вибрати лише найкращий з них.
Набір даних величезний, і остаточний алгоритм потрібно застосувати за допомогою SQL (на Терадаті), але для отримання коефіцієнтів логістичної регресії або центрів кластеризації я отримую вибірку і використовую R.