首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在神经网络中使用IP地址作为特征

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

Stack Overflow用户
提问于 2018-01-15 08:48:44
回答 2查看 6K关注 0票数 4

使用喀拉斯,我想要建立一个LSTM神经网络来分析我的系统中的用户行为。我的一个特性是包含用户IP地址的字符串,可以是IPv4或IPv6。

在我看来,我需要嵌入地址,这样它就可以作为一个特性使用。在Keras文档中,没有明确的解释如何做这样的事情。

什么是个好的开始?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-01-15 09:49:44

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

单热编码

这种方式假定IP地址之间根本没有任何关系。1.2.3.4被认为与1.2.3.5255.255.255.255一样不同。为了防止出现2^32功能,您只将培训数据中的IP地址编码为功能,并将新IP地址视为未知的。实现这一目标的一种方法是sklearnLabelBinarizer

代码语言:javascript
复制
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))

这些指纹:

代码语言:javascript
复制
Train Inputs:
 [[1 0 0]
 [0 0 1]
 [0 1 0]
 [1 0 0]]
Test Inputs:
 [[0 0 1]
 [0 0 0]]

注意单热编码和虚拟编码之间的区别。

使用32或128个特性

在这里,您可以在IP中使用每比特一项功能。

优势:

  1. 该模型更容易识别属于同一子网的IP。
  2. 即使在培训数据中有大量不同的IP地址,功能的数量仍然很小。

缺点:

  1. 模型不知道子网是如何工作的。如果您的培训数据确实有理由将多个IP推广到他们的子网,那么该模型很有可能不会100%正确地应用子网机制。我的意思是,它可能会学习使用1.1.1.11.1.1.2的第2和第3部分来检测这个特定的子网,从而将0.1.1.1作为这个子网的IP来对待。
  2. 减少功能的数量是很大的,但它也使模型更难检测两个IP地址是否相同。在使用单热编码时,它直接将这些信息包含在功能中,而使用这种方法时,需要在内部学习32 / 128 'if‘语句,以查看IP地址是否相同。但神经网络不太可能完全了解这一点,如果更少的“if”语句足以正确区分。这类似于子网的处理。例如,如果'1.2.3.4‘在您的培训数据中是一个非常有区别的IP,即这个IP非常有可能产生特定的结果,那么该模型可能会学习根据其比特的一个特定子集来检测这个IP。因此,对于这些特定比特具有相同值的不同IP将被模型类似地处理。

总的来说,需要认真对待这一做法。

单热编码频繁IP

如果不同IP的数量太高,无法为每个IP创建一个新特性,则可以检查每个IP是否真的足够重要,可以合并到模型中。例如,您可以检查IP的直方图。在培训数据中只有少数几个样本的IPs可能值得忽略。只有几个样本,该模型可能会过度适用于这些IP,或者完全忽略它们。因此,您可以对培训数据中最常见的1000个in进行一次热编码,并为所有其他in添加一个功能。类似地,您可以尝试进行一些数据预处理,并根据IP的位置等对其进行聚类。

使用数值输入

对于一个int32特性或四个int8特性,使用IPv4可能很有诱惑力。这是个坏主意,因为它允许模型在IP(如1.1.1.1 + 2.2.2.2 = 3.3.3.3 )上进行算术运算。

字嵌入

这就是您在问题(https://keras.io/layers/embeddings/)中链接到的方式。这些嵌入是针对字嵌入的,应该对其进行句子/文本方面的培训。通常不应该使用它们来编码IP。

票数 13
EN

Stack Overflow用户

发布于 2022-05-21 11:59:36

您可以使用python的图书馆

通过使用库,可以使用以下方法将IP地址转换为整数值:

代码语言:javascript
复制
>>> str(ipaddress.IPv4Address('192.168.0.1'))
'192.168.0.1'
>>> int(ipaddress.IPv4Address('192.168.0.1'))
3232235521
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48259511

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档