26
Опыт участия в Microsoft Malware Classification Challenge Трофимов Михаил Machine Learning Works 13 августа 2016 года Трофимов Михаил Опыт участия в Microsoft Malware Classification Challenge

"Опыт участия в Microsoft Malware Classification Challenge" Михаил Трофимов (Machine Learning Works)

Embed Size (px)

Citation preview

Page 1: "Опыт участия в Microsoft Malware Classification Challenge"  Михаил Трофимов (Machine Learning Works)

Опыт участия вMicrosoft Malware Classification Challenge

Трофимов Михаил

Machine Learning Works

13 августа 2016 года

Трофимов Михаил Опыт участия в Microsoft Malware Classification Challenge

Page 2: "Опыт участия в Microsoft Malware Classification Challenge"  Михаил Трофимов (Machine Learning Works)

Задача

Данные

≈ 200 GB вирусов (10k примеров в обучение, 10k в тест).Каждый сэмпл представлен в 2 видах: сырые байты и выводдизассемблера.

Задача

Классификация на 10 фиксированных семейств

Метрика

Логарифмические потери (LogLoss)

Трофимов Михаил Опыт участия в Microsoft Malware Classification Challenge

Page 3: "Опыт участия в Microsoft Malware Classification Challenge"  Михаил Трофимов (Machine Learning Works)

Команда

Дмитрий Ульянов Станислав Семенов Михаил Трофимов

Трофимов Михаил Опыт участия в Microsoft Malware Classification Challenge

Page 4: "Опыт участия в Microsoft Malware Classification Challenge"  Михаил Трофимов (Machine Learning Works)

Данные (1/2)

В виде сырых байт:

Трофимов Михаил Опыт участия в Microsoft Malware Classification Challenge

Page 5: "Опыт участия в Microsoft Malware Classification Challenge"  Михаил Трофимов (Machine Learning Works)

Данные (2/2)

В виде вывода дизассемблера:

Трофимов Михаил Опыт участия в Microsoft Malware Classification Challenge

Page 6: "Опыт участия в Microsoft Malware Classification Challenge"  Михаил Трофимов (Machine Learning Works)

Признаки

Размеры файлов

Байты и ассемблерные операторы

Распределение, биграммы...

Распределение энтропии в скользящем окне

Степень сжимаемости

Наличие ключевых слов

Системные вызовы (grep by "__stdcall")

Ключевые слова (loadlibrary, HKEY_LOCAL_MACHINE,...)

Строки бинарника

Распределение длин

Наличие характерных строк

... и другие

Трофимов Михаил Опыт участия в Microsoft Malware Classification Challenge

Page 7: "Опыт участия в Microsoft Malware Classification Challenge"  Михаил Трофимов (Machine Learning Works)

Поверхностный анализ

Файлов много, хочется быстро в них заглянуть

Загружать в python – много кода

ls, cat/head/tail, grep

Просемплировать строчки

awk ’NR == 1 || NR % 3 == 0’ input.file > output.file

Найти строки в бинарнике

strings input.bin

Трофимов Михаил Опыт участия в Microsoft Malware Classification Challenge

Page 8: "Опыт участия в Microsoft Malware Classification Challenge"  Михаил Трофимов (Machine Learning Works)

Обработка файлов

Задача

Нужно считывать и обработывать ≈ 104 × 106 строк. Многократно.

Проблема

CPython медленный для этого.

Варианты?

Cython

PyPy

Numba

Трофимов Михаил Опыт участия в Microsoft Malware Classification Challenge

Page 9: "Опыт участия в Microsoft Malware Classification Challenge"  Михаил Трофимов (Machine Learning Works)

Сравнение

Таблица: Сравнение способов ускорения python

Либа Установка Использование КомментарийCython pip Переписать код Стандартное решениеPyPy pip pypy script.py Проблема с пакетамиNumba conda @jit Использует LLVM

Сравнение в цифрах: https://pybenchmarks.org

Трофимов Михаил Опыт участия в Microsoft Malware Classification Challenge

Page 10: "Опыт участия в Microsoft Malware Classification Challenge"  Михаил Трофимов (Machine Learning Works)

PyPy vs CPython (http://speed.pypy.org/)

Трофимов Михаил Опыт участия в Microsoft Malware Classification Challenge

Page 11: "Опыт участия в Microsoft Malware Classification Challenge"  Михаил Трофимов (Machine Learning Works)

Чтение с диска

Задача

Нужно считывать и обработывать ≈ 200 GB. Многократно.

Проблема

Диск медленный, фрагментированный, места не хватает

Возможное решение

Читать сразу из .gz файла

Трофимов Михаил Опыт участия в Microsoft Malware Classification Challenge

Page 12: "Опыт участия в Microsoft Malware Classification Challenge"  Михаил Трофимов (Machine Learning Works)

Чтение с диска

Задача

Нужно считывать и обработывать ≈ 200 GB. Многократно.

Проблема

Диск медленный, фрагментированный, места не хватает

Возможное решение

Читать сразу из .gz файла

Трофимов Михаил Опыт участия в Microsoft Malware Classification Challenge

Page 13: "Опыт участия в Microsoft Malware Classification Challenge"  Михаил Трофимов (Machine Learning Works)

Сохранение промежуточных результатов

Задача

Нужно многократно дампить и поднимать большие питоновскиеструктуры (словари, numpy-массивы)

Проблема

joblib / pickle∗ работают неприлично долго

Возможное решение

hickle

Трофимов Михаил Опыт участия в Microsoft Malware Classification Challenge

Page 14: "Опыт участия в Microsoft Malware Classification Challenge"  Михаил Трофимов (Machine Learning Works)

https://github.com/telegraphic/hickle

Hickle быстрее pickle, использует HDF5, поддерживает компрессию

Трофимов Михаил Опыт участия в Microsoft Malware Classification Challenge

Page 15: "Опыт участия в Microsoft Malware Classification Challenge"  Михаил Трофимов (Machine Learning Works)

Промежуточные результаты

Трофимов Михаил Опыт участия в Microsoft Malware Classification Challenge

Page 16: "Опыт участия в Microsoft Malware Classification Challenge"  Михаил Трофимов (Machine Learning Works)

Байты как текст

2-grams: 2562 = 65536

4-grams: 2564 = 4.2× 109

10-grams: 25610 = 1.2× 1024

Трофимов Михаил Опыт участия в Microsoft Malware Classification Challenge

Page 17: "Опыт участия в Microsoft Malware Classification Challenge"  Михаил Трофимов (Machine Learning Works)

2-grams

2-grams: 2562 = 65536 фичей

Собираем с каждого файла словарь вида 2-gram -> частота

Аггрегируем все файлы в разреженную матрицу

Требует O(nnz) памяти, где nnz – число ненулевыхэлементовРеализация в scipy.sparse

Трофимов Михаил Опыт участия в Microsoft Malware Classification Challenge

Page 18: "Опыт участия в Microsoft Malware Classification Challenge"  Михаил Трофимов (Machine Learning Works)

4-grams

Аналогично:

4-grams: 2564 = 4.2× 109 фичей

Собираем с каждого файла словарь вида 4-gram -> частота

Аггрегируем все файлы в разреженную матрицу

В чем подвох?

Трофимов Михаил Опыт участия в Microsoft Malware Classification Challenge

Page 19: "Опыт участия в Microsoft Malware Classification Challenge"  Михаил Трофимов (Machine Learning Works)

4-grams

10-grams: 2564 = 4.2× 109 фичей

Собираем с каждого файла словарь вида 4-gram -> частота

4-грамм (строк из 8 символов) много

Большой оверхед по памяти на создание и поддержаниесловаря

Замапим 4-граммы(строки) на id(числа) [обратимаяоперация]

Получим словарь вида id->частота

Аггрегируем все файлы в разреженную матрицу

Трофимов Михаил Опыт участия в Microsoft Malware Classification Challenge

Page 20: "Опыт участия в Microsoft Malware Classification Challenge"  Михаил Трофимов (Machine Learning Works)

10-grams

4-grams: 25610 ≈ 1024 фичей

Собираем с каждого файла словарь вида id -> частота

Матрица получится чудовищной

Так ли нужна обратимость отображения 10-грамм(строк)на id(числа)?

Hash-trick!

id = hash(10-gram) % 2b, b = 28

В итоге 2× 108 фичей

Трофимов Михаил Опыт участия в Microsoft Malware Classification Challenge

Page 21: "Опыт участия в Microsoft Malware Classification Challenge"  Михаил Трофимов (Machine Learning Works)

Отбор признаков: 4-грамы

Трофимов Михаил Опыт участия в Microsoft Malware Classification Challenge

Page 22: "Опыт участия в Microsoft Malware Classification Challenge"  Михаил Трофимов (Machine Learning Works)

Отбор признаков: 10-грамы

Трофимов Михаил Опыт участия в Microsoft Malware Classification Challenge

Page 23: "Опыт участия в Microsoft Malware Classification Challenge"  Михаил Трофимов (Machine Learning Works)

Снижение размерности

RF(NMF(X)) был лучше, чем RF(PCA(X))

Трофимов Михаил Опыт участия в Microsoft Malware Classification Challenge

Page 24: "Опыт участия в Microsoft Malware Classification Challenge"  Михаил Трофимов (Machine Learning Works)

Итоговое решение

Усреднение множества xgboost’ов

Разные подмножества признаков

Semi-supervised trick

top14 на публичном лидерборде

top3 на приватном лидерборде

Трофимов Михаил Опыт участия в Microsoft Malware Classification Challenge

Page 25: "Опыт участия в Microsoft Malware Classification Challenge"  Михаил Трофимов (Machine Learning Works)

Полезные штуки

PyPy / Numba / Cython

HDF5 / Hickle

"Fast Non-Standard Data Structures for Python"by Mike Korobov

Трюк с хэшированием

Разреженные матрицы

LinearSVC(L1) для обора признаков

Трофимов Михаил Опыт участия в Microsoft Malware Classification Challenge

Page 26: "Опыт участия в Microsoft Malware Classification Challenge"  Михаил Трофимов (Machine Learning Works)

Финальный слайд

Вопросы?Спасибо за внимание!

Трофимов Михаил Опыт участия в Microsoft Malware Classification Challenge