Introduction to h2o
1. 개요
머신 러닝은 현대 소프트웨어 개발에 필수적입니다. 우리는 다양한 아키텍처로 모델을 구축하고, 서로 다른 알고리즘을 사용하여 훈련시키며, 신경망으로 시스템을 개선하여 놀라운 결과를 달성합니다.
이 자습서에서는 h2o 플랫폼을 탐구할 것입니다. 이 플랫폼은 모델 생성, 훈련 및 조정을 간단하게 도와줍니다.
2. 오픈 소스 h2o 플랫폼 설치
h2o는 웹사이트에서 다운로드할 수 있습니다. 다운로드한 폴더에서 다음 명령어로 h2o 플랫폼을 시작할 수 있습니다:
java -jar h2o.jar
애플리케이션이 시작된 후에는 http://localhost:54321에서 웹 콘솔에 접근할 수 있습니다:
메인 페이지에서는 H2O 플랫폼에서 사용할 수 있는 작업들의 목록을 볼 수 있습니다. 이 목록은 메뉴 바를 사용하여도 표시할 수 있습니다. 상단 메뉴로 이동하여 도움말 옵션 아래의 도로 나를 안내해줘를 선택해보세요.
3. 데이터셋 준비
플랫폼 작업을 시작하기 전에 모델 훈련을 위한 데이터셋을 준비해야 합니다.
우리는 머신 러닝에서의 표준 분류 문제 중 하나를 해결할 것입니다. 이 도전에 대한 인기 있는 데이터셋은 iris라고 불립니다.
이 데이터셋에는 다양한 꽃의 종류와 그 속성들이 있습니다. 여기에서 CSV 형식으로 다운로드해 보세요. 데이터셋 파일에서는 다음 정보를 확인할 수 있습니다:
"sepal.length","sepal.width","petal.length","petal.width","variety"
5.1,3.5,1.4,.2,"Setosa"
4.9,3,1.4,.2,"Setosa"
4.7,3.2,1.3,.2,"Setosa"
...
5.8,2.7,3.9,1.2,"Versicolor"
6,2.7,5.1,1.6,"Versicolor"
5.4,3,4.5,1.5,"Versicolor"
...
6.5,3,5.2,2,"Virginica"
6.2,3.4,5.4,2.3,"Virginica"
5.9,3,5.1,1.8,"Virginica"
여기서는 아이리스 꽃의 특성과 특정 특성과 일치하는 꽃의 이름이 포함되어 있습니다.
4. 모델 훈련
준비된 데이터셋을 사용하여 모델을 훈련시켜 봅시다.
4.1. 데이터셋 가져오기
웹 콘솔에서 준비된 데이터셋을 로드합니다. importFiles 옵션을 사용해야 합니다. 상단 메뉴에서 데이터 옵션 아래의 파일 가져오기를 선택한 후, 데이터셋이 있는 폴더를 선택하고 파일을 검색한 다음 가져오기 버튼을 누릅니다:
데이터셋이 업로드되면 getFrames 함수를 사용할 수 있습니다. 상단 메뉴에서 데이터 옵션 아래의 모든 프레임 목록을 선택한 후 구문 분석 버튼을 누릅니다:
이 작업의 출력에서 데이터셋 열 설명과 몇 개의 예제를 확인할 수 있습니다.
표준 머신 러닝 관행을 따르고 모델에 대한 데이터를 준비하려면 데이터셋을 훈련 및 테스트 부분으로 분할해야 합니다. splitFrame 함수를 사용할 것입니다. 상단 메뉴에서 데이터 옵션 아래의 프레임 분할을 선택합니다. 이제 훈련과 테스트를 위해 일반적인 80/20 비율을 적용하겠습니다:
이제 모델을 구축해 보겠습니다. 상단 메뉴에서 모델 옵션을 선택합니다. 우리는 랜덤 포레스트 알고리즘을 사용할 것입니다. 이 알고리즘은 분류 문제에 잘 작동합니다:
모델 훈련 과정을 가능하게 하려면 trainingframe, validationframe, response_column을 지정해야 합니다. 선택한 알고리즘에 따라 더 나은 결과를 얻기 위해 수정할 수 있는 많은 다른 속성들이 있습니다. 모든 속성이 구성된 후 모델 빌드 버튼을 누릅니다:
h2o의 또 다른 훌륭한 기능은 AutoML입니다. 상단 메뉴에서 모델 옵션 아래의 자동 ML 실행을 선택합니다. 특정 알고리즘을 사용하고자 할 경우 이 기능을 선택할 수 있습니다. 여기에서 일반 빌드 과정과 동일한 매개변수를 지정해야 합니다. 또한 플랫폼이 모든 모델을 훈련하도록 원하는 maxruntimesecs 값을 설정합니다. 이 시간 동안 AutoML 메커니즘이 모델을 훈련합니다. 우리가 설정하는 값이 높을수록 최상의 모델이 더 정확하게 결정됩니다:
모델 훈련 과정이 완료되면 모든 모델의 리더보드를 확인할 수 있습니다.** 이 목록에서 사용하고자 하는 적합한 훈련된 모델을 선택할 수 있습니다**:
모델을 구축하면 필요한 아티팩트를 다운로드할 수 있습니다. Download Gen Model 버튼을 사용하여 Java 애플리케이션에서 필요한 클래스를 포함하는 JAR 아카이브를 다운로드할 수 있습니다:
Download Model Deployment Package (MOJO) 버튼을 사용하여 모델 자체를 다운로드합니다:
## 5. Java 애플리케이션에서 모델 예측 사용하기
이제 Java 애플리케이션에서 우리의 모델을 사용해 보겠습니다.
5.1. h2o 아카이브 추가
h2o 콘솔에서 다운로드한 아카이브를 애플리케이션 프로젝트 내의 libs 폴더에 추가합니다. 이제 클래스 경로에 추가할 수 있습니다.
5.2. 종속성
모델 종속성을 추가합니다:
<dependency>
<groupId>ai.h2o</groupId>
<artifactId>h2o-genmodel</artifactId>
<version>1.0</version>
<scope>system</scope>
<systemPath>${project.basedir}/libs/h2o-genmodel.jar</systemPath>
</dependency>
모델 아카이브에 대한 경로를 지정합니다. groupId와 artifactId는 h2o에 사전 정의되어 있습니다.
5.3. 수동으로 구축한 모델로 예측하기
이제 Java 코드에서 모델을 사용하는 방법을 살펴봅시다:
public¨NBSP;class H2OModelLiveTest {
Logger logger = LoggerFactory.getLogger(H2OModelLiveTest.class);
@Test
public void givenH2OTrainedModel_whenPredictTheIrisByFeatures_thenExpectedFlowerShouldBeReturned() throws IOException, PredictException {
String mojoFilePath = "libs/mojo.zip";
MojoModel mojoModel = MojoModel.load(mojoFilePath);
EasyPredictModelWrapper model = new EasyPredictModelWrapper(mojoModel);
RowData row = new RowData();
row.put("sepal.length", 5.1);
row.put("sepal.width", 3.4);
row.put("petal.length", 4.6);
row.put("petal.width", 1.2);
MultinomialModelPrediction prediction = model.predictMultinomial(row);
Assertions.assertEquals("Versicolor", prediction.label);
logger.info("Class probabilities: ");
for (int i = 0; i < prediction.classProbabilities.length; i++) {
logger.info("Class " + i + ": " + prediction.classProbabilities[i]);
}
}
}
우리는 MOJO 아카이브에서 MojoModel을 생성하고 이를 EasyPredictModelWrapper 클래스로 감쌉니다. 다음으로 우리가 분류하고자 하는 꽃 기준으로 행을 준비합니다. 그런 다음 predictMultinomial() 메서드를 사용하여 예측을 수행합니다. 이 속성 세트는 Versicolor로 분류됩니다. 추가로 출력 매개변수를 모두 인쇄합니다.
출력은 우리의 분류가 확률 0.9597로 정확하다는 것을 보여줍니다. 이는 우리에게 충분히 좋은 결과입니다:
19:33:48.648 [main] INFO com.baeldung.h2o.H2OModelLiveTest - Class probabilities:
19:33:48.653 [main] INFO com.baeldung.h2o.H2OModelLiveTest - Class 0: 0.016846955011789237
19:33:48.653 [main] INFO com.baeldung.h2o.H2OModelLiveTest - Class 1: 0.9597659357519948
19:33:48.653 [main] INFO com.baeldung.h2o.H2OModelLiveTest - Class 2: 0.023387109236216036
5.4. AutoML 모델을 사용하여 예측하기
이제 AutoML h2o 함수에서 제안된 최상의 모델을 사용하여 예측을 실행해 보겠습니다:
@Test
public void givenH2OTrainedAutoMLModel_whenPredictTheIrisByFeatures_thenExpectedFlowerShouldBeReturned() throws IOException, PredictException {
String mojoFilePath = "libs/automl_model.zip";
MojoModel mojoModel = MojoModel.load(mojoFilePath);
EasyPredictModelWrapper model = new EasyPredictModelWrapper(mojoModel);
RowData row = new RowData();
row.put("sepal.length", 5.1);
row.put("sepal.width", 3.4);
row.put("petal.length", 4.6);
row.put("petal.width", 1.2);
MultinomialModelPrediction prediction = model.predictMultinomial(row);
Assertions.assertEquals("Versicolor", prediction.label);
logger.info("Class probabilities: ");
for (int i = 0; i < prediction.classProbabilities.length; i++) {
logger.info("Class " + i + ": " + prediction.classProbabilities[i]);
}
}
보시다시피, 이 모델도 같은 결과로 성공적으로 분류했지만, 이 경우 확률이 더 낮습니다:
20:28:06.440 [main] INFO com.baeldung.h2o.H2OModelLiveTest - Class probabilities:
20:28:06.443 [main] INFO com.baeldung.h2o.H2OModelLiveTest - Class 0: 0.08536296008169375
20:28:06.443 [main] INFO com.baeldung.h2o.H2OModelLiveTest - Class 1: 0.8451806663486182
20:28:06.443 [main] INFO com.baeldung.h2o.H2OModelLiveTest - Class 2: 0.06945637356968806
6. 결론
이 글에서는 h2o 플랫폼을 탐구했습니다. 이 도구를 사용하면 신경망을 훈련하고 Java 애플리케이션을 위한 아티팩트를 준비할 수 있습니다. 이는 Python에 대한 지식과 추가 라이브러리가 필요한 주류 ML 스택에 깊이 들어가기 원하지 않을 때 유용합니다.
코드는 항상 GitHub에 있습니다.