如何编码字符串分类数据?

时间:2019-06-10 06:03:31

标签: python pandas dataframe keras scikit-learn

因此,我有一个数据集,该数据集实质上是单个程序进行的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 :(得分:0)

这是整数编码:

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调用次数或您认为可能影响输出的任何其他信息。由您决定。