我在使用隔离森林时是否需要拆分数据?

我有一个数据库,包含10049972行和19列。我使用隔离森林来检测异常值,然后创建了一个额外的列,将异常值设为-1,我删除了所有包含-1的行,然后移除了该列。

我的问题是:我是否需要对隔离森林进行训练、测试和验证才能使其工作?另外,能否有人确认我的代码是否有效?

这是我的代码。

import numpy as npimport pandas as pdimport matplotlib.pyplot as plt%matplotlib inlinefrom sklearn.ensemble import IsolationForestdf = 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) 

谢谢你。


回答:

我的问题是使用隔离森林时是否需要进行测试、训练和验证?

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

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

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

编辑:让我添加一个例子。我会尽量让它非常简单。

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

+----+-------------+--------------+| 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+----+-------------+--------------+

如果你用所有数据来训练模型,模型会使用这三个异常值来训练,对吗?算法会使用这三个异常值来创建森林,这样模型就更容易预测它们。

现在,如果有这样的生产数据会发生什么:

+----+-------------+--------------+| 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))

Related Posts

神经网络反向传播代码不工作

我需要编写一个简单的由1个输出节点、1个包含3个节点的…

值错误:y 包含先前未见过的标签:

我使用了 决策树分类器,我想将我的 输入 作为 字符串…

使用不平衡数据集进行特征选择时遇到的问题

我正在使用不平衡数据集(54:38:7%)进行特征选择…

广义随机森林/因果森林在Python上的应用

我在寻找Python上的广义随机森林/因果森林算法,但…

如何用PyTorch仅用标量损失来训练神经网络?

假设我们有一个神经网络,我们希望它能根据输入预测三个值…

什么是RNN中间隐藏状态的良好用途?

我已经以三种不同的方式使用了RNN/LSTM: 多对多…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注