复杂数据的良好异常检测模型

Good Anomaly Detection Model for a Complicated Data

我正在处理数据并希望为该数据生成异常检测模型。数据仅包含三个特征:LatitudeLongitudeSpeed。我将其归一化,然后应用 t-SNE 然后再次归一化。没有 没有 标记或目标数据。所以,它应该是一个无监督的异常检测。

我无法共享数据,因为它是私有的。但是,好像是这样的:

数据中有一些异常值如异常值:

这是数据的最终形状:

如您所见,数据有点复杂。当我手动搜索异常实例时(通过查看特征值),我观察到红圈内的实例(下图中)应该被检测为异常.

红色区域内的实例应该是异常的:

我使用 OneClassSVM 来检测异常。这是参数;

nu = 0.02
kernel = "rbf"
gamma = 0.1
degree = 3
verbose = False
random_state = rng

和模型;

# fit the model
clf = svm.OneClassSVM(nu=nu, kernel=kernel, gamma=gamma, verbose=verbose, random_state=random_state)
clf.fit(data_scaled)
y_pred_train = clf.predict(data_scaled)
n_error_train = y_pred_train[y_pred_train == -1].size

这是我最后得到的:

这是 OneClassSVM 检测到的异常,红色实例被检测为异常:

因此,如您所见,该模型将许多实例预测为异常,但实际上,这些实例中的大多数应该是正常的。

我为 nugammadegree 尝试了不同的参数值。但是,我找不到合适的决策线来检测只有真正的异常

One-class SVM 报告的一些异常似乎是全局异常,而不是局部异常。您可能想尝试 Local Outlier Factor。

它会考虑你数据的本地结构。所以左边的原始异常值是小集群的一部分,不应该是异常的。

http://scikit-learn.org/stable/modules/generated/sklearn.neighbors.LocalOutlierFactor.html

# fit the model
clf = LocalOutlierFactor()
y_pred_train = clf.fit_predict(data_scaled)
n_error_train = y_pred_train[y_pred_train == -1].size

我也会尝试隔离森林并尝试调整污染率。您不必为 IF 缩放数据,我怀疑您可能不想在这里。

http://scikit-learn.org/stable/modules/generated/sklearn.ensemble.IsolationForest.html#sklearn.ensemble.IsolationForest.predict

# fit the model
clf = IsolationForest(contamination=0.01)
clf.fit(data)
y_pred_train = clf.predict(data)
n_error_train = y_pred_train[y_pred_train == -1].size