<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>CNN | Sieun Kim Portfolio</title><link>https://siuunni.github.io/tags/cnn/</link><atom:link href="https://siuunni.github.io/tags/cnn/index.xml" rel="self" type="application/rss+xml"/><description>CNN</description><generator>HugoBlox Kit (https://hugoblox.com)</generator><language>ko-kr</language><lastBuildDate>Tue, 09 Dec 2025 00:00:00 +0000</lastBuildDate><image><url>https://siuunni.github.io/media/icon_hu_1c0e9cb08cfb822a.png</url><title>CNN</title><link>https://siuunni.github.io/tags/cnn/</link></image><item><title>시계열 센서 데이터 기반 자동차 엔진 이상 탐지</title><link>https://siuunni.github.io/projects/ford-engine-anomaly/</link><pubDate>Tue, 09 Dec 2025 00:00:00 +0000</pubDate><guid>https://siuunni.github.io/projects/ford-engine-anomaly/</guid><description>&lt;div style="display:grid;grid-template-columns:130px 1fr;gap:1rem 1.5rem;margin-bottom:2rem;"&gt;
&lt;div style="font-weight:700;"&gt;개요&lt;/div&gt;
&lt;div&gt;500개 센서의 시계열 데이터로 자동차 엔진의 정상/이상을 판별하고, Grad-CAM·SHAP로 모델의 판단 근거를 해석한 딥러닝 이상 탐지 프로젝트입니다.&lt;/div&gt;
&lt;div style="font-weight:700;"&gt;수업&lt;/div&gt;
&lt;div&gt;심층신경망특론 기말 프로젝트 (인하대학교 통계데이터사이언스학)&lt;/div&gt;
&lt;div style="font-weight:700;"&gt;기간&lt;/div&gt;
&lt;div&gt;2024.10 ~ 2024.12&lt;/div&gt;
&lt;div style="font-weight:700;"&gt;데이터&lt;/div&gt;
&lt;div&gt;Ford 오픈 데이터셋 — 4,921개 시계열 샘플 × 500개 센서 (학습 3,601 / 테스트 1,320, 정상 1 / 이상 −1)&lt;/div&gt;
&lt;div style="font-weight:700;"&gt;기술 스택&lt;/div&gt;
&lt;div&gt;Python · TensorFlow/Keras · scikit-learn · XGBoost · SHAP · NumPy&lt;/div&gt;
&lt;div style="font-weight:700;"&gt;성과&lt;/div&gt;
&lt;div&gt;&lt;strong&gt;1D-CNN 정확도 94.69% · AUC 0.95&lt;/strong&gt; 로 세 모델 중 최고 성능 달성&lt;/div&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;h2 id="문제-정의"&gt;문제 정의&lt;/h2&gt;
&lt;p&gt;엔진은 자동차 동력의 심장과도 같아서, 이상이 생기면 곧바로 안전 문제로 이어집니다. 실제로 최근 5년간 접수된 자동차 결함 신고에서 &lt;strong&gt;엔진 관련 문제가 가장 큰 비중&lt;/strong&gt;을 차지했습니다. 그래서 엔진에 부착된 센서를 실시간으로 들여다보며 이상 징후를 미리 잡아내는 일이 점점 더 중요해지고 있습니다.&lt;/p&gt;
&lt;p&gt;저희는 이 문제를 &lt;strong&gt;이진 분류&lt;/strong&gt;로 풀기로 했습니다. 한 시점에서 측정된 센서 값들을 보고 그 순간 엔진이 정상인지 아닌지를 가려내는 것입니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;입력:&lt;/strong&gt; 특정 시점 $t$ 에 측정된 500개 센서 값&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;타깃:&lt;/strong&gt; 그 시점의 엔진 상태 — 정상(1) / 이상(−1)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;목표:&lt;/strong&gt; 500개 센서만으로 현재 엔진 이상 여부를 정확히 판별&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="데이터-탐색"&gt;데이터 탐색&lt;/h2&gt;
&lt;p&gt;어떤 모델을 쓸지 정하기 전에, 데이터가 &lt;strong&gt;시간적으로, 또 센서 간 공간적으로 어떤 구조를 갖는지&lt;/strong&gt;부터 살펴봤습니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;① 시간적으로는 거의 무관했습니다.&lt;/strong&gt; ACF/PACF를 보니 &lt;strong&gt;lag 1 이후로는 시간적 상관이 사라져&lt;/strong&gt;, 타깃이 사실상 백색잡음(white noise)처럼 움직였습니다. 이는 과거 시점을 길게 기억하는 RNN 계열의 장점이 여기서는 작동하지 않는다는 것입니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;② 반면 센서끼리는 강하게 얽혀 있었습니다.&lt;/strong&gt; 센서 사이에는 뚜렷한 선형 상관 클러스터가 보였고, 특히 &lt;strong&gt;번호가 가까운 센서일수록 상관이 강했습니다&lt;/strong&gt;(예: 10–13번 구간은 음의 상관, 1–3번 구간은 양의 상관). 즉 이상을 가르는 단서는 시간이 아니라 &lt;strong&gt;가까이 붙은 센서들이 함께 만드는 국소 패턴&lt;/strong&gt;에 있었습니다. PCA로 약 66개 주성분까지 줄여도 봤지만 성능이 오히려 떨어져서, &lt;strong&gt;500개 센서를 그대로 쓰기로&lt;/strong&gt; 했습니다.&lt;/p&gt;
&lt;figure style="margin:1.5rem 0;"&gt;
&lt;img src="https://siuunni.github.io/uploads/papers/ford_sensor_corr.png"
alt="센서 간 2D·3D 상관관계 시각화"
style="width:100%;border-radius:8px;border:1px solid rgba(148,163,184,.25);background:#fff;padding:.5rem;"&gt;
&lt;figcaption style="font-size:.8rem;color:#94a3b8;margin-top:.5rem;text-align:center;"&gt;
센서 간 0.6 이상 강한 상관관계 (좌: 2D, 우: 3D). 번호가 인접한 센서끼리 선형 클러스터를 형성합니다.
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;→ 이 두 가지를 종합해 &lt;strong&gt;&amp;ldquo;시간보다 인접 센서의 국소 패턴이 더 중요하다&amp;rdquo;&lt;/strong&gt; 는 가설을 세웠고, 그런 패턴을 잡아내는 데 강한 &lt;strong&gt;1D-CNN&lt;/strong&gt;을 가장 유력한 후보로 두었습니다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="데이터-전처리"&gt;데이터 전처리&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;시계열 누수 막기:&lt;/strong&gt; 클래스별 80% 지점 중 더 뒤쪽 시점을 공통 기준으로 잡아 나눴습니다. 이렇게 해야 미래 데이터가 학습에 새어드는 &lt;strong&gt;시간적 누수(leakage)&lt;/strong&gt; 를 막을 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;클래스 비율 유지:&lt;/strong&gt; 정상/이상 비율을 그대로 유지하며 나눠 한쪽으로 치우치지 않게 했습니다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;정규화:&lt;/strong&gt; Standard와 Min-Max Scaler를 비교해, 센서마다 다른 단위,범위를 같은 스케일로 맞췄습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="후보-모델--최적화"&gt;후보 모델 &amp;amp; 최적화&lt;/h2&gt;
&lt;p&gt;접근 방식이 서로 다른 세 모델을 같은 데이터 위에서 나란히 비교해봤습니다.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: left"&gt;관점&lt;/th&gt;
&lt;th style="text-align: left"&gt;모델&lt;/th&gt;
&lt;th style="text-align: left"&gt;설계 의도&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;트리 기반&lt;/td&gt;
&lt;td style="text-align: left"&gt;&lt;strong&gt;XGBoost&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left"&gt;센서별 중요도 기반 분류&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;순환 신경망&lt;/td&gt;
&lt;td style="text-align: left"&gt;&lt;strong&gt;LSTM&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left"&gt;게이트로 시간 의존성 학습&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;합성곱 신경망&lt;/td&gt;
&lt;td style="text-align: left"&gt;&lt;strong&gt;1D-CNN&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left"&gt;인접 센서의 국소 패턴 추출&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;XGBoost.&lt;/strong&gt; grid search로 하이퍼파라미터를 맞춰봤지만, Train Loss는 떨어지는데 &lt;strong&gt;Validation Loss는 제자리&lt;/strong&gt;인 전형적인 과적합 양상을 보였습니다. AUC도 0.75에 머물렀습니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;LSTM.&lt;/strong&gt; 정규화 방식과 유닛 수를 바꿔가며 세 번 돌려보았고, 그중 &lt;strong&gt;유닛을 256개로 키운 설정&lt;/strong&gt;이 정확도 92.88%로 가장 좋았습니다. AUC 0.93으로 성능은 높았지만 과적합 기미가 조금 있었고, 무엇보다 &lt;strong&gt;학습에 1시간이 넘게&lt;/strong&gt; 걸렸습니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1D-CNN.&lt;/strong&gt; 데이터 탐색에서 본 &amp;ldquo;좌우 15개 안팎의 센서가 강하게 얽힌다&amp;quot;는 특징을 그대로 설계에 반영했습니다. 첫 레이어 커널을 &lt;strong&gt;30&lt;/strong&gt;으로 넓게 잡아 큰 패턴부터 보고, 이후 &lt;strong&gt;15 → 7 → 3&lt;/strong&gt; 으로 좁혀가며 국소 패턴을 단계적으로 잡도록 했습니다. 각 Conv 블록에는 BatchNorm과 Dropout(0.2)을 넣어 과적합을 눌렀습니다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="모델링-결과"&gt;모델링 결과&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: left"&gt;모델&lt;/th&gt;
&lt;th style="text-align: center"&gt;Test Accuracy&lt;/th&gt;
&lt;th style="text-align: center"&gt;Test Loss&lt;/th&gt;
&lt;th style="text-align: center"&gt;AUC&lt;/th&gt;
&lt;th style="text-align: center"&gt;Confusion (TP·TN·FP·FN)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;XGBoost&lt;/td&gt;
&lt;td style="text-align: center"&gt;74.92%&lt;/td&gt;
&lt;td style="text-align: center"&gt;0.5521&lt;/td&gt;
&lt;td style="text-align: center"&gt;0.75&lt;/td&gt;
&lt;td style="text-align: center"&gt;470 · 519 · 162 · 169&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;LSTM&lt;/td&gt;
&lt;td style="text-align: center"&gt;92.88%&lt;/td&gt;
&lt;td style="text-align: center"&gt;0.2973&lt;/td&gt;
&lt;td style="text-align: center"&gt;0.93&lt;/td&gt;
&lt;td style="text-align: center"&gt;567 · 659 · 22 · 72&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;&lt;strong&gt;1D-CNN&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;&lt;strong&gt;94.69%&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;&lt;strong&gt;0.1338&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;&lt;strong&gt;0.95&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;&lt;strong&gt;608 · 643 · 38 · 31&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;결과적으로 &lt;strong&gt;1D-CNN이 정확도·안정성·속도 어느 쪽으로 봐도 가장 좋았습니다.&lt;/strong&gt; Train과 Validation Loss가 나란히 수렴해 과적합이 없었고, 학습 시간도 약 10분으로 LSTM(1시간+)의 6분의 1 수준이었습니다. 데이터 탐색에서 세운 &amp;ldquo;시간보다 국소 공간 패턴이 중요하다&amp;quot;는 가설이 성능으로 확인되었습니다.&lt;/p&gt;
&lt;figure style="margin:1.5rem 0;"&gt;
&lt;img src="https://siuunni.github.io/uploads/papers/ford_cnn_arch.png"
alt="최종 1D-CNN 아키텍처"
style="width:100%;border-radius:8px;border:1px solid rgba(148,163,184,.25);background:#fff;padding:.5rem;"&gt;
&lt;figcaption style="font-size:.8rem;color:#94a3b8;margin-top:.5rem;text-align:center;"&gt;
최종 1D-CNN 아키텍처. 4개 Conv1D 블록(BatchNorm·ReLU·Dropout) → Global Average Pooling → Dense.
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;hr&gt;
&lt;h2 id="xai--모델은-무엇을-보고-판단했나"&gt;XAI — 모델은 무엇을 보고 판단했나&lt;/h2&gt;
&lt;p&gt;정확도가 높다고 해서 모델을 곧바로 믿을 수는 없습니다. 따라서 &lt;strong&gt;Grad-CAM&lt;/strong&gt;과 &lt;strong&gt;SHAP&lt;/strong&gt;로 &amp;ldquo;CNN이 대체 어디를 보고 이상이라 판단했는지&amp;quot;를 들여다봤습니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Grad-CAM:&lt;/strong&gt; 이상일 때 센서 활성화 값이 약 0.25, 정상일 때 약 0.12로 갈렸습니다. 모델이 &lt;strong&gt;이상이라고 볼 때 센서 신호를 훨씬 또렷하게 잡아낸다&lt;/strong&gt;는 뜻입니다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SHAP:&lt;/strong&gt; 두 방법 모두에서 &lt;strong&gt;번호가 서로 가까운 센서들&lt;/strong&gt;(Grad-CAM은 472·428, SHAP은 471·429)이 핵심으로 꼽혔습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;figure style="margin:1.5rem auto;max-width:440px;"&gt;
&lt;img src="https://siuunni.github.io/uploads/papers/ford_shap.png"
alt="센서 번호별 SHAP 중요도"
style="width:100%;border-radius:8px;border:1px solid rgba(148,163,184,.25);background:#fff;padding:.5rem;"&gt;
&lt;figcaption style="font-size:.8rem;color:#94a3b8;margin-top:.5rem;text-align:center;"&gt;
센서 번호별 SHAP 중요도. 인접 센서가 함께 중요 특징으로 나타납니다.
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure style="margin:1.5rem 0;"&gt;
&lt;img src="https://siuunni.github.io/uploads/papers/ford_gradcam.png"
alt="단일 샘플 및 전체 샘플 센서 중요도"
style="width:100%;border-radius:8px;border:1px solid rgba(148,163,184,.25);background:#fff;padding:.5rem;"&gt;
&lt;figcaption style="font-size:.8rem;color:#94a3b8;margin-top:.5rem;text-align:center;"&gt;
(좌) 단일 샘플의 센서별 중요도 (우) 전체 샘플에서 중요도 0.8 이상인 센서의 빈도.
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;→ 두 해석 결과가 &lt;strong&gt;상당히 겹쳤고&lt;/strong&gt;, 모두 인접 센서의 선형 패턴을 가리켰습니다. 처음 EDA에서 세운 가설을 모델이 실제로 그렇게 작동하고 있다는 것을 확인할 수 있었습니다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="핵심-요약"&gt;핵심 요약&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;데이터를 보고 모델을 골랐다:&lt;/strong&gt; &amp;ldquo;시간 상관은 약하고 인접 센서의 공간 상관이 강하다&amp;quot;는 EDA 결과를 근거로 1D-CNN을 택했고, 성능이 그 판단을 뒷받침했습니다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;세 모델을 비교했다:&lt;/strong&gt; XGBoost(0.75) &amp;lt; LSTM(0.93) &amp;lt; &lt;strong&gt;1D-CNN(0.95, 정확도 94.69%)&lt;/strong&gt; — 성능도 속도도 앞선 CNN을 최종 모델로 채택했습니다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;왜 맞췄는지까지 확인했다:&lt;/strong&gt; Grad-CAM과 SHAP가 같은 결론을 내, 인접 센서의 선형 패턴이 이상 판별의 핵심이라는 점을 분명히 했습니다.&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>