我有一个不包含异常值的训练数据集:
train_vectors.shape
(588649, 896)
而且,我还有另一组测试向量 ( test_vectors
),它们都是异常值。
这是我进行异常值检测的尝试:
from sklearn.ensemble import IsolationForest
clf = IsolationForest(max_samples=0.01)
clf.fit(train_vectors)
y_pred_train = clf.predict(train_vectors)
print(len(y_pred_train))
print(np.count_nonzero(y_pred_train == 1))
print(np.count_nonzero(y_pred_train == -1))
Output:
588649
529771
58878
因此,这里的异常值百分比约为 10%,这是 sklearn 中用于隔离森林的默认污染参数。请注意,训练集中没有任何异常值。
测试代码和结果:
y_pred_test = clf.predict(test_vectors)
print(len(y_pred_test))
print(np.count_nonzero(y_pred_test == 1))
print(np.count_nonzero(y_pred_test == -1))
Output:
100
83
17
所以,它只检测到 100 个异常中的 17 个。有人可以告诉我如何提高性能。我完全不确定为什么该算法需要用户指定污染参数。我很清楚它被用作阈值,但我如何事先知道污染水平。谢谢!