我的问题是我是否需要进行测试训练并验证隔离林才能正常工作?
您只想在这个批处理文件中检测异常值,对吗? 在这种情况下,您的解决方案可能没问题, 但在大多数情况下,您必须分裂。
但是,请尝试了解您何时需要进行拆分。
为了解释这一点,让我们进入一个真实的案例场景。
假设您试图预测不同引擎的异常行为。您使用数据库中可用的数据创建一个模型,直到“今天”,然后开始预测传入数据。预测数据可能不等于用于训练的数据,对吧?那么,在配置模型时如何模拟这种情况呢?使用训练-测试-验证并使用正确的指标进行评估。
编辑:让我添加一个示例。我会尽量让它变得超级简单。
如果您的引擎数据库数据是:
+----+-------------+--------------+
| 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))