微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

具有多个特征的隔离森林将一切检测为异常

如何解决具有多个特征的隔离森林将一切检测为异常

我有一个隔离森林实现,我在其中获取了特征(所有都是数字);将它们缩放到 0 到 1 之间

postRequestOptions.url = `${nsoObj.protocol}://${nsoObj.ipAddress}:${nsoObj.httpPortNbr}/jsonrpc`;
    postRequestOptions.headers = {
      'Content-Type': 'application/json'
    };
    postRequestOptions.body = {
      jsonrpc: '2.0',id: 1,method: 'login',params: {
        user: nsoObj.userName,passwd: nsoObj.password
      }
    };
    postRequestOptions.timeout = 5000;//should be outside the body
    request(postRequestOptions,(error,response,loginResponse) => {
      console.log('\n error: ',error);
      console.log('\n loginResponse: ',loginResponse);

      if (error || !loginResponse.id) {
        responSEObj = {
          status : 'error',msg : `Error occurred while performing Login into "${nsoObj.nsoNickName}"  Instance. ${error}`,body : null
        };
        reject(responSEObj);
      } else {
        loginResponse.sessionId = response.headers['set-cookie'][0];
        responSEObj = {
          status : 'success',msg : `Successfully performing Login into "${nsoObj.nsoNickName}"  Instance`,body : loginResponse
        };
        resolve(responSEObj);
      }
    });
  });

然后调用预测:

from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
data = scaler.fit_transform(df)
x = pd.DataFrame(data)

在这个例子中,我有 23 个数字特征。

当我运行脚本时,它绝对为每个结果返回 1。

当我将特征集限制为 2 列时,它返回 1 和 -1 的混合。

我该如何解决这个问题?

谢谢

解决方法

综上所述,Isolation Forest 所做的就是计算隔离一个样本所需的分裂次数。为了生成树,它随机选择一个特征,然后随机选择所选特征的最大值和最小值之间的分割值。

这个想法是较短的路径可能是异常。

您可能遇到的问题是您有几个对区分异常没有用的特征。因此,由于大量“非重要”特征,重要特征被隐藏。因此,可能您在第二个模型中选择的两个特征非常具有解释性。

如果用最重要的特征训练IsolationForest模型,在正常样本和异常样本之间隔离一个样本所需的分裂次数差异会更大。所以分类会更容易。每个问题都会在不同数量的特征下表现得更好。

因此,要解决您的问题,请尝试通过了解您的实际问题来选择最佳功能。此外,尝试仅使用正常样本拟合模型,或者至少大多数样本 (90%) 是正常的。如果不是,您的模型将了解到某些异常是非常常见的,并将它们归类为正常。但是,如果您知道数据训练中哪些值异常,请调整超参数 contamination

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。