【问题标题】:Do I need to split the data for isolation forest?我需要为隔离林拆分数据吗?
【发布时间】:2020-05-28 17:43:19
【问题描述】:

我有一个由 10049972 行 x 19 列组成的数据库。我使用 Isolation Forest 来检测异常值,然后创建了一个额外的列,将异常值设置为 -1,我将所有包含异常值的行删除为 -1,然后删除了该列。

我的问题是:我是否需要训练、测试和验证隔离林才能正常工作?也有人可以确认我的代码是否有效?

这是我的代码。

import numpy as np

import pandas as pd

import matplotlib.pyplot as plt

%matplotlib inline

from sklearn.ensemble import IsolationForest


df = pd.read_csv('D:\\Project\\database\\4-Final\\Final After.csv',low_memory=True)


iForest = IsolationForest(n_estimators=100,  contamination=0.1 , random_state=42, max_samples=200)


iForest.fit(df.values.reshape(-1,1))

pred = iForest.predict(df.values.reshape(-1,1))

pred=df['anomaly']

df=df.drop(df['anomaly'==-1],inplace=True)

df.to_csv('D:\\Project\\database\\4-Final\\IF TEST.csv', index=False) 

谢谢。

【问题讨论】:

    标签: python pandas machine-learning scikit-learn jupyter-notebook


    【解决方案1】:

    我的问题是我是否需要进行测试训练并验证隔离林才能正常工作?

    您只想在这个批处理文件中检测异常值,对吗? 在这种情况下,您的解决方案可能没问题, 但在大多数情况下,您必须分裂。

    但是,请尝试了解您何时需要进行拆分。 为了解释这一点,让我们进入一个真实的案例场景。

    假设您试图预测不同引擎的异常行为。您使用数据库中可用的数据创建一个模型,直到“今天”,然后开始预测传入数据。预测数据可能不等于用于训练的数据,对吧?那么,在配置模型时如何模拟这种情况呢?使用训练-测试-验证并使用正确的指标进行评估。

    编辑:让我添加一个示例。我会尽量让它变得超级简单。

    如果您的引擎数据库数据是:

    +----+-------------+--------------+
    | id | engine_type | engine_value |
    +----+-------------+--------------+
    |  1 |           0 | 0.25         |
    |  2 |           0 | 0.40         |
    |  3 |           1 | 0.16         |
    |  4 |           1 | 0.30         |
    |  5 |           0 | 5.3          | <- anomaly
    |  6 |           1 | 14.4         | <- anomaly
    |  7 |           0 | 16.30        | <- anomaly
    +----+-------------+--------------+
    

    并且全部用它来训练模型,模型会用三个异常值来训练,对吧?该算法将使用这 3 个异常值创建森林,因此模型可以更容易地预测它们。

    现在,这个生产数据会发生什么:

    +----+-------------+--------------+
    | id | engine_type | engine_value |
    +----+-------------+--------------+
    |  8 |           1 | 3.25         | <- anomaly
    |  9 |           1 | 4.40         | <- anomaly
    | 10 |           0 | 2.16         |
    +----+-------------+--------------+
    

    你将它传递给你的模型,它说这些点不是异常的,而是正常的数据,因为它认为你的“阈值”是大于 5 的值。

    这个“阈值”是算法超参数的产物,也许在其他配置下,模型可能已经将值预测为异常,但您没有测试模型泛化

    那么如何改进这个配置呢?拆分您当时可用的数据。除了使用所有数据库数据进行训练之外,您还可以只使用其中的一部分进行训练并使用另一部分进行测试,例如将此部分用作训练数据:

    +----+-------------+--------------+
    | id | engine_type | engine_value |
    +----+-------------+--------------+
    |  1 |           0 | 0.25         |
    |  2 |           0 | 0.40         |
    |  3 |           1 | 0.16         |
    |  4 |           1 | 0.30         |
    |  7 |           0 | 16.30        | <- anomaly
    +----+-------------+--------------+
    

    这是测试数据:

    +----+-------------+--------------+
    | id | engine_type | engine_value |
    +----+-------------+--------------+
    |  5 |           0 | 5.3          | <- anomaly
    |  6 |           1 | 14.4         | <- anomaly
    +----+-------------+--------------+
    

    并设置使该算法正确预测测试数据的超参数组合。它是否确保未来的预测是完美的?不,它没有,但它与仅拟合数据而不评估模型的泛化程度不同。

    还有人可以确认我的代码是否有效吗?

    是的,但让我添加一个建议,改变这个:

    iForest.fit(df.values.reshape(-1,1))
    
    pred = iForest.predict(df.values.reshape(-1,1))
    
    pred=df['anomaly']
    

    到这里:

    df['anomaly'] = iForest.fit_predict(df.values.reshape(-1,1))
    

    另外,如果您使用的是新的 pandas 版本,请使用:

    df['anomaly'] = iForest.fit_predict(df.to_numpy().reshape(-1,1))
    

    【讨论】:

    • 非常感谢您提供的示例!很抱歉问,但我确实对您的示例还有一些问题,以查看我的理解是否正确,因为我对所有这些都是新手并且有点困惑。 1- 在示例的第一部分中,由于包含异常的正常数据库用于训练数据库以预测未来值,因此这些异常的出现将导致在预测数据库中包含异常,因为它们门槛变高了吗?
    • 2- 在第二个例子中,由于我们拆分只有1个异常的数据库,因此阈值要低得多,并且将使用测试数据库来查看隔离林是否会检测到测试数据库中的值异常? 3- 在我的代码中,由于我有 19 列,隔离林是否会单独应用于每一列?
    • 1.列车中存在的异常可能导致模型排除预测数据集中的异常。这是可能的,因为我们真的不知道。
    • 2.阈值不仅由用于训练的数据定义,还使用超参数。如果您设置 10 棵树而不是默认的 100 棵,则生成的阈值会有所不同。目标是了解最佳树数,然后使用所有可用数据和最佳树数训练算法。
    • 3. towardsdatascience.com/… 4. 如果目标是仅将模型用于该文件,那么您的解决方案是可以的。 5.是保证以后准确率不会下降的方法!
    猜你喜欢
    • 2020-07-07
    • 2019-07-20
    • 2020-05-24
    • 2020-10-07
    • 2014-07-17
    • 1970-01-01
    • 1970-01-01
    • 2018-01-05
    • 1970-01-01
    相关资源
    最近更新 更多