2017-06-20 14 views
0

私は現在、機械学習には新しく、Machine Learningライブラリを使用して起こりうる異常について警告するプロジェクトに取り組んでいます。私はApache Sparkを使用する予定で、KMeansメソッドを使用してプロジェクトを解決することにしました。K-Meansアルゴリズムを使用して異常/異常値を見つける方法

主なプロジェクトは、毎日のファイルを分析し、いくつかのレコードの変動を検出し、それらを可能な異常として報告します(モデルに基づいて考えられる場合)。ファイルは1日の終わりに生成され、私のプログラムは翌日の朝に異常をチェックする必要があります。しかし、ファイル内ではなく、ファイルとファイルの異常をチェックする必要があります。つまり、すべてのファイルのデータを比較して、特定のアルゴリズムに従って作成するモデルに適合するかどうかを確認する必要があります。私が言うことは、モデルを訓練するためにアルゴリズムを適用する有効なデータがあるということです。それで、私はこの同じモデルを同じフォーマットの他のファイルに適用する必要がありますが、明らかに異なるデータです。私は予測列を探しているのではなく、むしろこれらの他のファイルの異常を検出しています。異常がある場合、プログラムはどの行/列に異常があるのか​​を教えて、特定のファイルに異常がある可能性があるという電子メールを送信するようプログラムする必要があります。

私は機械学習に新しいと言いました。私は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ファイルを持って、また私は "改ざん/非正規化"データを持っているファイルのカップルを持っています。私が利用可能なすべてのテストデータを使用してモデルを訓練する必要がありますか?その場合、異なるデータセットを使用してモデルを訓練するにはどうすればよいですか?あるいは、私は1つのデータセットでそれを訓練し、他のものと一緒にそれをテストすることができますか?

EDIT:これは私が使用するファイル(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 

これは、通常のデータを検討し、そしてIれます同じフォーマットではあるが同じ範囲の異なる値を持つ異なるファイルを持つことになります。次に、サイズ:1000、レコード:50000のような外れ値をいくつか追加したファイルがあります。

KMeansでどのように検出できますか? KMeansが完璧なモデルではない場合は、どのモデルを使用する必要がありますか?

答えて

1

これには簡単な方法があります。 kmeansを使用してクラスタを作成し、各クラスタについて、そのクラスタの中心に関していくらかの良い半径を設定します。ある点がその半径から外れている場合、それは外れ値です。

は、このを見てみてください: OneClassSvmまたは AngleBaseOutlierDetectionなど: https://arxiv.org/pdf/1402.6859.pdf


は、のようないくつかの外れ値検出テクニクスがあります。これを見てみてください:http://scikit-learn.org/stable/modules/outlier_detection.html

関連する問題