我有一个数据库,包含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))