【发布时间】:2020-02-13 12:46:23
【问题描述】:
我目前正在尝试使用 Scikit Learn 创建一个简单的异常检测 sn-p。
程序接收一个 .csv 文件,然后将其分解为 Panda 的 DataFrame。 Dataframe 有 8 列:'Src IP'; 'Dst IP'; '运动'; 'd端口'; '协议'; '加载'; '数据包'; 'TCP 标志'。
我将数据放入 IsolationForest,如下所示:
iForest = IsolationForest(n_estimators=128, max_samples='auto', max_features=1, behaviour='new', contamination='auto', random_state=None, n_jobs=-1, verbose=0, bootstrap=True)
usecols=["Src IP","Dst IP","sPort","dPort","Protocol","Load","Packets","TCP Flags"]
iForest.fit(data[usecols])
然后从 IForest 中获取异常值/异常:
pred = iForest.predict(data[usecols])
data['anomaly']=pred
outliers=data.loc[data['anomaly']==-1]
一切都很好,但是,我的问题是: 如何使用 Isolation Forest 检测网络上的异常,同时独立于“污染”属性?
在 IDS 中,低误报率至关重要。在我的情况下,我通过选择一个百分比来决定哪些条目被“污染”。
我的目标是让 Isolation Forest 自动设置污染因子,知道如果 x.csv 100% 没有污染,然后在 y.csv 上找到污染百分比。
这应该是混合 IDS 的一部分,它使用签名分析和行为来检测基于流数据 (NetFlow) 的入侵。
TLDR:IsolationForest 需要接收干净的 .csv(无污染),然后检测一组新数据(另一个 .csv 或管道数据)的异常情况。使用 ScikitLearn 怎么可能?
【问题讨论】:
-
似乎 sklearn 将在 v0.22 版本中准确地满足您的要求,其中污染因子可以选择自动计算。让我们看看它会如何!
-
@MaximeKan 谢谢你的洞察力 :) 我从一开始就想错了,在我的用例中,我不应该使用异常值检测来检测未损坏数据集中的异常,而是我应该正在使用新奇检测。在 Sklearn 文档中:异常值检测: 训练数据包含异常值,这些异常值被定义为远离其他观测值。(...) 新奇检测: 训练数据没有被异常值污染,我们有兴趣检测一个新的观察值是否是异常值。在这种情况下,异常值也称为新奇。
-
我觉得你说的很有道理,这样可能会更成功!
标签: python scikit-learn outliers unsupervised-learning anomaly-detection