"Опыт участия в Microsoft Malware Classification Challenge"
Михаил Трофимов (Machine Learning Works)
Из доклада Михаила вы узнаете о технической стороне конкурса: как проанализировать 200GB данных на ноутбуке, какие проблемы возникали в процессе и как их решали.
Python Data Science meetup @ Avito 13.08.2016
Конкурс Авито-2017 - Решение 2ое место - Василий Рубцов
"Опыт участия в Microsoft Malware Classification Challenge" Михаил Трофимов (Machine Learning Works)
1. Опыт участия в
Microsoft Malware Classification Challenge
Трофимов Михаил
Machine Learning Works
13 августа 2016 года
Трофимов Михаил Опыт участия в Microsoft Malware Classification Challenge
2. Задача
Данные
≈ 200 GB вирусов (10k примеров в обучение, 10k в тест).
Каждый сэмпл представлен в 2 видах: сырые байты и вывод
дизассемблера.
Задача
Классификация на 10 фиксированных семейств
Метрика
Логарифмические потери (LogLoss)
Трофимов Михаил Опыт участия в Microsoft Malware Classification Challenge
4. Данные (1/2)
В виде сырых байт:
Трофимов Михаил Опыт участия в Microsoft Malware Classification Challenge
5. Данные (2/2)
В виде вывода дизассемблера:
Трофимов Михаил Опыт участия в Microsoft Malware Classification Challenge
6. Признаки
Размеры файлов
Байты и ассемблерные операторы
Распределение, биграммы...
Распределение энтропии в скользящем окне
Степень сжимаемости
Наличие ключевых слов
Системные вызовы (grep by "__stdcall")
Ключевые слова (loadlibrary, HKEY_LOCAL_MACHINE,...)
Строки бинарника
Распределение длин
Наличие характерных строк
... и другие
Трофимов Михаил Опыт участия в Microsoft Malware Classification Challenge
7. Поверхностный анализ
Файлов много, хочется быстро в них заглянуть
Загружать в python – много кода
ls, cat/head/tail, grep
Просемплировать строчки
awk ’NR == 1 || NR % 3 == 0’ input.file > output.file
Найти строки в бинарнике
strings input.bin
Трофимов Михаил Опыт участия в Microsoft Malware Classification Challenge
8. Обработка файлов
Задача
Нужно считывать и обработывать ≈ 104
× 106
строк. Многократно.
Проблема
CPython медленный для этого.
Варианты?
Cython
PyPy
Numba
Трофимов Михаил Опыт участия в Microsoft Malware Classification Challenge
9. Сравнение
Таблица: Сравнение способов ускорения python
Либа Установка Использование Комментарий
Cython pip Переписать код Стандартное решение
PyPy pip pypy script.py Проблема с пакетами
Numba conda @jit Использует LLVM
Сравнение в цифрах: https://pybenchmarks.org
Трофимов Михаил Опыт участия в Microsoft Malware Classification Challenge
10. PyPy vs CPython (http://speed.pypy.org/)
Трофимов Михаил Опыт участия в Microsoft Malware Classification Challenge
11. Чтение с диска
Задача
Нужно считывать и обработывать ≈ 200 GB. Многократно.
Проблема
Диск медленный, фрагментированный, места не хватает
Трофимов Михаил Опыт участия в Microsoft Malware Classification Challenge
12. Чтение с диска
Задача
Нужно считывать и обработывать ≈ 200 GB. Многократно.
Проблема
Диск медленный, фрагментированный, места не хватает
Возможное решение
Читать сразу из .gz файла
Трофимов Михаил Опыт участия в Microsoft Malware Classification Challenge
13. Сохранение промежуточных результатов
Задача
Нужно многократно дампить и поднимать большие питоновские
структуры (словари, numpy-массивы)
Проблема
joblib / pickle∗
работают неприлично долго
Возможное решение
hickle
Трофимов Михаил Опыт участия в Microsoft Malware Classification Challenge
16. Байты как текст
2-grams: 2562
= 65536
4-grams: 2564
= 4.2 × 109
10-grams: 25610
= 1.2 × 1024
Трофимов Михаил Опыт участия в Microsoft Malware Classification Challenge
17. 2-grams
2-grams: 2562
= 65536 фичей
Собираем с каждого файла словарь вида 2-gram -> частота
Аггрегируем все файлы в разреженную матрицу
Требует O(nnz) памяти, где nnz – число ненулевых
элементов
Реализация в scipy.sparse
Трофимов Михаил Опыт участия в Microsoft Malware Classification Challenge
18. 4-grams
Аналогично:
4-grams: 2564
= 4.2 × 109
фичей
Собираем с каждого файла словарь вида 4-gram -> частота
Аггрегируем все файлы в разреженную матрицу
В чем подвох?
Трофимов Михаил Опыт участия в Microsoft Malware Classification Challenge
19. 4-grams
10-grams: 2564
= 4.2 × 109
фичей
Собираем с каждого файла словарь вида 4-gram -> частота
4-грамм (строк из 8 символов) много
Большой оверхед по памяти на создание и поддержание
словаря
Замапим 4-граммы(строки) на id(числа) [обратимая
операция]
Получим словарь вида id->частота
Аггрегируем все файлы в разреженную матрицу
Трофимов Михаил Опыт участия в Microsoft Malware Classification Challenge
20. 10-grams
4-grams: 25610
≈ 1024
фичей
Собираем с каждого файла словарь вида id -> частота
Матрица получится чудовищной
Так ли нужна обратимость отображения 10-грамм(строк)
на id(числа)?
Hash-trick!
id = hash(10-gram) % 2b
, b = 28
В итоге 2 × 108
фичей
Трофимов Михаил Опыт участия в Microsoft Malware Classification Challenge
24. Итоговое решение
Усреднение множества xgboost’ов
Разные подмножества признаков
Semi-supervised trick
top14 на публичном лидерборде
top3 на приватном лидерборде
Трофимов Михаил Опыт участия в Microsoft Malware Classification Challenge
25. Полезные штуки
PyPy / Numba / Cython
HDF5 / Hickle
"Fast Non-Standard Data Structures for Python"by Mike Korobov
Трюк с хэшированием
Разреженные матрицы
LinearSVC(L1) для обора признаков
Трофимов Михаил Опыт участия в Microsoft Malware Classification Challenge