【问题标题】:Isolation forest, how to use multiple features to predict, getting all anomalies隔离森林,如何使用多个特征进行预测,得到所有异常
【发布时间】:2020-10-01 14:06:48
【问题描述】:

我正在尝试使用 scikit learn 和 python 构建一个隔离林来检测异常。我附上了一张数据可能是什么样子的图像,我试图根据几个“大小”特征来预测“页面”。 当我打印(异常)时,每一行都被检测为-1,一个异常。这是因为我只使用“size2”对它们进行分类吗?有没有办法使用多列来帮助检测异常?我应该使 n_features 等于我正在使用的列数吗?非常感谢你的帮助。

model = IsolationForest(n_estimators = 100, max_samples = 'auto', contamination = 'auto')
model.fit(df[['pages']])
df['size2'] = model.decision_function(df[['pages']])
df['anomaly']= model.predict(df[['pages']])
print(df.head(50))
anomaly = df.loc[df['anomaly']==-1]
anomaly_index = list(anomaly.index)
print(anomaly)

【问题讨论】:

    标签: scikit-learn isolation


    【解决方案1】:

    我不确定这里是否适合隔离森林。如果您想根据大小数据预测 pages 列值,最好使用回归模型或分类器(我无法根据显示的数据判断 pages 是否是分类的)。话虽如此,如果您确实想要进行异常检测,则必须确保将模型拟合到用于预测的相同特征子集上。根据尺寸特征检测异常看起来像这样:

    df['anomaly'] = model.fit_predict(df[['size2', 'size3', 'size4']])
    

    可以选择任何列子集来训练模型,但必须使用相同的功能集调用 fitpredict

    在给出的代码中,模型在 label 列上进行训练,但用于根据 pages 列预测异常值。尽管未显示label 列,但如果其中的值与pages 列中的值有很大不同,那么它们都会被归类为异常值也就不足为奇了。此外,正如所写,size2 列并未用作预测特征,而是被pages 列的决策函数分数覆盖。

    【讨论】:

    • 非常感谢! “标签”实际上应该是“页面”,很抱歉造成混淆!
    • 当我添加 df['anomaly'] = df.fit_predict(df[['size2', 'size3', 'size4']]),我得到错误 AttributeError: 'DataFrame' object没有属性“fit_predict”,你知道这是为什么吗?谢谢!
    • 是的;对于那个很抱歉!应该是model.fit_predict,现在修好了。
    • 非常感谢!
    猜你喜欢
    • 2017-12-16
    • 1970-01-01
    • 2017-08-21
    • 2017-02-21
    • 1970-01-01
    • 2020-10-20
    • 2020-01-14
    • 2020-11-16
    • 2021-03-20
    相关资源
    最近更新 更多