AI모델을 통해 불량 공정률을 획기적으로 줄인 기업이 있다? (feat.SHAP라이브러리)

AI모델을 활용하여 불량 공정률을 획기적으로 낮춘 해시스크래퍼 고객사례. 데이터 수집과 전처리 과정에 대한 상세 설명.

4
AI모델을 통해 불량 공정률을 획기적으로 줄인 기업이 있다? (feat.SHAP라이브러리)

0. 개요

해시스크래퍼 고객사례 중 하나로 AI모델을 통하여 공정에서 나타는 불량률을 줄이기 위해 AI모델을 사용하였습니다. 머신러닝 모델의 예측을 좀 더 깊고 이해하기 쉽게 설명해드리고자 글을 작성하였습니다.

1. 문제 정의

1.1. 목표 설정

먼저 고객 사례를 간략하게 설명해드리자면, 128개의 변수들에 나와있는 것을 토대로 물건을 만드는데에 있어서 각 호기마다 불량률이 차이가 났고, 불량품에 대한 예측을 머신러닝 모델을 통해서 하고나서, 머신러닝 모델을 통해 어떠한 변수들이 불량을 나오게 했는지 분석하여 그 변수들을 조절해 불량률을 줄이는 것이 목표였습니다.

1.2. 가설 수립

공정과정에서 머신러닝 모델을 통해 주요 변수들을 추출하여 조절하면 공정률을 낮출 것이라는 가설을 세웠습니다.

2. 데이터 수집

2.1. 데이터 소스 결정

데이터 소스들은 저희 고객께서 공장에서 직접 각 호기마다의 데이터들을 제공하여 주셨습니다.

이 데이터는 회사내부데이터이므로 직접적인 공개는 어려워 폴더만 캡쳐해서 보여드립니다.

2.2. 데이터 수집

필요한 데이터는 최소 1만건을 요청을 드렸었고, 그에 있어서 최대한 많은 데이터를 주셨으면 좋겠다고 말씀을 드렸었습니다.

그래서 받은 raw 데이터는:
- 1호기: 3,931개
- 2호기: 16,473개
- 3호기: 2,072개
- 4호기: 16,129개
- 5호기: 57,970개
- 6호기: 78,781개

총 로우 데이터의 개수는 대략 17만 5천개의 데이터를 활용하여 모델을 학습하였습니다.

3. 데이터 전처리

3.1. 데이터 정제

모델을 학습하는데에 있어서 데이터의 정제는 굉장히 중요합니다. 제가 생각하기에는 머신러닝을 통한 데이터학습에 8할이상이라고 말씀드릴 수 있을 것 같습니다.

데이터 정제가 잘 안된 데이터를 학습하게 된다면, 결국에 머신러닝 또한 학습이 잘 되지않는 모델이 나옵니다. (쉽게 말씀드리면 쓰레기를 넣으면 쓰레기가 나온다고 생각하시면 됩니다.)

3.2. 작업 순서

3.2.1. 파일 인코딩 처리

일단 파일을 불러오는데, csv를 읽어들이는데에 있어서 encoding형식이 모두 달라 어떠한 것은 'cp949' 어떠한 것은 'utf-8'로 인코딩을 해서 읽어왔습니다.

for file_path in file_paths:
    try:
        df = pd.read_csv(file_path, encoding='cp949', header=None)
    except UnicodeDecodeError:
        df = pd.read_csv(file_path, encoding='utf-8', header=None)

3.2.2. 라벨링 작업

라벨링을 해주기 위해서 날짜와 시간 열을 합쳐주고, 그 시간에 나온 y축데이터와 연결시켜주기:

for i in range(len(result_df_new) - 1):
    start_time, end_time = result_df_new['Datetime'].iloc[i], result_df_new['Datetime'].iloc[i + 1]
    selected_rows = df_yaxis[(df_yaxis['Datetime'] >= start_time) & (df_yaxis['Datetime'] < end_time)]
    results.append(1 if all(selected_rows['결과'].str.contains('OK')) else 0)
results.append(0)

3.2.3. 데이터 병합

호기마다 전처리된 데이터 합쳐주기:

data = pd.concat([df1,df2,df3,df4,df6])
data.reset_index(drop=True,inplace=True)

3.2.4. 중복 데이터 제거

중복 데이터들은 데이터셋에 편향을 초래할 수 있고, 모델이 데이터의 다양성을 학습하는데에 문제가 될 수 있습니다. 또한 과적합문제가 생길 수 있기때문에 중복데이터는 모두 제거:

data = data.drop_duplicates().reset_index(drop=True)

3.2.5. 결측치 처리

missingno라이브러리를 통해서 결측치값을 시각화하였습니다. 그리고 결측치가 많은 열은 아예 제거를 하였습니다. 결측치가 많은 컬럼을 제거해주는 이유는 위와 비슷한 이유입니다.

3.3. 피처 엔지니어링

모델의 성능을 향상시키기 위해 새로운 피처를 생성하거나 기존의 피처를 변형하는 것이 피처 엔지니어링이라고 볼 수 있는데, 저희는 피쳐값 하나하나 모두 정확히 알지를 못하고, 피쳐값이 모두 중요하다고 봤기때문에 피쳐엔지니어링은 따로 해주지 않았습니다.

3.4. EDA(탐색적 데이터 분석)

데이터 분포 확인

히스토그램, 박스 플롯 등의 그래프를 사용하여 데이터의 분포를 확인합니다.

상관 관계 분석

피처 간의 상관 관계를 분석하여 중요한 피처를 파악하거나 다중 공선성 문제를 해결합니다.

4. 샘플링 유형

4.1. 데이터 불균형 처리

데이터에 대해서 불균형도가 많이 있었기 때문에 언더샘플링을 통하여 여러 모델과 결합을 해보았습니다. 다양한 언더샘플링 기법을 시도했습니다:

  • Random Under-sampling (RUS): 다수 클래스에서 임의로 데이터를 제거
  • NearMiss: 소수 클래스의 데이터와 가장 가까운 k개의 다수 클래스 데이터만을 유지
  • Tomek Links: 서로 가장 가까운 데이터 쌍을 찾아 다수 클래스 데이터를 제거
  • Edited Nearest Neighbors (ENN): k-NN 알고리즘을 사용하여 다수 클래스 데이터 제거
  • Neighbourhood Cleaning Rule (NCL): ENN의 확장된 버전

최종적으로 ENN 언더 샘플링이 모델과 가장 적합하다고 판단되어 적용하였습니다.

# NearMiss 인스턴스 생성
nm = NearMiss()

# 언더샘플링 수행
X_resampled, y_resampled = nm.fit_resample(data.drop('결과', axis=1), data['결과'])

# 언더샘플링 결과를 DataFrame으로 변환
data_sample = pd.concat([X_resampled, y_resampled], axis=1)

5. 모델링

5.1. 모델 선택

문제의 유형(분류, 회귀, 클러스터링 등)에 따라 적절한 머신러닝 모델을 선택합니다. 모델 선택에 있어서는 직접적으로 여러 모델을 돌려보기도 했지만 PyCaret 라이브러리를 통해서 best로 뽑히는 모델을 참고하여 모델을 선택하였습니다.

PyCaret은 Python의 오픈소스 데이터 분석 및 머신러닝 자동화 라이브러리입니다. PyCaret은 사용자에게 적은 코드량으로 전체 데이터 분석 및 머신러닝 파이프라인을 빠르게 구축하고 실험하는 능력을 제공합니다.

5.2. 모델 훈련

학습 데이터를 사용하여 모델을 훈련시킵니다. 최종적으로는 CatBoost 모델을 통해서 AUC값과 F1-score값이 제일 높게 나왔습니다.

평가 지표 설명:

AUC (Area Under the Curve):
- AUC는 ROC (Receiver Operating Characteristic) 커브 아래의 영역을 의미합니다.
- AUC 값은 0과 1 사이에 있으며, 값이 1에 가까울수록 분류기의 성능이 좋다고 판단합니다.
- AUC는 불균형한 클래스 분포에서 특히 유용하게 사용됩니다.

F1-Score:
- F1-Score는 정밀도 (Precision)와 재현율 (Recall)의 조화 평균입니다.
- 정밀도는 양성으로 예측한 것 중 실제 양성의 비율이며, 재현율은 실제 양성 중 양성으로 올바르게 예측된 비율입니다.
- F1-Score의 값은 0과 1 사이에 있으며, 값이 높을수록 모델의 성능이 좋다고 판단합니다.

6. 마무리: 변수도출과 직관성을 높인 기능 추가

최종적으로는 공장에 있는 기계가 도출해내는 로우데이터를 실시간으로 받아와서 이 모델을 통해서 예측을 하고, SHAP 라이브러리를 통해서 불량이 나온것들에 대한 변수들을 도출해냈습니다.

그리고 또한 공장에서 작업하시는 일반인 분들을 위해서 PyInstaller를 통해서 이러한 일련의 과정들에서 엑셀파일이 최종적으로 나와서 쉽게 볼 수 있게 하였고, exe파일을 생성하여 클릭 한번으로 해당 로우데이터에 대해서 변수들과 불량품인지 아닌지 판단할 수 있게 엑셀로 보이게 했습니다.

SHAP란?

SHAP는 SHapley Additive exPlanations의 약자로, 머신러닝 모델의 각 피처가 예측에 얼마나 영향을 미쳤는지를 설명하는 데 사용되는 도구입니다. 이는 모델의 '투명성'을 높이고, 그로 인해 예측이 어떻게 이루어졌는지에 대한 신뢰도를 향상시킬 수 있습니다.

결론

해시스크래퍼는 위와 같은 사례에서는 상기 방식의 AI모델을 토대로 프로젝트를 진행하고 있습니다. 데이터 전처리부터 모델링, 그리고 최종 사용자를 위한 직관적인 인터페이스까지 완성된 솔루션을 제공함으로써 실제 공정에서의 불량률을 효과적으로 줄일 수 있었습니다.

댓글

댓글 작성

이메일은 공개되지 않으며, 답글 알림에만 사용됩니다.

이어서 읽어보세요

새 글 알림 받기

해시스크래퍼 기술 블로그의 새 글이 발행되면 이메일로 알려드립니다.

이메일은 새 글 알림에만 사용됩니다.