Getting started with forecasting
출처: 문서
본문
예측 시작하기
탐색 패널에서 Forecasting을 선택하면 OpenSearch Dashboards에서 forecaster를 정의하고 구성할 수 있어요.
1단계: forecaster 정의하기
forecaster는 하나의 예측 작업을 나타내요. 여러 개의 forecaster를 만들어 병렬로 실행할 수 있고, 각 forecaster는 서로 다른 데이터 소스를 분석해요. 새 forecaster를 정의하려면 다음 단계를 따라 해 보세요:
-
Forecaster list 화면에서 Create forecaster를 선택하세요.
-
다음 정보를 입력해 데이터 소스를 정의하세요:
- Name –
requests-10min처럼 고유하면서도 설명이 잘 담긴 이름을 입력하세요. - Description – forecaster의 목적을 요약해서 적어 주세요. 예를 들면
Forecast total request count every 10 minutes같은 식이에요. - Indexes – 인덱스, 인덱스 패턴, 별칭 중 하나 이상을 선택하세요. 원격 인덱스는 크로스 클러스터 검색(
cluster-name:index-pattern)을 통해 지원돼요. 자세한 내용은 크로스 클러스터 검색을 참조하세요. Security 플러그인이 활성화되어 있다면 세분화된 접근 제어로 원격 인덱스 선택하기를 참조하세요.
- Name –
-
(선택 사항) Field, Operator, Value를 설정하려면 Add data filter를 선택하고, 불리언 쿼리를 정의하려면 Use query DSL을 선택하세요. 다음 예시는 쿼리 도메인 특화 언어(DSL) 필터를 사용해 세 개의 URL 경로를 매칭해요:
{ "bool": { "should": [ { "term": { "urlPath.keyword": "/domain/{id}/short" } }, { "term": { "urlPath.keyword": "/sub_dir/{id}/short" } }, { "term": { "urlPath.keyword": "/abcd/123/{id}/xyz" } } ] } } -
Timestamp field 아래에서 타임스탬프를 저장하는 필드를 선택하세요.
-
Indicator (metric) 섹션에서 forecaster에 사용할 메트릭을 추가하세요. 최적의 정확도를 위해 각 forecaster는 하나의 메트릭만 지원해요. 다음 옵션 중 하나를 선택하세요:
- 미리 정의된 집계 중 하나를 선택하세요:
average(),count(),sum(),min(),max(). - 커스텀 집계를 사용하려면 Forecast based on 아래에서 Custom expression을 선택하고 직접 query DSL 표현식을 정의하세요. 예를 들어 다음 쿼리는 특정 계정 유형을 가진 고유 계정 수를 예측해요:
{ "bbb_unique_accounts": { "filter": { "bool": { "must": [ { "wildcard": { "accountType": { "wildcard": "*blah*", "boost": 1 } } } ], "adjust_pure_negative": true, "boost": 1 } }, "aggregations": { "uniqueAccounts": { "cardinality": { "field": "account" } } } } } - 미리 정의된 집계 중 하나를 선택하세요:
-
(선택 사항) Categorical fields 섹션에서 Split time series using categorical fields를 활성화하면 엔티티 수준(예: IP 주소, 제품 ID, 국가 코드)별로 예측을 생성할 수 있어요.
메모리에 캐시할 수 있는 고유 엔티티 수에는 제한이 있어요. 용량을 추정하려면 다음 공식을 사용하세요:
(data nodes × heap size × plugins.forecast.model_max_size_percent) ────────────────────────────────────────────────────────────────── entity-model size (MB)예를 들어 데이터 노드 3개로 구성된 클러스터에서 각 노드가 8 GB JVM 힙과 기본값인 10% 모델 메모리를 사용한다면, 다음과 같은 수의 엔티티를 포함할 수 있어요:
(8096 MB × 0.10 ÷ 1 MB) × 3 nodes ≈ 2429 entities엔티티 모델 크기를 확인하려면 Profile Forecaster API를 사용하세요.
plugins.forecast.model_max_size_percent설정으로 메모리 상한을 높이거나 낮출 수 있어요.
Forecaster는 사용 가능한 메모리 범위 내에서 가장 자주, 최근에 관측된 엔티티의 모델을 캐시해요. 덜 흔한 엔티티의 모델은 각 인터벌 동안 best-effort 방식으로 인덱스에서 로드되며, 서비스 수준 계약(SLA)은 보장되지 않아요. 항상 대표적인 워크로드를 기준으로 메모리 사용량을 검증하세요.
자세한 내용은 블로그 포스트 Improving Anomaly Detection: One Million Entities in One Minute를 참조하세요. 이 글은 이상 탐지에 초점을 두고 있지만, 두 기능이 동일한 Random Cut Forest(RCF) 모델을 기반으로 하기 때문에 그 권장 사항은 예측에도 그대로 적용돼요.
2단계: 모델 파라미터 추가하기
OpenSearch Dashboards의 Suggest parameters 버튼을 누르면 최근 이력을 검토해서 합리적인 기본값을 추천받을 수 있어요. 다음 파라미터를 조정하면 이 기본값을 재정의할 수 있어요:
- Forecasting interval – 집계 버킷(예: 10분)을 지정해요. 인터벌이 길면 노이즈가 줄고 컴퓨팅 비용도 낮아지지만, 탐지는 늦어져요. 인터벌이 짧으면 변화를 더 빨리 감지할 수 있지만 리소스 사용량이 늘고 노이즈가 생길 수 있어요. 안정적인 신호가 나오는 선에서 가장 짧은 인터벌을 선택하세요.
- Window delay – 이벤트 발생부터 데이터 수집(ingestion)까지 예상되는 지연 시간을 forecaster에 알려 줘요. 이 지연 값만큼 예측 인터벌을 뒤로 조정해서 데이터가 빠짐없이 커버되도록 해요. 예를 들어 예측 인터벌이 10분이고 수집이 1분 지연된다면, window delay를 1분으로 설정했을 때 forecaster가 1:50
2:00가 아니라 1:491:59 데이터를 평가하도록 보장할 수 있어요.- 데이터 누락을 피하려면 window delay를 예상 수집 지연의 상한값으로 설정하세요. 다만 지연이 길어질수록 예측의 실시간 반응성은 떨어져요.
- Horizon – 앞으로 몇 개의 버킷을 예측할지 지정해요. 예측 정확도는 시점이 멀어질수록 떨어지므로, 운영상 의미가 있는 예측 구간만 선택하세요.
- History – 초기(콜드 스타트) 모델을 학습시키는 데 사용할 과거 데이터 포인트 수를 설정해요. 최댓값은 10,000이에요. 이 한도까지는 과거 데이터가 많을수록 초기 모델 정확도가 향상돼요.
Advanced 패널은 기본적으로 접혀 있어서 대부분의 사용자는 제안된 파라미터를 그대로 사용해 진행할 수 있어요. 패널을 펼치면 shingle size, suggested seasonality, recency emphasis 세 가지 파라미터를 더 세밀하게 조정할 수 있어요. 이 파라미터들은 forecaster가 최근 변동과 장기 패턴 사이의 균형을 어떻게 잡을지 제어해요.
데이터나 사용 사례에 특별한 요구가 없다면, 기본값인 shingle size 8, 명시적인 seasonality 없음, recency emphasis 2560이 신뢰할 수 있는 출발점이에요.
shingle size 선택하기
자동 휴리스틱을 사용하려면 Shingle size 필드를 비워 두세요:
- 기본값인 8에서 시작해요.
- Suggested seasonality가 정의되어 있고 16보다 크면, 그 값을 시즌 길이의 절반으로 바꿔요.
- Horizon이 정의되어 있고 그 값의 1/3이 현재 후보값보다 크면, 그에 맞게 값을 갱신해요.
최종값은 이 세 값 중 최댓값이에요:
max(8, seasonality ÷ 2, horizon ÷ 3)
커스텀 값을 직접 지정하면 이 계산을 재정의해요.
저장 용량 결정하기
기본적으로 예측 결과는 opensearch-forecast-results 인덱스 별칭에 저장돼요. 이 결과로 다음 작업을 할 수 있어요:
- 대시보드와 시각화를 만들어요.
- 결과를 Alerting 플러그인에 연결해요.
- 다른 OpenSearch 인덱스와 똑같이 결과를 쿼리해요.
스토리지를 관리하기 위해 플러그인은 rollover 정책을 적용해요:
- Rollover trigger – 프라이머리 샤드가 약 65 GB에 도달하면 새로운 backing 인덱스가 생성되고 별칭이 업데이트돼요.
- Retention – rollover된 인덱스는 삭제되기 전까지 최소 30일 동안 보관돼요.
다음 설정으로 이 동작을 커스터마이즈할 수 있어요.
| 설정 | 설명 | 기본값 |
|---|---|---|
plugins.forecast.forecast_result_history_max_docs_per_shard |
rollover를 트리거하기 전까지 샤드별로 허용되는 최대 Lucene 문서 수예요. 결과 하나는 약 47바이트짜리 문서 4개에 해당하며, 합계 약 65 GB예요. | 1_350_000_000 |
plugins.forecast.forecast_result_history_retention_period |
예측 결과를 보관하는 기간이에요. 7d, 90d 같은 기간 형식을 지원해요. |
30d |
커스텀 결과 인덱스 지정하기
Custom index를 선택하고 abc 같은 별칭 이름을 입력하면 예측 결과를 커스텀 인덱스에 저장할 수 있어요. 플러그인은 backing 인덱스(예: opensearch-forecast-result-abc-history-2024.06.12-000002)를 가리키는 opensearch-forecast-result-abc 같은 별칭을 만들어요.
권한을 관리하려면 하이픈으로 구분된 네임스페이스를 사용하세요. 예를 들어 financial 부서의 us 그룹용 역할에 opensearch-forecast-result-financial-us-*를 할당할 수 있어요.
{: .note } Security 플러그인이 활성화되어 있다면 적절한 권한이 구성되어 있는지 확인하세요.
중첩 필드 평탄화하기
커스텀 결과 인덱스의 문서에 중첩 필드가 들어 있다면, 집계와 시각화를 단순화할 수 있도록 Flattened custom result index를 활성화하세요.
그러면 커스텀 인덱스와 forecaster 이름이 접두사로 붙은 별도의 인덱스(예: opensearch-forecast-result-abc-flattened-test)가 만들어지고, 중첩된 데이터를 평탄화하기 위해 Painless script를 사용하는 ingest 파이프라인이 연결돼요. 자세한 내용은 Painless 스크립팅 언어를 참조하세요.
나중에 이 옵션을 비활성화하면 연결된 ingest 파이프라인이 제거돼요.
평탄화된 결과 인덱스의 rollover와 삭제를 관리하려면 Index State Management를 사용하세요.
커스텀 결과 인덱스 수명 주기 관리
다음 조건 중 하나라도 충족되면 플러그인이 커스텀 결과 인덱스에 대해 rollover를 트리거해요.
| 파라미터 | 설명 | 타입 | 단위 | 기본값 | 필수 여부 |
|---|---|---|---|---|---|
result_index_min_size |
rollover를 트리거하는 데 필요한 최소 프라이머리 샤드 총 크기예요. | Integer | MB | 51200 (50 GB) |
No |
result_index_min_age |
rollover를 트리거하는 데 필요한 최소 인덱스 경과 기간이에요. | Integer | Days | 7 |
No |
result_index_ttl |
rollover된 인덱스가 삭제되기까지의 최소 시간이에요 | Integer | Days | 60 |
No |
3단계: forecaster 테스트하기
백테스팅(backtesting)은 Interval, Horizon 같은 핵심 예측 설정을 평가하고 다듬는 가장 빠른 방법이에요. 백테스팅 중에는 모델이 과거 데이터로 학습하고, 예측을 생성한 뒤, 실제 값과 나란히 그래프로 그려서 예측 정확도를 한눈에 파악할 수 있게 해줘요. 결과가 기대에 못 미치면 설정을 조정하고 테스트를 다시 실행하면 돼요.
백테스팅은 다음 방법을 사용해요:
-
Training window: History 설정으로 정의된 과거 데이터를 대상으로 모델이 학습해요.
-
Rolling forecast: 모델이 시계열을 따라 진행하면서 다음 작업을 반복해요:
- 다음 실제 데이터 포인트를 가져오기
- 각 단계에서 예측값을 내보내기
이건 소급적으로 수행하는 시뮬레이션이기 때문에, 예측값이 원래 타임스탬프 위치에 그려져서 모델이 실시간으로 동작했을 때 어땠을지 확인할 수 있어요.
백테스트 시작하기
테스트를 시작하려면:
- Add model parameters 페이지 맨 아래로 스크롤해요.
- Create and test를 선택해요.
테스트를 건너뛰고 바로 forecaster를 만들고 싶다면 Create를 선택해요.
백테스트는 보통 1~2분 정도 걸리지만, 실행 시간은 다음 요인에 따라 달라져요.
| 요인 | 중요한 이유 |
|---|---|
| History length | 과거 데이터가 많을수록 학습 시간이 길어져요. |
| Data density | 데이터가 촘촘할수록 집계가 느려져요. |
| Categorical field | 모델이 엔티티별로 따로 학습해요. |
| Horizon | 예측 구간이 길어질수록 생성되는 예측 개수가 늘어나요. |
다음 이미지처럼 차트가 비어 있다면, 선택한 interval에서 40개가 넘는 데이터 포인트를 가진 시계열이 인덱스에 최소 하나는 있는지 확인해 보세요.
{: width="800" height="800" }
차트 읽는 방법
테스트가 성공하면 차트의 아무 지점에나 마우스를 올려서 정확한 값과 신뢰 경계를 확인할 수 있어요:
- Actual data – 실선
- Median prediction (P50) – 점선
- Confidence interval – P10과 P90 사이의 음영 밴드
다음 이미지는 차트 화면이에요.
{: width="800" height="800" }
특정 날짜부터의 예측 보기
예측 차트는 마지막 실제 데이터 포인트부터 설정된 horizon이 끝나는 시점까지의 예측을 표시해요.
예를 들어 Forecast from 필드에 다음 설정을 지정했다고 가정해 볼게요:
- Last actual timestamp: Mar 5, 2025, 19:23
- Interval: 1 minute
- Horizon: 24
이 설정이라면 예측 범위는 다음 이미지처럼 Mar 5, 2025, 19:23 – 19:47에 걸쳐 나타나요.
{: width="800" height="800" }
Forecast from 드롭다운 목록을 사용하면 이전 테스트 실행의 예측도 볼 수 있어요. 다음 이미지를 참고하세요.
{: width="800" height="800" }
이전 Forecast from 시각을 선택하면 예측 선이 그 시점에 존재하던 과거 데이터 바로 위에 그려져요. 그 결과 다음 이미지처럼 두 시계열이 겹쳐 보여요.
{: width="800" height="800" }
가장 최근 예측 구간으로 돌아가려면 Show latest를 선택해요.
Overlay 모드: 나란히 놓고 정확도 확인하기
기본적으로 차트는 하나의 시작 지점에서 출발한 예측을 보여줘요. Overlay 모드를 토글하면 예측 곡선을 실제 시계열 위에 직접 얹어서 전체 타임라인에 걸친 정확도를 살펴볼 수 있어요.
모델은 horizon 단계마다 예측을 하나씩 생성하기 때문에, 예를 들어 horizon이 24라면 예측 24개가 만들어져요. 그래서 하나의 타임스탬프에 서로 다른 시작 지점에서 생성된 여러 예측이 존재할 수 있어요. Overlay 모드에서는 어떤 리드 타임(k)을 그릴지 직접 정할 수 있어요:
- Horizon index 0 = 바로 다음 단계
- Horizon index 1 = 1단계 앞
- Horizon index 23 = 23단계 앞
horizon 컨트롤의 기본값은 index 3이지만, 다른 리드 타임에 집중하고 싶다면 어떤 값이든 고를 수 있어요.
다음 이미지는 horizon index를 3으로 하고 Overlay 모드를 켠 모습이에요. 시각화는 예측 곡선(보라색)을 실제 데이터 포인트(흰색으로 채운 마커로 표시) 바로 위에 그려요. 이 덕분에 전체 타임라인에 걸쳐 모델의 3단계 앞 예측이 얼마나 정확한지 평가할 수 있어요. 예측 범위는 예측값 주변에 음영 밴드로 표시되어 불확실성을 잘 드러내 줘요.
{: width="800" height="800" }
여러 예측 시계열 보기
카디널리티가 높은 forecaster는 여러 시계열을 한꺼번에 표시할 수 있어요. 결과 패널의 Time series per page 드롭다운 메뉴를 사용해서 다음 뷰를 전환할 수 있어요:
- Single-series view(기본값): 페이지당 엔티티 하나를 렌더링해서 가독성을 극대화해요.
- Multi-series view: 최대 다섯 개 엔티티를 나란히 그려요. 신뢰 밴드는 기본적으로 반투명한데, 선에 마우스를 올리면 해당 밴드가 강조돼요.
실제 선과 예측 선이 겹쳐져 있어서 지점마다 정확도를 가늠할 수 있어요. 하지만 Multi-series view에서는 선이 겹치면서 차트 해석이 어려워질 수 있어요. 시각적인 복잡함을 줄이려면 Visualization options로 가서 Show actual data at forecast를 꺼 주세요.
다음 이미지는 실제 선과 예측 선이 겹쳐진 차트예요.
{: width="800" height="800" }
다음 이미지는 화면을 단순하게 만들기 위해 예측 시점에서 실제 선을 숨긴, 같은 차트예요.
{: width="800" height="800" }
타임라인 탐색하기
다음 타임라인 컨트롤을 사용하면 예측 기록의 원하는 구간을 탐색하고, 확대하고, 필터링할 수 있어요:
- Zoom – **+ / –**를 선택해서 예측을 확대하거나 주변 맥락을 넓혀 보세요.
- Pan – 화살표 버튼을 사용해서 이전 또는 이후 데이터 포인트가 있을 때 그쪽으로 이동할 수 있어요.
- Quick Select – "Last 24 hours" 같은 자주 쓰는 범위를 고르거나, 결과 범위에 원하는 날짜를 직접 입력할 수 있어요.
Multi-series view의 정렬 옵션
forecaster가 다섯 개가 넘는 엔티티를 추적하면 차트가 모든 선을 한 번에 보여줄 수 없어요.
그래서 Multi-series view에서는 가장 유용한 다섯 개 시계열을 고르게 되고, 정렬 방식을 선택해서 무엇이 "유용함"인지 정의하게 돼요. 다음 표에서 사용할 수 있는 정렬 방식을 확인할 수 있어요.
| 정렬 방식 | 보여주는 내용 | 언제 사용하면 좋을까요 |
|---|---|---|
| Minimum confidence-interval width (기본값) | 예측 밴드가 가장 좁은 다섯 개 시계열이에요. 밴드가 좁다는 건 모델이 그 예측을 매우 확신한다는 뜻이에요. | 가장 "신뢰할 만한" 예측을 먼저 보여줄 때. |
| Maximum confidence-interval width | 밴드가 가장 넓은 다섯 개 시계열, 즉 모델이 가장 확신하지 못하는 예측이에요. | 검토나 추가 학습 데이터가 필요할 수 있는, 위험하거나 노이즈가 심한 시계열을 발견할 때. |
| Minimum value within the horizon | 각 엔티티의 예측 구간 전체에서 가장 낮은 예측 지점을 오름차순으로 정렬해요. | 가장 크게 떨어질 것으로 예상되는 엔티티를 파악할 때. 용량 계획이나 잠재적 하락에 대한 알림 설정에 유용해요. |
| Maximum value within the horizon | 각 엔티티의 horizon 전체에서 가장 높은 예측 지점을 내림차순으로 정렬해요. | 트래픽 급증이나 매출 급등처럼 가장 큰 피크가 예상되는 시계열을 부각할 때. |
| Distance to threshold value | 숫자 임계값(>, <, ≥, ≤)으로 예측을 필터링한 다음, 남은 항목을 임계값으로부터의 거리 순으로 정렬해요. | SLA나 비즈니스 KPI를 위반하거나 위반 직전인 엔티티를 조사할 때. 예: "10,000 requests를 초과할 것으로 예측되는 항목 모두 보기". |
forecaster가 다섯 개 이하의 엔티티를 모니터링한다면 Multi-series view가 엔티티를 모두 보여줘요. 다섯 개를 넘으면 정렬 방식을 바꾸거나 임계값을 조정할 때마다 뷰가 동적으로 다시 순위를 매겨서, 가장 관련성 높은 시계열이 계속 화면에 잡혀 있도록 해줘요.
특정 엔티티 집합에만 집중하고 싶다면 Filter by를 Custom query로 바꾸고 query DSL 쿼리를 입력해요. 다음 예시는 host가 server_1과 같은 엔티티를 보여줘요:
{
"nested": {
"path": "entity",
"query": {
"bool": {
"must": [
{ "term": { "entity.name": "host" } },
{ "wildcard": { "entity.value": "server_1" } }
]
}
}
}
}
그다음 Maximum value within the horizon 같은 정렬 방식을 고르고 Update visualization을 선택해요. 그러면 차트가 업데이트되어 host:server_1의 예측 시계열만 선택한 기준에 따라 정렬된 순서로 보여줘요.
forecaster 편집하기
초기 백테스트 결과가 아쉽다면 forecaster 설정을 조정한 뒤 테스트를 다시 실행할 수 있어요.
forecaster를 편집하려면:
-
forecaster의 Details 페이지를 열고 Edit를 선택해서 편집 모드로 들어가요.
-
필요에 맞게 설정을 바꿔요. 예를 들어 Category field를 추가하거나, Interval을 변경하거나, History 구간을 늘릴 수 있어요.
-
Update를 선택해요. 검증 패널이 새 설정을 자동으로 평가하고 문제가 있으면 표시해 줘요.
다음 이미지는 검증이 진행되는 모습이에요.
{: width="800" height="800" } -
검증 오류가 있다면 모두 해결해요. 패널이 초록색으로 바뀌면 오른쪽 위의 Start test를 선택해서 업데이트된 파라미터로 백테스트를 다시 실행해요.
실시간 예측
예측 설정에 자신이 생겼다면 Details 페이지로 가서 Start forecasting을 클릭해 실시간 예측을 시작해요. forecaster는 앞으로 매 interval마다 새로운 예측을 생성해요.
차트가 최신 데이터와 동기화되면 Live 배지가 표시돼요.
백테스팅과 달리, 실시간 예측은 과거 데이터가 부족하면 라이브 데이터로 초기화를 계속 시도해요. 이 초기화 기간 동안 forecaster는 예측을 내놓을 만큼 데이터가 모일 때까지 초기화 상태를 표시해요.
다음 단계
forecaster를 테스트하고 다듬었다면, 이제 이를 사용해서 라이브 예측을 생성하거나 시간이 지나면서 관리할 수 있어요. 기존 forecaster를 시작, 중지, 삭제, 업데이트하는 방법은 forecaster 관리하기를 참고하세요.