我目前正在尝试使用Scikit学习创建一个简单的异常检测片段。
程序接收到一个.csv文件,然后将其分解为熊猫的DataFrame。Dataframe有8列:“Src IP”;“Dst IP”;“体育运动”;“dPort”;“协议”;“Load”;“数据包”;“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]然而,我的问题是:如何使用隔离森林来检测网络上的异常,同时独立于“污染”属性呢?
在IDS中,具有较低的假阳性率是至关重要的。在我的例子中,我通过选择一个百分比来决定哪些条目被“污染”。
我的目标是使隔离森林自动设定污染因子,如果x.csv 100%清除污染,那么在y.csv上找出污染的百分比。
这应该是混合IDS的一部分,它使用签名分析和行为来检测基于流数据(NetFlow)的入侵。
TLDR:IsolationForest需要接收干净的.csv (无污染),然后在新的数据集(另一个.csv或管道数据)上检测异常。怎么可能使用ScikitLearn呢?
发布于 2020-02-25 22:20:05
如果您有一个仅包含正常数据的培训集,则设置contamination=0。若要为异常选择合适的阈值,请使用验证集并绘制异常分数的直方图。如果没有标记的数据,这只能启发式地完成:
要获得最大的真正(但牺牲假阳性),请根据预算设置用于查看阳性的资源的阈值。您可以根据入站数据率、直方图统计数据中的预期阳性值以及每次评估的成本(时间/金钱)计算此值。
为了最大限度地减少假阳性,将阈值设置为稍微超出现有分数。因此,假设培训/验证实际上不包含任何异常,任何新的和不同的都是反常的。有时这被称为新颖性检测。
如果可以通过查看数据来确定某物是真异常还是假异常,我建议对大约10-100个异常得分最高的项目这样做。这将通常是非常快的标记所有的数据,并有助于估计假阳性率。
当您将此模型投入生产时,您的异常行为协议应确保对案例进行评估,并将其评分为异常/非异常。然后是您的未来标签验证/测试数据,您可以使用这些数据来调整阈值。
如果在验证/测试集中(但不是在培训中)标记了异常/不异常,那么可以使用它来优化阈值,从而使用超参数搜索来最大化/最小化所需的度量。
https://stackoverflow.com/questions/58418348
复制相似问题