测试集上的异常值相对于训练集非常低

问题描述 投票:0回答:1

我正在使用 scikit-learn 一类 SVM 进行异常值检测。但相对于训练集,在测试集上检测到的异常值数量非常低。

单类 SVM 的每个输入都是三个浮点数 [float1、float2、float3] 的列表。 所有列均使用最小-最大缩放比例缩放为 0 到 1 之间的值。

我按如下方式初始化并拟合 SVM:

clf = OneClassSVM(kernel='linear', nu=0.01, gamma='auto').fit(training_and_testing_sets[:TRAINING_SET_SIZE])

因为我对 nu 使用了 0.01 的值。我预计测试集上的异常值数量为整个测试集的 1%。但它是 0.004%。测试集也相应地缩放。

造成这种差异的原因可能是什么以及如何排除故障?

machine-learning scikit-learn svm anomaly-detection
1个回答
1
投票

这可能是由训练和测试分布的差异引起的:如果测试分布本质上比训练分布具有更少的异常值,那么与训练相比,一个好的模型应该将测试集中较小比例的数据点标记为异常值设置。

另一个原因可能是模型不好,即过拟合或欠拟合,因此无法泛化到测试集。

解决问题的一个好方法是可视化您的数据集和模型的决策边界。这个来自 scikit-learn https://scikit-learn.org/stable/auto_examples/miscellaneous/plot_anomaly_comparison.html#sphx-glr-auto-examples-miscellaneous-plot-anomaly-comparison-py 的示例包含一些要绘制的代码异常值检测数据集和模型的决策边界。由于您的数据是 3 维的,您可以应用 PCA (https://scikit-learn.org/stable/modules/decomposition.html#pca) 来以 2D 形式可视化您的数据集。

最后,我建议尝试使用默认的

nu
gamma
OneClassSVM(kernel='rbf')
的 rbf 内核。在更改模型之前使用默认超参数测试模型始终是一个很好的做法。

© www.soinside.com 2019 - 2024. All rights reserved.