Как кодировать строковые категориальные данные? - PullRequest
0 голосов
/ 10 июня 2019

Итак, у меня есть набор данных, который по сути представляет собой список Windows API вызовов, которые выполняет одна программа. Каждая строка принадлежит одной программе. Последовательные ячейки одной строки - это вызовы API, выполняемые одной и той же программой. Моя проблема не в том, чтобы выяснить, как encode эти категориальные данные, чтобы я мог сделать из них модель ML на основе регрессии.

Я пытался использовать метод Pandas, get_dummies(), но, похоже, это только запутало ситуацию, поскольку количество столбцов, которые, по-видимому, генерируются, экспоненциально увеличивается.

Мой набор данных выглядит примерно так -

ROW [9822] GetStartupInfoA LockResource GetCommandLineA GetModuleFileNameA ShowWindow EnableWindow DestroyWindow    lstrcpyW GetThreadLocale lstrcmpiW GlobalAlloc

У меня также есть список уникальных API, если это поможет.

Моя цель по сути состоит в том, чтобы построить модель, которая анализирует вызовы API и прогнозирует, является ли программа, выполняющая эти вызовы, мягкой или нет.

1 Ответ

0 голосов
/ 10 июня 2019

Это целочисленная кодировка:

api_dict = {
'call_1': 1,
'call_2': 2,
'call_3': 3,
...}

#grab the corresponding value from the dictionary
`api_dict.get({api_name_here})`

Я не уверен, как устроена ваша структура данных, но предполагается, что это список списков :

for row in sheet:
    for cell in row:
       cell = api_dict.get(value)

Одно горячее кодирование аналогично, за исключением того, что значения будут преобразованы в двоичные:

from keras.utils import to_categorical

data = ['cold', 'warm', 'hot'] # 3 possible values
encoded = to_categorical(data)

возвращает [[1 0 0],[0 1 0],[0 0 1]]

~ 2000 различных значений будут преобразованы в 11-значное двоичное число, что означает, что для представления всех различных вызовов API, функция преобразует каждое значение, 11 различных столбцов либо в 1, либо в 0. Это делается для сохранить данные как можно более нейтральными.

Если вы используете приведенный выше алгоритм, вы получите замену 1-1, но значение в ячейке будет где-то 1-2000. Это может повлиять на вывод вашей модели.

Альтернативы:

  1. Уменьшите количество звонков, которые вы хотите разрешить программе, это уменьшит столбцы
  2. Пересмотрите, какие данные вы хотите, чтобы ваша модель учитывала при прогнозировании. Вы можете удалить любые ненужные данные или использовать другой подход для их уменьшения.
  3. Измените структуру вашей таблицы, вместо того, чтобы регистрировать все вызовы, вы можете регистрировать такие вещи, как общее время выполнения, количество вызовов API или что-то еще, что, по вашему мнению, может повлиять на ваш вывод. Это зависит от вас.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...