Мне нужна помощь в том, что должно быть моим следующим шагом в алгоритме, который я разрабатываю.
Из-за NDA я не могу раскрыть многое, но постараюсь быть обобщенным и понятным.
В основном, после нескольких шагов в алгоритмах, у меня есть это:
Для каждого имеющегося у меня клиента и событий, которые он совершает в течение месяца, на первых этапах я разбил события на несколько категорий (у каждого клиента события будут разделены на категории, которые переходят от 1 до x, где 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 и None of Them. Глядя на эти переменные, я могу вручную определить, к какому тегу они принадлежат, и идея состоит в том, чтобы идентифицировать как можно больше вручную и использовать любой алгоритм классификатора, чтобы извлечь из этого уроки и идентифицировать их все.
Моя идея состояла в том, чтобы использовать несколько логистических регрессий в таблице, но все переменные временного ряда коррелируют (поскольку они представляют собой линейную комбинацию друг с другом), поэтому я подумал, что лучше использовать алгоритм кластеризации только по временным рядам, используя евклидово расстояние для классификации различных шаблонов и использования результата и двух других нормализующих переменных в логистической регрессии.
Другое беспокойство, которое у меня есть, заключается в том, что этот подход берет каждую строку независимо от других, и теоретически для каждого клиента должно быть только 0 или 1 тег A, 0 или 1 тег B, а остальные из них должны быть None (другой Подсказка заключается в том, что обычно теги A и B находятся между первыми категориями, поскольку они сильно зависят от нормализующих функций (если общее количество дней равно High, существует высокая вероятность того, что строка будет A или B, в зависимости от шаблона временных рядов) ,
Редактировать: это больше не проблема, я просто выполню две разные логистические регрессии, одну для тега A или другого и другую для тега B или другого, с вероятностями результата я могу выбрать только лучшее из каждого.
Набор данных огромен, и окончательный алгоритм должен применяться с использованием SQL (на Teradata), но для получения коэффициентов логистической регрессии или центров кластеризации я получаю выборку и использую R.