2017-06-20 108 views
0

我目前新機器學習,我將努力對涉及使用機器學習庫檢測以及可能的異常警報的項目。我將使用Apache Spark,並決定使用KMeans方法來解決該項目。如何使用K-means算法發現異常/異常

主要項目包括在分析日常文件和檢測中的一些記錄,波動變化,並報告他們作爲可能的異常(如果它們被認爲是一個基於模型)。這些文件是在一天結束時生成的,我的程序需要在第二天早上檢查它們,看看是否有異常。但是,我需要檢查異常文件vs文件,而不是在文件中。這意味着我必須比較每個文件的數據,並查看它是否適合我將按照特定算法創建的模型。我想說的是,我有一些有效的數據,我將使用該算法來訓練我的模型。然後,我必須將相同的模型應用於相同格式的其他文件,但顯然不同的數據。我不是在尋找預測列,而是在其他文件中查找異常情況。如果有異常,程序應該告訴我哪一行/列有異常,然後我必須編寫它來發送電子郵件,說明特定文件中可能存在異常。

就像我說我是新來的機器學習。我想知道如何使用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不是完美的模型,我應該使用哪種模型,我應該如何應對?

回答