我正在处理数据,并希望为此数据生成异常检测模型。数据只包含三个feautes:Latitude,Longtitude和Speed。我将其标准化然后应用t-SNE然后再次标准化。有没有标记或目标数据。因此,它应该是无监督的异常检测。
我无法共享数据,因为它是私有的。但是,看起来像这样; Data Frame
数据中有一些非正常值,例如anormal values
这是数据的最终形状; The Data
如您所见,数据有点复杂。当我手动搜索异常实例时(通过查看特征值),我观察到红色圆圈内的实例(在下图中)应该被检测为异常。
The instances inside the red region should be anormal
我使用OneClass SVM来检测异常。以下是参数;
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
这是我最后得到的; One Class SVM model
这是一类SVM检测到的异常; Red Instances were detected as anomalies
因此,正如您所看到的,该模型预测许多实例为异常,但实际上,大多数实例应该是正常的。
我为" nu"," gamma"尝试了不同的参数值。和"度"。但是,我找不到合适的决策线来检测只有真正的异常。
我的模特有什么问题?我应该尝试不同的异常检测算法吗?我的数据不适合异常检测吗?
先谢谢
答案 0 :(得分:4)
似乎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扩展您的数据,我怀疑您可能不想在这里。
# 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