학생 팀이 교반기 문제를 받아 진동 센서 하나로 고장 전조를 잡는 모델을 만들고, 같은 채점 규칙으로 섀도 성적을 겨루는 과제 묶음입니다. 비전공 학생도 할 수 있는 기본 과제부터 코딩 에이전트를 쓰는 심화 과제까지, 평가 기준과 회사 데이터로 바꾸는 방법을 함께 안내합니다.
과제 구성#
| 단계 | 과제 | 결과물 | 쓰는 장 |
|---|---|---|---|
| 기본 1 | NASA IMS에서 문턱값 배수(k)를 1.5~10으로 바꿔 RMS 규칙과 BPFO 규칙의 선행시간 표를 만듭니다 | 표 하나와 세 줄 해석 | 2장 |
| 기본 2 | 한 페이지 오토인코더의 학습 구간(앞 20·40·60%)과 문턱값(95·99·99.9%)을 바꿔 첫 알람이 어떻게 바뀌는지 살펴봅니다 | 그래프 한 장 | 2장 |
| 응용 1 | 교반기 데이터의 원료 투입 충격 때문에 헛알람을 내는 모델을 찾아 수정합니다 | 고친 후보 한 개, 전후 헛알람 수 | 4·5장 |
| 응용 2 | Candidate 규약을 따르는 후보 하나를 직접 만들어 하네스에 넣고 16주를 실행합니다 |
candidate.py, 순위표 화면 |
5장 |
| 심화 | 코딩 에이전트에게 같은 문제를 맡기고, 에이전트가 낸 후보와 팀이 낸 후보를 같은 규칙으로 비교합니다 | 비교 표, 에이전트 메모에 대한 검토 | 5장 |
응용 2: 후보 하나 만들어 넣기#
후보는 두 함수의 규약만 지키면 됩니다. 5장의 코딩 에이전트도 같은 규약에 따라 후보를 작성합니다.
import numpy as np
from pdm_agent.models import Candidate, precursor_mask
class AgentCandidate(Candidate):
family = "agent"
label = "우리 팀 후보"
complexity = 8
def fit(self, train, failures):
ok = train[~precursor_mask(train, failures, days=7)] # 고장 전 7일을 뺀 정상 구간
self.mu, self.sd = ok["v1x"].mean(), ok["v1x"].std()
z = (ok["v1x"] - self.mu) / self.sd
self.thr = float(np.percentile(z, 99.5)) * 1.1 # 문턱값을 정상 점수로 정한다
return self
def score(self, df): # 1.0 이상이면 문턱값을 넘은 것
return ((df["v1x"] - self.mu) / self.sd).to_numpy() / self.thr
위 예시는 일부러 성능이 부족하도록 만들었습니다. 회전 1배 진동 하나만 보고 레시피를 고려하지 않습니다. 1주차로 학습해 2~16주를 채점하면 고장 6건은 모두 잡습니다. 하지만 레시피 C와 정비 뒤 기준 변화 때문에 헛알람이 17건 쌓여 비용이 810만원입니다(알람 피로로 무시된 알람 6번). 이 문제를 고치는 것이 과제입니다.
평가 기준#
| 항목 | 비중 | 무엇을 보나 |
|---|---|---|
| 섀도 성적 | 40% | 하네스의 비용(놓침·늦은 감지·헛알람)과 평균 선행시간. 같은 데이터, 같은 규칙으로 |
| 설명 | 25% | 무엇을 왜 봤는지 물리(BPFO, 회전 1배)와 데이터 그림으로 설명했나 |
| 정직함 | 20% | 학습에 쓴 구간과 채점 구간을 섞지 않았나, 지난 고장에 맞춘 조정을 밝혔나, 한계를 적었나 |
| 재현성 | 15% | 시드를 고정했나, 같은 명령으로 같은 숫자가 나오나 |
하지 말 것
- 시험 구간 데이터로 정규화기나 문턱값을 다시 맞추기(누수)
- 정답 파일
data/sim/truth.json(전조 시작 시각)을 모델에 쓰기 — 해설용입니다 - F1 같은 점수 하나만 보고 고르기(1장의 "늘 알람" F1 0.698)
회사 데이터로 바꿔 끼우기#
- 회사에서 받을 자료는 다음과 같습니다: 진동 원파형(또는 스냅숏), 표본화 주파수, 회전수·레시피 기록, 정비 기록(고장 시각·종류·작업), 베어링 형번(볼 수·지름).
pdm_agent/features.py의FS·N과bpfo()치수를 회사 설비에 맞춥니다.- 원파형을
snapshot_features(x, rpm)로 특징 표로 변환하고, 한 주씩week-NN.parquet와week-NN-maintenance.json으로 저장합니다(4장의 형식). Run(path, inbox=<회사 데이터 폴더>)로 하네스를 실행합니다. 첫 주는 학습 없는 규칙이 챔피언이고, 정비 기록이 쌓이는 대로 후보들이 섀도에서 겨룹니다.- 비용(
evaluate.py의COST_*)은 회사와 함께 정합니다. 고장 한 번으로 폐기하는 배치의 비용과 수리비, 점검 출동 한 번의 비용을 기준으로 삼습니다.
확인 문제#
- 학생 팀의 후보가 백테스트에서 챔피언보다 훨씬 좋았는데 섀도에서는 같았습니다. 보고서에 무엇을 써야 하나요?
정답
섀도 결과를 결론으로 쓰고, 백테스트가 더 좋았던 까닭(지난 고장을 보고 지표나 문턱값을 고르지 않았는지)을 밝힙니다. 그리고 섀도 구간에 고장이 몇 건이었는지, 더 오래 돌리면 차이가 날 수 있는지 한계를 적습니다.
- 회사가 "고장 기록은 없고 센서 데이터만 1년치 있다"고 하면 이 하네스는 무엇을 할 수 있고 무엇을 못 하나요?
정답
학습 없는 규칙을 챔피언으로 두고, 정상만 배우는 후보와 제로샷을 섀도 모드로 실행해 헛알람 수를 비교할 수 있습니다. 드리프트(레시피·정비 뒤 변화)도 감지합니다. 다만 고장 기록이 없으므로 승격 규칙 2(비교 구간에 고장 1건 이상)를 충족하지 못해 승격은 할 수 없습니다. 고장 패턴 검색과 지도학습 후보도 만들 수 없습니다. 그래서 정비 기록을 남기는 일부터 함께 시작해야 합니다.