我一直在关注Andrew NG的Coursera AI课程,特别是关于神经网络的部分,我计划在日志文件数据上实现一个神经网络。
我的日志文件包含以下类型的数据:
<发起请求的机器IP><请求日期><请求时间><服务器上被访问的资源名称><响应代码><服务器提供页面所需时间>
我知道还有其他分类算法可以用于此任务,例如朴素贝叶斯
和局部异常因子
,但我想通过一个实际应用的问题来接触神经网络。
我读过关于神经网络自组织映射的内容,这似乎更适合这种类型的问题,因为日志文件没有任何结构,但这似乎是一个更高级的话题。
我计划不使用自组织映射神经网络,而是通过将数据分组为键值对来从日志文件数据中创建训练数据,其中键是<发起请求的机器IP>
,每个键的值是[<服务器上被访问的资源名称>, ><服务器提供页面所需时间>]
基于上述日志文件数据,我打算使用神经网络来:
根据访问的资源对相似的IP行为进行分类。在特定时间段/时刻对行为进行分类,因此在特定时刻哪些IP的行为相似。
我不知道从哪里开始。我已经实现了一些非常基本的神经网络来执行整数运算,但现在我想实现一个基于我所拥有数据的有用网络。
基于日志数据格式,这是一个好的用例吗?
关于如何开始这项任务,有什么建议吗?
我希望这个问题不是太泛泛而谈,我只是不确定在开始实现神经网络时应该考虑哪些问题。
更新:
我想输出最适合由神经网络生成的数据。
为此,我认为输出基于相似度分数在不同时间段对用户的分类是合适的。
为了生成相似度分数,我可以计算每个IP地址访问资源的次数:
例如:
1.2.3.A,4,3,11.2.3.B,0,1,21.2.3.C,3,7,3
然后生成:
<一天中的小时>,<IP地址X>,<IP地址Y>,<相似度分数>
:
1,1.2.3.A,1.2.3.B,.31,1.2.3.C,1.2.3.B,.21,1.2.3.B,1.2.3.B,02,1.2.3.D,1.2.3.B,.7642,1.2.3.E,1.2.3.B,.3323,1.2.3.F,1.2.3.B,.631
这样就可以开始关联用户在一天中的行为模式。
这适用于神经网络吗?
我意识到我在寻找一个适合神经网络的问题,但这是一个合适的问题吗?
回答:
基于日志数据格式,这是一个好的用例吗?
你可以使用它作为数据集来训练神经网络以预测
未来值或分类
它们为标签(或类别)。对于某些类型的神经网络(特别是多层感知器
),这取决于你在训练神经网络期间如何组织你的数据集。还有其他情况你可以对样本进行分组(也称为聚类
)。
神经网络概念
由于你有按字段
(或属性)分隔的历史数据,你可以创建一个神经网络
模型来分类
或预测
可能的未来值。
鉴于神经网络是一个由训练步骤定义的数学模型
,你必须定义输入和输出集以在训练期间使用来定义这个模型(神经网络)。鉴于此,你的定性值(文本、字符、字母等)必须转换为定量值,例如:
A 你转换为 1B 你转换为 2C 你转换为 3...Z 你转换为 N
之后,你可以将你的数据集按样本排列,以便将其分成输入列表和每个样本的理想输出。例如,假设你有一个数据集,定义房地产市场上的房屋及其价格。你有任务为未来的新房屋定义一个价格(建议),你的训练集的一个样本可能如下所示:
输入:
卧室 ; 浴室 ; 车库 ; 靠近地铁1 ; 1 ; 0 ; 13 ; 2 ; 2 ; 12 ; 2 ; 1 ; 0
理想输出(分别对应每个输入样本)
价格100.000150.000230.000
并使用这些集合来训练神经网络,为提供特征的未来房屋建议一个价格
你的问题
在你的案例中,IPs
字段可以转换为定量值。例如:
1.2.3 转换为 11.2.4 转换为 21.2.5 转换为 3
假设你想对相似度分数
字段进行分类,那么,你可以使用一天中的小时
、IP地址X
和IP地址Y
列作为输入集,而输出集只有相似度分数
。下图展示了如何处理它(一个简单的前馈神经网络)。
有许多工具可以让你轻松地使用神经网络,你可以使用double
值的数组来定义这些集合,对象将为你进行训练。我一直在使用Heaton Research的Encog框架,它支持Java、C#、C++和其他语言。还有另一个称为Accord框架,但它仅适用于.Net。
使用Encog为Java实现前馈神经网络
的一个非常简单的示例:
BasicNetwork network = new BasicNetwork();// 在神经网络中添加层network.addLayer(new BasicLayer(null, true, 3));network.addLayer(new BasicLayer(new ActivationTANH(), true, 4));network.addLayer(new BasicLayer(new ActivationTANH(), true, 1));// 完成并随机化神经网络network.getStructure().finalizeStructure();network.reset();// 定义一个随机训练集。// 你可以在这里使用你的double数组来定义MLDataSet training = RandomTrainingFactory.generate(1000, 5, network.getInputCount(), network.getOutputCount(), -1, 1);ResilientPropagation train = new ResilientPropagation(network, training);double error = 0;Integer epochs = 0;//开始训练do { //训练 train.iteration(); //计算循环的迭代次数 epochs++; //获取神经网络在训练集上的误差 error = train.getError();// 停止训练的条件} while (epochs < 1000 && error > 0.01);
注意:我没有测试这段代码。
如果你刚开始接触神经网络,我建议你实现你的模型,并使用UCI机器学习库的数据集进行尝试。那里有许多用于分类、回归和聚类问题的数据库,你可以测试你的实现。