首页 > 解决方案 > 如何编码字符串分类数据?

问题描述

所以我有一个数据集,它本质上Windows API是单个程序进行的调用列表。每一行属于一个程序。同一行的连续单元格是同一程序进行的 API 调用。我的问题是无法弄清楚如何处理encode这些分类数据,以便我可以从中制作基于回归的ML模型。

我尝试使用该Pandas方法,get_dummies()但这似乎只是把事情搞砸了,因为似乎生成的列数呈指数增长。

我的数据集看起来像这样 -

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

如果有帮助的话,我还有唯一 API 的列表。

我的目标本质上是建立一个模型来分析 API 调用并预测进行这些调用的程序是否是良性的。

标签: pythonpandasdataframekerasscikit-learn

解决方案


这是整数编码:

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 调用,该函数将每个值转换为 1 或 0 的 11 个不同列。这样做是为了保留数据尽可能中立。

如果你使用我上面提供的算法,你最终会得到一个 1-1 的替换,但单元格中的值将是 1-2000 之间的任何值。这可能会影响模型的输出。

备择方案:

  1. 减少您希望允许程序进行的调用量,这将减少列
  2. 重新考虑您希望模型在进行预测时考虑哪些数据。您可以删除任何不需要的数据或使用不同的方法来减少它。
  3. 更改表的结构,而不是记录所有调用,您可以记录总运行时间、API 调用次数或您认为可能影响输出的任何其他内容。由你决定。

推荐阅读