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

Описание проблемы:

Когда сотрудник любой компании приступает к работе, ему в первую очередь необходимо получить доступ к компьютеру, необходимый для выполнения своей роли. Часто сотрудники выясняют, какой доступ им нужен, поскольку они сталкиваются с препятствиями в своей повседневной работе (например, не могут войти на портал отчетов). Затем компетентному руководителю требуется время, чтобы вручную предоставить необходимый доступ для преодоления препятствий к доступу.

Можете ли вы построить модель, изученную на основе исторических данных, которая будет определять потребности сотрудника в доступе, чтобы минимизировать количество транзакций ручного доступа (предоставление и отзыв) по мере того, как атрибуты сотрудника меняются с течением времени? Модель примет информацию о роли сотрудника и код ресурса и вернет, следует ли предоставить доступ.

Набор данных

Соревнование предоставило мне обучающие данные, состоящие из 32 770 строк, и тестовые данные, состоящие из 58 922 строк, для создания моей модели контролируемого обучения. Важное соображение заключается в том, что, хотя данные представлены в форме чисел, числа представляют собой зашифрованные представления различных категориальных данных для большинства столбцов. Данные обучения состояли из:

  1. ДЕЙСТВИЕ - двоичное значение, представляющее 1, если запрос доступа был одобрен, и 0 в противном случае
  2. РЕСУРС - id для каждого запроса
  3. MGR_ID - ID СОТРУДНИКА для каждого менеджера текущего ID СОТРУДНИКА
  4. ROLE_ROLLUP_1 - категория группы ролей 1 (например, инженерное дело США)
  5. ROLE_ROLLUP_2 - категория группы ролей 2 (например, розничная торговля в США)
  6. ROLE_DEPTNAME - описание ролевого отдела (например, Розничная торговля)
  7. ROLE_TITLE - описание названия должности (например, старший технический менеджер по розничной торговле)
  8. ROLE_FAMILY_DESC - расширенное описание семейства ролей (например, менеджер по розничной торговле, разработка программного обеспечения)
  9. ROLE_FAMILY - описание семейства ролей (например, менеджер по розничной торговле)
  10. ROLE_CODE - код роли; этот код уникален для каждой роли (например, менеджер)

Тестовые данные состоят из всех столбцов от 2 до 10, кроме ACTION, которые мы хотим, чтобы наша модель предсказывала (так что это не имело бы особого смысла, если бы у нас уже были эти данные). Он также имел

11. id - индекс количества РЕСУРСОВ, в нашем случае 58921

Функциональная инженерия

Чтобы выяснить особенности с более высокими прогностическими возможностями, я посмотрел на атрибут feature_importance классификаторов и ранжировал каждую функцию в порядке их важности для подобранного класса в обучающих данных.

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

Чтобы еще больше обобщить свои результаты, я углубился в свои очень ограниченные знания в этой области и решил в горячем режиме закодировать категориальные данные с помощью функции Pandas get_dummies (названной довольно подходяще для меня). Здесь в игру вступила интуиция, а также столь необходимая способность экономить время выполнения кода. Технически я мог бы горячо закодировать все категориальные данные. Однако я решил просто закодировать две функции: ROLE_ROLLUP_1 и ROLE_ROLLUP_2. Моя интуиция заключалась в том, что сотрудникам, независимо от отдела, стажа работы и т. Д., Потребуется доступ в зависимости от ролей, которые они выполняют в компании.

Идентификация классификатора

Теперь, когда у меня был набор функций, мне нужно было решить, какие модели использовать из множества в моем арсенале. Чтобы начать этот процесс, я решил использовать грубую подгонку нескольких из этих моделей - Decision Tree (tc), Random Forest (rf), Bagging (bc), Adaptive Boost (abc), Logistic Regression (log), KNeighbors ( кнн). Затем я хотел проверить вероятности предсказания каждого классификатора на обучающих данных, а также время, необходимое каждому классификатору для соответствия данным.

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

Теперь у меня было четыре классификатора: дерево решений, случайный лес, адаптивное усиление, логистическая регрессия. Сначала я оптимизировал каждую модель с помощью RandomizedSearchCV с массивом разных параметров. Затем я создал классификатор голосования, используя best_estimator каждого из оптимизированных классификаторов, а затем дополнительно оптимизировал его (optimiception?)

Затем я создал классификатор голосования, который взял лучший оценщик каждого из этих оптимизированных классификаторов и оптимизировал его по тем же принципам. Теперь этот окончательный оптимизированный классификатор голосования должен быть достаточно оптимизирован. Таким образом, интуитивно понятно, что он должен работать лучше, чем другие модели. Несколько представлений Kaggle показали, что мои модели работают лучше, так как мой показатель точности повышался постепенно, но верно (дошел до топ-1000!). Мой классификатор голосования был основан на различных типах моделей - классификаторе дерева решений, случайном лесу, адаптивном усилении и логистической регрессии. Это сделало окончательную модель более целостной с меньшими отклонениями и смещениями.

Результаты и дальнейшие шаги

Производительность каждой оптимизированной модели, включая оптимизированную модель классификатора голосования, была протестирована путем построения кривых ROC путем дальнейшего разделения обучающих данных на обучающий набор данных (80% исходных обучающих данных) и тестовый набор данных (20% от исходных обучающих данных). Получились вот такие сюжеты:

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

  1. Используйте методы разработки гибридных функций. Возможно, определить операции, которые можно выполнить с функциями, чтобы получить более ориентировочные функции.
  2. Добавьте веса к разным классификаторам, чтобы придать большее значение некоторым
  3. Одно горячее кодирование всех категориальных данных, чтобы оценить, есть ли значительное повышение точности