【问题标题】:How to encode string categorical data?如何编码字符串分类数据?
【发布时间】:2019-10-24 13:11:26
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 列名是什么?如果您要使用get_dummies(),您的所有条目都需要有一组共同的列,如果您的程序不都进行相同数量的API调用,您将有不同数量的列,这也不允许用于 get_dummies()
  • 在创建 ML 模型时,有很多因素决定了您应该如何对数据集进行建模。我建议您添加模型的目标是什么,以便社区可以更好地帮助您。
  • 嗨乔希!数据集没有任何列名。所有程序都进行相同数量的 API 调用(至少,我通过限制它来确保这一点)。你建议我添加列名吗?我没有这样做,因为它没有任何意义。
  • 很公平。考虑到 API 调用是名义上的,这是有道理的。我应该如何将 API 调用映射到数值(因为我有大约 2000 个唯一的 API 调用)?如果我不明白,我很抱歉,但这对我面临的问题有什么帮助?

标签: python pandas dataframe keras scikit-learn


【解决方案1】:

这是整数编码:

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 调用次数或您认为可能会影响输出的任何其他内容。这取决于你。

【讨论】:

  • 我无法对所有 2000 个 API 调用执行此操作。为什么我不能只使用标签编码器或 One Hot 编码?
  • 您是否尝试过使用标签编码器?请更新您的问题以包含此信息。不管你怎么看,如果你想让你的模型区分 2000 个不同的 API 调用,你的结果就会有很多不同的列。
  • 我给你的答案和标签编码器会产生相同的结果。 LabelEncoder 是一个更简单的例子。如果您在使用该功能方面需要帮助,那么您应该提出一个新问题。
  • 如果我有 2000 个 API 调用并且我对数据进行一次热编码,为什么会有更多的 2000 列?
猜你喜欢
  • 2021-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多