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

В этом блоге я объясню вам, как я подошел к проблеме и решил эту проблему с помощью классических алгоритмов машинного обучения.

Содержание:

  1. Бизнес-проблема
  2. Набор данных
  3. Метрика оценки
  4. Исследовательский анализ данных
  5. Функциональная инженерия
  6. Кодирование категориальных функций
  7. Первый подход
  8. Пользовательский классификатор стекирования
  9. Сравнение моделей
  10. Окончательная модель
  11. Изготовление модели
  12. Будущая работа
  13. использованная литература

Бизнес-проблема:

Атаки вредоносного ПО являются одной из растущих проблем с точки зрения безопасности и целостности данных для пользователей и организаций, использующих системы Windows. По данным фирмы NetMarketShare (источник Википедия), согласно их опросу о доле рынка ОС для настольных ПК в сентябре 2019 года, ОС Microsoft Windows управляет рынком на 87%, поэтому здесь самая большая проблема для Microsoft - предоставить антивирусную защиту или другие продукты безопасности. который обеспечивает точные и эффективные результаты независимо от того, будет ли машина заражена вредоносным ПО или нет, чтобы сохранить свои данные в безопасности и остаться неуязвимыми для такого рода атак.

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

Итак, я разработал систему машинного обучения, которая предсказывала вероятность заражения машины вредоносным ПО.

Набор данных:

Для этой проблемы я собрал данные, например, train.csv и test.csv, прямо из kaggle, где проводилось это соревнование.

  1. Train.csv: - Этот файл содержит 8921483 записей, где каждая запись соответствует машине, которая однозначно идентифицируется с помощью MachineIdentifier, а HasDetections является истинной истиной и указывает, что на машине было обнаружено вредоносное ПО. И содержит 83 столбца, включая MachineIdentifier и HasDetections, с помощью которых нужно обучать модель. Здесь функции, столбцы и переменные аналогичны друг другу, и я буду использовать эти термины как синонимы в этом блоге.
  2. Test.csv: - Этот файл содержит 7853253 записей. И содержит 82 столбца, включая MachineIdentifier, кроме HasDetections.

Набор данных можно скачать здесь.

Оценочный показатель:

Для этой проблемы производительность модели оценивалась на основе области под оценкой ROC между прогнозируемой вероятностью и истинной меткой.

Область под ROC говорит нам, насколько хороша модель в различении истинных положительных и ложных положительных результатов.

По этой постановке задачи я получил окончательную оценку AUC 0,749.

Для подробного объяснения и понимания Области под ОКР вы можете обратиться к этому блогу.

Исследовательский анализ данных:

  1. Анализ нулевых значений:

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

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

2. Типы функций:

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

3. Заполнение отсутствующих значений:

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

4. Удаление выбросов из данных:

Иногда выбросы, присутствующие в наборе данных, могут ухудшать производительность модели, но для моделей на основе деревьев, таких как деревья решений, случайные леса, LightGBM, XGBoost и т. Д., Выбросы оказывают меньшее влияние на производительность модели, которую я использовал в качестве подхода первого среза, но для более безопасной стороны как часть Из исследовательского анализа данных я удалил выбросы из набора обучающих данных на основе метода Z-оценки, выбрав только те точки данных (строки), значение Z-оценки которых меньше 3, поскольку Z-оценка больше 3 считается выбросами. Z-оценка описывает любую точку данных путем нахождения их взаимосвязи со стандартным отклонением и средним значением группы точек данных. Z-оценка рассчитывается для объектов, которые содержат непрерывные значения.

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

5. Поиск корреляции между функциями и целевой переменной:

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

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

Но есть одна проблема с техникой коэффициента корреляции Пирсона: этот метод может обрабатывать только линейные отношения между функциями и очень хорошо работает только для числовых функций. И для этой постановки задачи большинство функций являются категориальными функциями, поэтому я использовал новую библиотеку анализатора корреляции под названием phi_k Correlation Analyzer Library, которая превосходит технологию коэффициента корреляции Пирсона, поскольку она постоянно хорошо работает с категориальными, порядковыми и интервальными переменными, эта библиотека также фиксирует нелинейные отношения между переменными. phik_matrix фиксирует корреляцию между всеми функциями. Я предоставлю ссылку на исследовательскую работу, которую я сослался на эту библиотеку, в конце этого блога.

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

Наблюдения:

  1. Из приведенного выше графика он относится к целевой переменной HasDetections, есть некоторые функции, отношение phi_k которых равно нулю, например, Census_IsFlightsDisabled, Census_IsPortableOperatingSystem, IsBeta, Firewall, Census_DeviceFamily, OsVer и Census_PrimaryDiskFamily, потому что функции eventTotalCapacity можно удалить после переменные не имеют или имеют небольшую корреляцию, есть вероятность, что эти переменные значимы или могут быть значимым предиктором для модели в отношении целевой переменной.
  2. Такие функции, как GeoNameIdentifier и LocaleEnglishNameIdentifier, сильно коррелированны.
  3. После вышеуказанных наблюдений я удалил GeoNameIdentifier

Как упоминалось ранее, библиотека phi_k также измеряет статистическую значимость переменных, я также использовал матрицу значимости, чтобы выяснить значимость переменных.

Наблюдения:

  1. Из графика значимости Марикса видно, что хотя корреляция переменных с целевой переменной равна нулю, но каким-то образом существует некоторое количество записей, которые происходят одновременно как для целевой переменной, так и для других функций.

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

Наблюдения:

  1. Из приведенного выше графика глобальной корреляции AppVersion имеет высокое значение глобальной корреляции, за которым следует OSVer, smartscreen
  2. Эта функция будет полезна для задач разработки функций.

Точно так же из-за ограничений вычислений я взял подмножество функций и проанализировал корреляцию между функциями, поэтому в конце этого блога я предоставлю ссылку на мой профиль на github, где вы можете сослаться на все мои записные книжки на Python.

6. Анализ распределения целевой переменной HasDetections:

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

Наблюдения:

  1. Как видно из приведенного выше графика, набор данных поезда содержит равное количество положительных и отрицательных обнаружений (или не обнаруженных). И я пришел к выводу, что этот набор данных является сбалансированным набором данных.

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

7. Парные графики для анализа числовых характеристик:

Наблюдения:

  1. Существует перекрытие между отрицательным и положительным обнаружением для всех трех характеристик в отношении целевой переменной.
  2. А распределение для Census_OSBuildRevision видно из графика, что он оставлен с перекосом.
  3. Поскольку распределение Census_OSBuildRevision остается искаженным, применив преобразование журнала к этой функции, мы можем предложить новую функцию.

8. График счета для функции SmartScreen для сравнения категорий в функции smartscreen с целевой переменной HasDetections:

Наблюдение:

  1. Машины с экраном smartscreen существуют notset, т.е. запись в реестре существует, но не настроена, очень уязвимы для заражения вредоносными программами.
  2. И машины с smartscreen requireadmin с меньшей вероятностью будут заражены вредоносными программами и очень защищены от атак вредоносных программ.
  3. А также машины с умным экраном, в категории requireadmin доминирует над этой функцией.
  4. Используя эту функцию, мы можем создавать новые функции с функциями / столбцами, такими как ISProtected, тогда эта новая функция может быть полезна для моделирования, так как если включен smartscreen, тогда меньше шансов заразиться вредоносным ПО, как показано на графике выше.

9. График подсчета для названия продукта для проверки распределения категорий:

Наблюдения:

  1. Из приведенного выше графика видно, что в этом наборе данных машин с продуктом Windows 8 Defender больше по сравнению с mse.
  2. И защитник Windows 8 является доминирующей категорией по этой функции.

10. График подсчета для функции Census_OSArchitecture для сравнения категорий в функции Census_OSArchitecture с целевой переменной HasDetections:

Наблюдения:

  1. Из приведенного выше графика мы можем сделать вывод, что в данном наборе данных большая часть машинной архитектуры - это amd64, и большая часть машин с архитектурой amd64 обнаружила вредоносное ПО.
  2. Процессор с архитектурой amd64 может быть более уязвим для вредоносных программ, поскольку скорость обнаружения вредоносных программ высока по сравнению с архитектурой x86.

Разработка функций:

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

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

- Проф. Эндрю Нг.

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

Например, в данном наборе данных у меня были такие функции, как wdft_isgamer и брандмауэр, поэтому я создал новые функции gamer_with_firewall, используя эти две функции, поскольку игровые машины более подвержены заражению вредоносными программами, и когда брандмауэр не включен, вероятность заражения выше. Так или иначе, эта функция может помочь в предсказании.

Точно так же я создал новую функцию Dimensions, используя Census_InternalPrimaryDisplayResolutionHorizontal и Census_InternalPrimaryDisplayResolutionVertical.

Я создал новую функцию transformed_build_revision, применив преобразование журнала к функции Census_OSBuildRevision, потому что мы видели в части 7 EDA, что Census_OSBuildRevision следует правильно искаженному распределению, поэтому примените log преобразование , чтобы данные следовали нормальному распределению, и это может быть полезно для моделирования данных.

Я создал различные другие функции аналогичным образом из данного набора функций и придумал еще 12 новых дополнительных функций.

Категориальные функции кодирования:

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

Подробное объяснение каждой из техник кодирования можно найти в этом блоге.

Первый подход:

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

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

Вы можете обратиться к этому блогу, чтобы получить подробное объяснение алгоритма lightgbm.

Для настройки гиперпараметров lightgbm я использовал библиотеку optuna для выбора лучших параметров, что дает хороший результат в AUC.

После настройки параметров я использовал стратифицированную перекрестную проверку K-Fold, чтобы проверить метрику оценки, разделив данные на складки, а затем каждую складку использовали в качестве набора для тестирования.

После применения стратифицированной 3-кратной перекрестной проверки модель достигла показателя AUC обучения 0,724 и оценки AUC валидации 0,723 путем взятия среднего значения AUC для всех складок.

После оценки метрики, используя эту модель, я получил окончательные предсказанные вероятности, передав тестовые данные в обученную модель lightgbm.

После обучения я выяснил, какая переменная играет важную роль в прогнозировании целевой переменной, используя атрибут feature_importance_ библиотеки lightgbm. На графике нанесены значения 50 объектов.

Из приведенного выше графика видно, что Feature AVProductStatesIdentifier очень полезен при прогнозировании целевой переменной. Затем идут AppVersion, Wdft_RegionIdentifier и так далее. И мы видим, что функция transformed_build_revision, которую я разработал, применив преобразование журнала во время задачи разработки функций, также оказалась полезной при прогнозировании целевой переменной.

Пользовательский классификатор стека:

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

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

Я инициализировал класс, создав переменную класса base_learners в виде списка, который содержит 6 алгоритмов машинного обучения, и использовал XGBClassifier как meta_learner.

Сначала я разделил весь набор данных из набора данных поезда на данные поезда (80%) и данные проверки (20%).

Метод подгонки:

Теперь в наборе данных поезда 80% я дополнительно разделил набор данных поезда на D1 и D2 поровну, то есть 50% во время метода соответствия класса CustomStackingClassifier.

Теперь из набора данных D1 я создал «k» образцов с заменой.

Создав ‘k’ образцов, я обучил ‘k’ моделей, используя эти образцы. Здесь ‘k’ - гиперпараметр для этой индивидуально реализованной модели ансамбля, которую я настроил с помощью поиска по сетке cv и выбрал лучший ‘k’ для окончательного обучения.

После обучения моделей ‘k’ передал набор данных D2 каждой из этих моделей, поэтому я получил прогнозы моделей ‘k’. И, используя эти прогнозы модели 'k', я создал новый набор данных, а для набора данных D2 у меня уже были соответствующие целевые переменные, поэтому обучил мета-классификатор с помощью этой модели 'k'. прогнозы с целевыми переменными D2.

метод pred_proba:

После обучения я передал оставшиеся 20% набора данных, т. Е. Данные проверки с использованием метода pred_proba, каждой из обученных моделей 'k', и я получил прогнозируемые вероятности каждой из этих 'k ' обученных моделей. Используя эти вероятности, создал новый набор данных и передал его мета-классификатору, чтобы получить окончательные вероятности.

Настройка количества базовых учащихся:

Для этой модели я настроил количество базовых учащихся, используя библиотеку sklearn GridSearchCV, и выбрал лучшее количество базовых учащихся, т.е. k = 5 для модели обучения в наборе данных поезда и окончательных прогнозов в наборе тестовых данных, которые дали лучший результат Aucroc.

Обучение пользовательского классификатора наложения.

Для обучения я выбрал базовых учащихся (k) как 5 после настройки с помощью GridSearchCV и получил roc_auc_score 0,70 как для данных обучения, так и для данных проверки.

Окончательные прогнозы по тестовым данным:

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

Сравнение моделей:

После обучения обеих моделей я сравнил их производительность.

Сверху было ясно, что модель Lightgbm превосходит пользовательскую модель стекирования. Итак, я выбрал модель, обученную с помощью алгоритма lightgbm, в качестве окончательной модели.

Окончательная модель:

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

После выбора функции выполните ту же процедуру настройки лучших параметров с помощью optuna, обучил классификатор и получил оценку train auc 0,75 и оценку auc проверки 0,73.

После оценки метрики спрогнозировал окончательные вероятности на тестовом наборе данных и получил прогнозируемые вероятности заражения машины вредоносным ПО.

После создания datapipeline для набора данных поезда для оценки метрики, на которую вы можете ссылаться на код в файле final.ipynb в моем репозитории github, на который я предоставлю ссылку в конце, окончательная оценка AUC составила 0,749.

Модель P производства :

Получив оценки вероятности и все, используя наилучшую выбранную модель, я развернул свою лучшую модель машинного обучения на Heroku, используя базовый API Flask. Ниже приведена ссылка на мое приложение, которое я развернул.



Вы можете сослаться на мой блог о том, как я развернул свою модель машинного обучения на Heroku.

Дальнейшая работа:

Тем не менее, моя работа может быть улучшена как часть будущей работы, как показано ниже:

  1. Для пользовательской модели наложения я настроил только количество базовых моделей, но мы также можем настроить количество параметров каждой базовой модели в дополнение к количеству базовых моделей.
  2. В lightgbm есть один параметр устройства, для которого я оставил значение по умолчанию, то есть CPU означает, что CPU используется для обучения, это может быть расширено до GPU в качестве будущей работы, чтобы сократить время обучения и при наличии достаточной вычислительной мощности.
  3. Для кодирования категориальных функций в будущем можно попробовать различные методы кодирования.
  4. В рамках будущей работы можно попробовать другой алгоритм машинного обучения, который использует усиление градиента на деревьях решений, известных как catboost, и может оценивать производительность модели.

Вот мое репозиторий на github, где вы можете найти записные книжки на Python для справок.

Ссылки:

Https://www.kaggle.com/c/microsoft-malware-prediction

Https://arxiv.org/pdf/1811.11440.pdf

Https://towardsdatascience.com/how-to-make-your-model-awesome-with-optuna-b56d490368af

Https://optuna.org/

Https://phik.readthedocs.io/en/latest/

Https://towardsdatascience.com/ways-to-detect-and-remove-the-outliers-404d16608dba

Https://towardsdatascience.com/7-ways-to-handle-missing-values-in-machine-learning-1a6326adf79e