캐글·NASA·SKAB·CWRU에서 예지보전 데이터와 기존 모델을 찾아 직접 실행해 보고, SKAB 순위표의 점수를 같은 규약으로 다시 계산합니다. 진동 채널만 쓰면 무엇을 잃는지도 확인합니다.
무엇을 · 왜#
| 이 장에서 하는 일 | 왜 |
|---|---|
| 공개 데이터 여섯 가지를 비교하고 셋을 고릅니다 | 회사 데이터가 오기 전에 실제 고장 데이터로 개념을 익히기 위해 |
| 모델을 일곱 갈래로 정리합니다 | 5장의 후보를 고르기 위해 규칙부터 에이전트까지 각 방식의 쓰임새 파악 |
| SKAB 순위표를 같은 규약으로 재현합니다 | 남이 낸 점수를 믿기 전에 같은 조건에서 다시 내 보는 습관 |
데이터 여섯 가지#
| 데이터 | 무엇 | 센서·라벨 | 이 교재에서 |
|---|---|---|---|
| NASA IMS 베어링 | 축 하나에 베어링 4개, 고장까지 시험 3회. 2차 시험은 10분마다 1초(20 kHz) 스냅숏 984개 | 가속도계. 라벨은 "끝에 베어링 1 외륜 손상"뿐 | 2장, 3장 |
| SKAB | 펌프가 도는 물 순환 시험대, 실험 34개(밸브 조작·회전자 불균형 등) | 가속도 RMS 2·전류·압력·온도·유량 등 8개, 점마다 이상 라벨 | 이 장 |
| CWRU 베어링 | 정상·내륜·볼·외륜 결함, 부하 0~3 hp | 구동단 가속도, 결함 종류가 곧 라벨 | 3장 |
| NASA C-MAPSS | 터보팬 엔진 시뮬레이션, 센서 21개 | 남은 수명(RUL) | 다변량이라 이번에는 쓰지 않음 |
| 캐글 pump_sensor_data | 실제 급수 펌프 1대, 약 5개월, 1분 간격 | 센서 52개(뜻이 일부만 밝혀짐), 고장 7번 | 다변량·센서 뜻 불명으로 미룸 |
| MIMII | 펌프·팬·밸브·슬라이드 레일 소리 | 마이크 8채널 | 소리 기반 과제로 확장할 때 |
CWRU 정상 파일은 48 kHz
CWRU의 결함 파일(12 kHz 구동단)과 달리 정상 파일(97~100번)은 48 kHz로 녹음되어 있습니다. 12 kHz로 읽으면 주파수가 4배 어긋납니다. 3장의 스크립트는 정상 파일을 4:1로 줄여 맞춥니다.
모델 일곱 갈래#
| 방식 | 대표 | 학습에 필요한 것 | 무엇이 이상인지 말하나 |
|---|---|---|---|
| 물리 공식·알람 구간 | ISO 10816 진동 등급, 베어링 결함 주파수(BPFO) | 없음 | 예 — 공식이 곧 고장 모드 |
| 통계 기준 | z 점수, 관리도(EWMA·CUSUM) | 정상 데이터 | 어느 지표인지까지 |
| 정상만 배우는 ML | 오토인코더, Isolation Forest | 정상 데이터 | 아니오 |
| 제로샷 파운데이션 모델 | Amazon Chronos-2, Chronos-Bolt | 없음(임계값만) | 아니오 |
| 임베딩 + 벡터 검색 | Chronos-2 임베딩, 손으로 만든 스펙트럼 벡터 | 라벨 몇 건 | "예전 어떤 고장과 닮음" |
| 지도학습 AutoML | FLAML, AutoGluon | 라벨 여러 건 | 예 |
| 에이전트형 ML | AIDE, 코딩 에이전트(Claude Code·OpenCode·OpenHands) | 데이터가 오는 대로 | 코드로 설명 |
따라 하기: SKAB 순위표 재현#
- SKAB를 받습니다(GPL-3.0, 데이터 4.3 MB).
- 순위표의 규약을 확인합니다. 저장소의
notebooks/와core/에 나온 규약은 다음과 같습니다. 이상이 있는 34개 파일마다 앞 400점으로 그 파일의 모델을 학습하고 나머지 23,801점을 채점합니다. 각 점의 예측과 정답을 비교한 뒤 모든 파일의 결과를 합쳐 F1·FAR(헛알람 비율)·MAR(놓침 비율)을 계산합니다. - 세 모델을 같은 규약으로 실행합니다. Isolation Forest(오염 0.0005, 3점 이동 중앙값), Vanilla AE(5-4-2-4-5, 문턱값 = 학습 오차 99% × 5/2), Conv-AE(60점 창, 문턱값 = 99.9% × 4/3).
- 결과를 순위표와 비교합니다.
- 진동 채널(
Accelerometer1RMS,Accelerometer2RMS)만 남기고 다시 실행합니다. Conv-AE의 점수는 0.783 → 0.430으로 떨어집니다. 실험 종류별로 보면 밸브 실험은 0.753 → 0.148, 0.767 → 0.000으로 떨어져 거의 잡지 못합니다. 회전자 불균형은 0.884 → 0.924로 오히려 오릅니다.
```bash
git clone --depth 1 https://github.com/waico/SKAB.git data/raw/skab/repo
```
```bash
.venv/bin/python textbook/03_skab_benchmark.py # 약 2분, CPU
```

| 모델(센서 8개) | 우리 F1 / FAR% / MAR% | 순위표 |
|---|---|---|
| Isolation Forest | 0.287 / 2.56 / 82.89 | 0.29 / 2.56 / 82.89 |
| Vanilla AE | 0.380 / 2.11 / 76.12 | 0.39 / 2.59 / 75.15 |
| Conv-AE | 0.783 / 13.64 / 28.11 | 0.78 / 13.55 / 28.02 |
| 늘 알람(기준) | 0.698 / 100 / 0 | — |
점수 하나로 고르지 마세요
시험 데이터의 54%가 이상이라 늘 알람만 울려도 F1이 0.698입니다. Isolation Forest는 시드(0~4)에 따라 F1이 0.181~0.287로 달라집니다. 순위표의 숫자는 규약·시드·데이터 구성과 함께 읽어야 합니다.
재현에서 맞추지 못한 것
원본은 Keras(TF 2.16)이고 재현은 torch입니다. 난수 흐름, 보폭 2의 "same" 패딩(Keras는 왼쪽 2·오른쪽 3), BatchNorm 이동 분산의 계산 방식은 맞추지 못했습니다. 그래도 F1은 소수 둘째 자리까지 같습니다.
확인 문제#
- SKAB에서 "늘 알람" 모델의 F1이 0.698이나 나오는 이유는 무엇인가요?
정답
시험 데이터의 54%가 이상으로 표시되어 있으므로, 모든 점을 이상이라고 하면 재현율이 1 이고 정밀도가 0.54쯤 되기 때문입니다. 그래서 FAR(헛알람 비율)과 MAR(놓침 비율)을 함께 봐야 합니다.
- 진동 채널만 쓰는 것이 맞는 설비 고장과 맞지 않는 고장을 하나씩 들어 보세요.
정답
적합한 예는 회전자 불균형이나 베어링 손상처럼 회전체에서 생기는 고장입니다(불균형은 진동만 써도 F1이 오릅니다). 적합하지 않은 예는 밸브 조작처럼 유량·압력에서 먼저 드러나는 이상입니다(진동만 쓰면 F1 0.15·0.00).