使用 IsolationForest 检测高暗数据集异常值的正确方法
The proper way of using IsolationForest to detect outliers of high-dim dataset
我使用以下简单的 IsolationForest 算法来检测 20K
样本和 16
特征的给定数据集 X
的异常值,我 运行正在关注
train_X, tesy_X, train_y, test_y = train_test_split(X, y, train_size=.8)
clf = IsolationForest()
clf.fit(X) # Notice I am using the entire dataset X when fitting!!
print (clf.predict(X))
我得到结果:
[ 1 1 1 -1 ... 1 1 1 -1 1]
这个问题是:在拟合 IsolationForest
或仅 train_X
时使用整个数据集 X
在逻辑上是否正确?
是的,最终在整个数据集上进行训练在逻辑上是正确的。
考虑到这一点,您可以根据训练集的性能来衡量测试集的性能。这可以告诉您测试集是否来自与您的训练集相似的分布。
如果测试集与训练集相比得分异常,那么您可以预期未来的数据会相似。在这种情况下,我想要更多数据以更完整地了解什么是 'normal'.
如果测试集得分与训练集相似,我会更喜欢在所有数据上训练的最终隔离森林。
也许您可以以这种方式使用 sklearn TimeSeriesSplit CV 来了解多少数据足以解决您的问题?
由于这是异常检测器的未标记数据,因此定义 'normal' 时数据越多越好。
我使用以下简单的 IsolationForest 算法来检测 20K
样本和 16
特征的给定数据集 X
的异常值,我 运行正在关注
train_X, tesy_X, train_y, test_y = train_test_split(X, y, train_size=.8)
clf = IsolationForest()
clf.fit(X) # Notice I am using the entire dataset X when fitting!!
print (clf.predict(X))
我得到结果:
[ 1 1 1 -1 ... 1 1 1 -1 1]
这个问题是:在拟合 IsolationForest
或仅 train_X
时使用整个数据集 X
在逻辑上是否正确?
是的,最终在整个数据集上进行训练在逻辑上是正确的。
考虑到这一点,您可以根据训练集的性能来衡量测试集的性能。这可以告诉您测试集是否来自与您的训练集相似的分布。
如果测试集与训练集相比得分异常,那么您可以预期未来的数据会相似。在这种情况下,我想要更多数据以更完整地了解什么是 'normal'.
如果测试集得分与训练集相似,我会更喜欢在所有数据上训练的最终隔离森林。
也许您可以以这种方式使用 sklearn TimeSeriesSplit CV 来了解多少数据足以解决您的问题?
由于这是异常检测器的未标记数据,因此定义 'normal' 时数据越多越好。