如何使用IP地址作为神经网络中的一项功能

时间:2018-01-15 08:48:44

标签: python machine-learning neural-network deep-learning keras

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

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

什么是开始的好地方?

1 个答案:

答案 0 :(得分:3)

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

单热编码

这种方式假设IP地址之间根本没有关系。假设1.2.3.41.2.3.5255.255.255.255不同。为了防止具有2 ^ 32个功能,您只需将训练数据中的IP地址编码为功能,并将新IP视为未知。实现此目标的一种方法是sklearn' LabelBinarizer

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))

打印:

Train Inputs:
 [[1 0 0]
 [0 0 1]
 [0 1 0]
 [1 0 0]]
Test Inputs:
 [[0 0 1]
 [0 0 0]]

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

使用32或128个功能

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

优点:

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

    1. 该模型不了解子网的工作原理。如果您的训练数据实际上证明将多个IP推广到其子网是合理的,那么该模型很可能无法正确应用子网机制100%。我的意思是,它可能会学习使用1.1.1.11.1.1.2的第2和第3部分来检测此特定子网,从而将0.1.1.1视为此子网的IP。< / LI>
    2. 减少功能的数量很大,但它也使模型更难以检测两个IP地址是否相同。使用One-Hot-Encoding时,它会直接在功能中包含此信息,而使用此方法则需要学习32/128&#39; if&#39;内部声明以查看IP地址是否相同。但是,如果更少的话,神经网络就不可能完全学会这一点。陈述足以正确区分。这类似于子网的处理。例如,如果&#39; 1.2.3.4&#39;在您的训练数据中是一个非常有辨别力的IP,即该IP很可能产生特定的结果,该模型可能会学习基于其位的特定子集来检测该IP。因此,模型将类似地处理具有这些特定位的相同值的不同IP。
    3. 总的来说,这种方法需要谨慎对待。

      单热编码频繁IP

      如果不同IP的数量太高而无法为每个IP创建新功能,您可以检查每个IP是否实际上足够重要,以便合并到模型中。例如,您可以检查IP的直方图。在训练数据中只有少量样本的IP可能值得忽略。只有少量样本,该模型可能会过度拟合这些IP或完全忽略它们。因此,您可以对训练数据中的前1000个频繁IP进行热编码,并为所有其他IP添加一个功能。

      使用数字输入

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

      Word嵌入

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