2017-11-06 16 views
1

자바 클래스의 추론/예측에 H2O Autoencoder (이상 탐지)를 사용하고 싶습니다.생성 된 H2O Autoencoder/Anomaly Detection 모델을 Java API의 추론에 사용하는 방법은 무엇입니까?

R이있는 H2O DeepLearningBooklet에서 자동 인코딩 예제 "ECG Hearbeats"를 작성하고 저장했습니다. 생성 된 Java 클래스와 관련 h2o-genmodel.jar을 Java 프로젝트로 성공적으로 가져올 수 있습니다.

불행히도, 거기서 사용하는 예제 나 문서를 찾을 수 없습니다.

private static String modelClassName = "machinelearning.DeepLearning_model_R_1509973865970_1"; 

public static void main(String[] args) throws Exception { 

    hex.genmodel.GenModel rawModel; 
    rawModel = (hex.genmodel.GenModel) Class.forName(modelClassName).newInstance(); 
    EasyPredictModelWrapper model = new EasyPredictModelWrapper(rawModel); 

    RowData row = new RowData(); 
    // row.put(key, value); // TODO Add new line of input data, e.g.: 
    // 2.10,2.13,2.19,2.28,2.44,2.62,2.80,3.04,3.36,3.69,3.97,4.24,4.53,4.80,5.02,5.21,5.40,5.57,5.71,5.79,5.86,5.92,5.98,6.02,6.06,6.08,6.14,6.18,6.22,6.27,6.32,6.35,6.38,6.45,6.49,6.53,6.57,6.64,6.70,6.73,6.78,6.83,6.88,6.92,6.94,6.98,7.01,7.03,7.05,7.06,7.07,7.08,7.06,7.04,7.03,6.99,6.94,6.88,6.83,6.77,6.69,6.60,6.53,6.45,6.36,6.27,6.19,6.11,6.03,5.94,5.88,5.81,5.75,5.68,5.62,5.61,5.54,5.49,5.45,5.42,5.38,5.34,5.31,5.30,5.29,5.26,5.23,5.23,5.22,5.20,5.19,5.18,5.19,5.17,5.15,5.14,5.17,5.16,5.15,5.15,5.15,5.14,5.14,5.14,5.15,5.14,5.14,5.13,5.15,5.15,5.15,5.14,5.16,5.15,5.15,5.14,5.14,5.15,5.15,5.14,5.13,5.14,5.14,5.11,5.12,5.12,5.12,5.09,5.09,5.09,5.10,5.08,5.08,5.08,5.08,5.06,5.05,5.06,5.07,5.05,5.03,5.03,5.04,5.03,5.01,5.01,5.02,5.01,5.01,5.00,5.00,5.02,5.01,4.98,5.00,5.00,5.00,4.99,5.00,5.01,5.02,5.01,5.03,5.03,5.02,5.02,5.04,5.04,5.04,5.02,5.02,5.01,4.99,4.98,4.96,4.96,4.96,4.94,4.93,4.93,4.93,4.93,4.93,5.02,5.27,5.80,5.94,5.58,5.39,5.32,5.25,5.21,5.13,4.97,4.71,4.39,4.05,3.69,3.32,3.05,2.99,2.74,2.61,2.47,2.35,2.26,2.20,2.15,2.10,2.08 

    AutoEncoderModelPrediction p = model.predictAutoEncoder(row); 

    System.out.println(p.reconstructedRowData); 
    System.out.println(p.reconstructed[0]); 
    // TODO How to do get the MSE from object 'p'? 

이 코드는 실제로 컴파일 및 실행 :

는 여기에 몇 가지 코드와 자바 코드에서 추론에 사용되는 다른 H2O 모델과 내 경험에서 몇 가지 추측 내 첫 번째 시도이다. 그러나, 나는 정말 EasyPredictModelWrapper 제대로하는 방법을

  1. 구성을 이해하는 (또는 그냥 인스턴스화해야합니까?)하지 않는
  2. 내가 키가 없기 때문에 예측을위한 새로운 하나의 이벤트를 추가,하지만 값 심전도 하트. (나는 행의 put.AllAll이 ECG 데이터 세트의 다양한 기능에 가장 좋다고 가정합니다!)
  3. R/Python 예제에서 'recon_error < - as.data.frame (recon_error)) '어디에서 23 개의 심전도 라인 모두에 대한 재구성 오류를 볼 수 있습니까?

내가 대답은 간단하지만, 가정 문서없이 쉬운 일이 아니다는 :-)

을 찾기 위해 (그때는 임계 값을 정의하고, 임계 값에 도달하면 경고를 생성하는 실시간 응용 프로그램을 구축 할 수 있습니다)

도와 주셔서 감사합니다. 열 머리글은

+0

이 설명서를 보았습니까? https://github.com/h2oai/h2o-3/blob/master/h2o-docs/src/product/productionizing.rst#pojo-quick-start? 대부분의 질문에 대답합니까? – Lauren

+0

나는 이것을보고 얼마 전에 첫 번째 예제로 구현했습니다. 그러나 AutoEncoderModelPrediction 또는 autoencoder/anomaly 감지 기능을 사용하는 다른 H2O Java 코드를 사용하는 방법에 대한 설명서가 필요합니다. –

답변

2

(코드 끝에 main.java 예)

  1. 올바르게 그것을 가지고 그리고 그것은이 라인 rawModel = (hex.genmodel.GenModel) Class.forName(modelClassName).newInstance();

  2. key에 인스턴스화하고 value는 실제입니다 H2Oframe에 열 머리글이 없으면 H2O는 자동으로 C1, C2 등을 할당합니다.이 코드를 수동으로 작성하거나 System.out.println(java.util.Arrays.toString(rawModel.getNames()));을 사용하여 루프를 사용할 수 있습니다 (이 예는 코드 스 니펫 참조)

  3. 현재이 방법은 없지만 원래 값과 재구성 된 값을 구하여 그 값으로부터 MSE를 계산할 수 있습니다 (코드 스니 펫은 아래 참조). 마지막 몇 줄은 originalreconstructed 배열을 사용하여 MSE를 계산합니다 내 모델을 만들 때)

나는 model_id이 매개 변수 중 하나입니다, anomaly_model (바로 아래의 코드를 볼 수라고 불렀다)와 다른를 사용하는 경우, 그래서 당신은, 그 아래 마지막 코드에 사용되는 볼 이름을 업데이트해야합니다.

anomaly_model <- h2o.deeplearning(x = names(train_ecg), training_frame = train_ecg, activation = "Tanh", 
           autoencoder = TRUE,hidden = c(50,20,50),sparse = TRUE,l1 = 1e-4,epochs = 100, model_id = 'anomaly_model') 

는 여기에서 main.java 파일을 만들려면 키의 열 이름을 전달, 및 방법 결과에 내장 된 MSE를 계산하는 방법에 대한 예제 코드입니다.

(참고 : 나는 당신이 대신이 원하는대로 넣을 수있는 row.put(key, values) 랜덤 값 생성)이 도움이

import java.io.*; 
import hex.genmodel.easy.RowData; 
import hex.genmodel.easy.EasyPredictModelWrapper; 
import hex.genmodel.easy.prediction.*; 

public class main { 
    private static String modelClassName = "anomaly_model"; 

    public static void main(String[] args) throws Exception { 
    hex.genmodel.GenModel rawModel; 
    rawModel = (hex.genmodel.GenModel) Class.forName(modelClassName).newInstance(); 
    EasyPredictModelWrapper model = new EasyPredictModelWrapper(rawModel); 

    java.util.Random rng = new java.util.Random(); 
    RowData row = new RowData(); 
    for (String colName : rawModel.getNames()) { 
     row.put(colName,rng.nextDouble()); 
    } 

    AutoEncoderModelPrediction p = model.predictAutoEncoder(row); 
    System.out.println("original: " + java.util.Arrays.toString(p.original)); 
    System.out.println("reconstructedrowData: " + p.reconstructedRowData); 
    System.out.println("reconstructed: " + java.util.Arrays.toString(p.reconstructed)); 

    double sum = 0; 
    for (int i = 0; i<p.original.length; i++) { 
     sum += (p.original[i] - p.reconstructed[i])*(p.original[i] - p.reconstructed[i]); 
    } 
    double mse = sum/p.original.length; 
    System.out.println("MSE: " + mse); 
    } 
} 

희망을!

+0

완벽. 작품 ... 정확히 내가 필요했던 것! 행에 대한 무작위로 생성 된 데이터를 실제 값으로 대체해야합니다. –