설비 예지보전 PBL 튜토리얼
4부 과제6

PBL 과제와 평가

학생 팀이 교반기 문제를 받아 진동 센서 하나로 고장 전조를 잡는 모델을 만들고, 같은 채점 규칙으로 섀도 성적을 겨루는 과제 묶음입니다. 비전공 학생도 할 수 있는 기본 과제부터 코딩 에이전트를 쓰는 심화 과제까지, 평가 기준과 회사 데이터로 바꾸는 방법을 함께 안내합니다.

과제 구성#

단계 과제 결과물 쓰는 장
기본 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)

회사 데이터로 바꿔 끼우기#

  1. 회사에서 받을 자료는 다음과 같습니다: 진동 원파형(또는 스냅숏), 표본화 주파수, 회전수·레시피 기록, 정비 기록(고장 시각·종류·작업), 베어링 형번(볼 수·지름).
  2. pdm_agent/features.py의 FS·N과 bpfo() 치수를 회사 설비에 맞춥니다.
  3. 원파형을 snapshot_features(x, rpm)로 특징 표로 변환하고, 한 주씩 week-NN.parquet와 week-NN-maintenance.json으로 저장합니다(4장의 형식).
  4. Run(path, inbox=<회사 데이터 폴더>)로 하네스를 실행합니다. 첫 주는 학습 없는 규칙이 챔피언이고, 정비 기록이 쌓이는 대로 후보들이 섀도에서 겨룹니다.
  5. 비용(evaluate.py의 COST_*)은 회사와 함께 정합니다. 고장 한 번으로 폐기하는 배치의 비용과 수리비, 점검 출동 한 번의 비용을 기준으로 삼습니다.

확인 문제#

  1. 학생 팀의 후보가 백테스트에서 챔피언보다 훨씬 좋았는데 섀도에서는 같았습니다. 보고서에 무엇을 써야 하나요?
정답

섀도 결과를 결론으로 쓰고, 백테스트가 더 좋았던 까닭(지난 고장을 보고 지표나 문턱값을 고르지 않았는지)을 밝힙니다. 그리고 섀도 구간에 고장이 몇 건이었는지, 더 오래 돌리면 차이가 날 수 있는지 한계를 적습니다.

  1. 회사가 "고장 기록은 없고 센서 데이터만 1년치 있다"고 하면 이 하네스는 무엇을 할 수 있고 무엇을 못 하나요?
정답

학습 없는 규칙을 챔피언으로 두고, 정상만 배우는 후보와 제로샷을 섀도 모드로 실행해 헛알람 수를 비교할 수 있습니다. 드리프트(레시피·정비 뒤 변화)도 감지합니다. 다만 고장 기록이 없으므로 승격 규칙 2(비교 구간에 고장 1건 이상)를 충족하지 못해 승격은 할 수 없습니다. 고장 패턴 검색과 지도학습 후보도 만들 수 없습니다. 그래서 정비 기록을 남기는 일부터 함께 시작해야 합니다.

© uEngine Solutions · 문의하기 · 이 교재의 그림과 수치는 2026년 11월 9일 공개 데이터(NASA IMS·SKAB·CWRU)와 합성 데이터로 실제 실행해 얻었습니다. 교반기 M-201 은 가상 설비이고 비용은 가정입니다.