如何使用K-Means算法查找异常/异常值

时间:2017-06-20 13:02:46

标签: java apache-spark machine-learning data-mining k-means

我目前是机器学习的新手,我将参与一个项目,该项目涉及使用机器学习库来检测和警告可能的异常。我将使用Apache Spark,我决定使用KMeans方法来解决该项目。

主要项目包括分析每日文件并检测某些记录中的波动变化,并将其报告为可能的异常(如果它们被认为是基于模型的那些)。文件是在一天结束时生成的,我的程序需要在第二天早上检查它们以查看是否存在异常。但是,我需要检查异常文件与文件,而不是文件。这意味着我必须比较每个文件的数据,看看它是否适合我按照特定算法创建的模型。我想说的是,我有一些有效的数据,我将应用算法来训练我的模型。然后我必须将相同的模型应用于相同格式的其他文件,但显然是不同的数据。我不是在寻找预测列,而是在检测这些其他文件中的异常。如果存在异常,程序应该告诉我哪个行/列有异常,然后我必须对其编程以发送电子邮件,说明特定文件中可能存在异常。

就像我说我是机器学习的新手。我想知道如何使用KMeans算法来检测文件中的异常值/异常。

到目前为止,我已经创建了模型:

SparkConf conf = new SparkConf().setAppName("practice").setMaster("local");
JavaSparkContext sc = new JavaSparkContext(conf);


SparkSession spark = SparkSession
          .builder()
          .appName("Anomaly Detection")
          .getOrCreate();

String day1txt = "C:\\Users\\User\\Documents\\day1.txt";
String day2txt = "C:\\Users\\User\\Documents\\day2.txt";

Dataset<Row> day1 = spark.read().
        option("header", "true").
        option("delimiter", "\t").
        option("inferSchema", "true").
        csv(day1txt);

day1 = day1.withColumn("Size", day1.col("Size").cast("Integer"));
day1 = day1.withColumn("Records", day1.col("Records").cast("Integer"));

VectorAssembler assembler = new VectorAssembler()
        .setInputCols(new String[]{"Size", "Records"})
        .setOutputCol("features");

Dataset<Row> day1vector = assembler.transform(day1);

KMeans kmeans = new KMeans().setK(5).setSeed(1L);
KMeansModel model = kmeans.fit(day1vector);

我不知道从这一点开始要做什么来检测异常值。我还有其他几个应该具有“规范化”数据的.txt文件,而且我还有一些具有“篡改/未规范化”数据的文件。我是否需要使用我可用的所有测试数据来训练模型,如果是,我如何使用不同的数据集训练模型?或者我只能用一个数据集训练它并与其他数据集一起测试吗?

编辑:

这是我将使用的文件(day1.txt)的示例(当然是虚拟数据/前10名)

Name    Size    Records
File1   1000    104370
File2   990     101200
File3   1500    109123
File4   2170    113888
File5   2000    111974
File6   1820    110666
File7   1200    106771
File8   1500    108991
File9   1000    104007
File10  1300    107037

这被认为是普通数据,我将使用相同格式但不同值的不同文件。然后我有一些文件,我故意添加一个异常值,如大小:1000,记录:50000。

如何使用KMeans检测到这一点?或者如果KMeans不是完美的模型,我应该使用哪种模型,我应该如何解决它?

1 个答案:

答案 0 :(得分:1)

有一个简单的方法。使用kmeans创建聚类,然后为每个聚类设置相对于该聚类中心的一些良好半径,如果某个点位于该半径之外,则它是一个异常值。

试着看一下:https://arxiv.org/pdf/1402.6859.pdf

有一些离群值检测技术如: OneClassSvm AngleBaseOutlierDetection 等等。试着看看:http://scikit-learn.org/stable/modules/outlier_detection.html