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입니다. 상단 메뉴에서 모델 옵션 아래의 Run AutoML을 선택합니다. 어떤 정확한 알고리즘을 사용할지 모르는 경우 이 기능을 선택할 수 있습니다. 여기서는 일반 구축 과정 동안 지정한 것과 같은 매개변수를 지정해야 합니다. 추가로, 플랫폼이 모든 모델을 훈련할 수 있는 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]);
}
}
}
MojoModel을 MOJO 아카이브에서 생성하고 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 애플리케이션을 위한 아티팩트를 준비할 수 있습니다. 이는 파이썬 지식과 추가 라이브러리가 필요한 주류 기계 학습 스택에 깊이 파고들기를 피하고자 할 때 유용합니다.
항상 그렇듯이 코드는 GitHub에서 확인할 수 있습니다.