如何在神经网络中使用 IP 地址作为特征

Shl*_*rtz 2 python machine-learning neural-network deep-learning keras

使用Keras,我想构建一个 LSTM 神经网络来分析我系统中的用户行为。我的功能之一是包含用户 IP 地址的字符串,可以是 IPv4 或 IPv6。

正如我所见,我需要嵌入地址,以便将其用作功能。在Keras 文档中没有明确的解释如何做这样的事情。

什么是一个好的开始?

and*_*ino 9

在您的模型中对 IP 地址进行编码的最佳方式取决于它们与您的问题相关的语义。有几种选择:

一键编码

这种方式假设 IP 地址之间根本没有关系。1.2.3.4被假定为从不同1.2.3.5255.255.255.255。为了防止有 2^32 个特征,您只需将训练数据中的 IP 地址编码为特征,并将新 IP 视为未知。实现这一目标的一个方法是sklearnLabelBinarizer

train_data = ['127.0.0.1', '8.8.8.8', '231.58.91.112', '127.0.0.1']
test_data = ['8.8.8.8', '0.0.0.0']

ip_encoder = LabelBinarizer()
print('Train Inputs:\n', ip_encoder.fit_transform(train_data))
print('Test Inputs:\n', ip_encoder.transform(test_data))
Run Code Online (Sandbox Code Playgroud)

这打印:

Train Inputs:
 [[1 0 0]
 [0 0 1]
 [0 1 0]
 [1 0 0]]
Test Inputs:
 [[0 0 1]
 [0 0 0]]
Run Code Online (Sandbox Code Playgroud)

注意One-hot encoding 和 dummy encoding之间的区别。

使用 32 或 128 个特征

在这里,您在 IP 中的每个位使用一个功能。

好处:

  1. 该模型可以更轻松地识别属于同一子网的 IP。
  2. 即使对于训练数据中的大量不同 IP 地址,特征数量仍然很少。

缺点:

  1. 该模型不知道子网是如何工作的。如果您的训练数据实际上证明将多个 IP 推广到它们的子网是合理的,那么模型很可能不会 100% 正确地应用子网机制。我的意思是它可能会学习使用第二和第三部分1.1.1.11.1.1.2检测该特定子网,从而也将其0.1.1.1视为该子网的 IP。
  2. 减少特征数量固然很好,但也会让模型更难检测两个 IP 地址是否相同。当使用 One-Hot-Encoding 时,它直接在功能中包含此信息,而使用这种方法时,它需要在内部学习 32 / 128 个“if”语句以查看 IP 地址是否相同。但是,如果较少的“if”语句足以正确区分,则神经网络不太可能完全了解这一点。这类似于子网的处理。例如,如果“1.2.3.4”在您的训练数据中是一个非常有辨别力的 IP,即这个 IP 很可能会产生特定的结果,那么模型可能会学习根据其位的特定子集来检测这个 IP。因此,对于这些特定位具有相同值的不同 IP 将被模型类似地处理。

总的来说,这种方法需要谨慎对待。

一键编码频繁IP

如果不同 IP 的数量太多而无法为每个 IP 创建新特征,您可以检查每个 IP 是否真的足够重要以合并到模型中。例如,您可以检查 IP 的直方图。在训练数据中只有少数样本的 IP 可能值得忽略。只有少数样本,模型可能会在这些 IP 上过度拟合或完全忽略它们。因此,您可以对训练数据中的前 1000 个常用 IP 进行单热编码,并为所有其他 IP 添加一项功能。同样,您可以尝试进行一些数据预处理并根据 IP 的位置等对 IP 进行聚类。

使用数字输入

对 IPv4 使用单个 int32 功能或四个 int8 功能可能很诱人。这是一个坏主意,因为它允许模型对 IP 进行算术运算,例如1.1.1.1 + 2.2.2.2 = 3.3.3.3.

词嵌入

这是您在问题中链接的方式(https://keras.io/layers/embeddings/)。这些嵌入用于Word 嵌入,应在句子/文本上进行训练。它们通常不应用于编码 IP。