使用Keras,我想构建一个LSTM神经网络来分析我系统中的用户行为。我的一个功能是包含用户IP地址的字符串,可以是IPv4或IPv6。
我认为我需要嵌入地址,以便将其用作功能。 在Keras documentation中,没有明确的解释如何做这样的事情。
什么是开始的好地方?
答案 0 :(得分:3)
在模型中编码IP地址的最佳方式取决于它们与您的问题相关的语义。有几种选择:
这种方式假设IP地址之间根本没有关系。假设1.2.3.4
与1.2.3.5
与255.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之间的区别。
在这里,您在IP中每位使用一个功能。
优点:
缺点:
1.1.1.1
和1.1.1.2
的第2和第3部分来检测此特定子网,从而将0.1.1.1
视为此子网的IP。< / LI>
总的来说,这种方法需要谨慎对待。
如果不同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
。
这是您在问题(https://keras.io/layers/embeddings/)中链接的方式。这些嵌入适用于Word Embeddings,应该在句子/文本上进行训练。它们不应该用于编码IP。