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