2023년 1월부터 진행된 LG Aimers 2기 과정이 모두 종료되었습니다. 수료증 발급과 함께, 간단한 후기를 작성해보고자 합니다.
1월 한 달간은 AI 교육을 진행하였습니다. 총 7개의 큰 주제가 있었고, 흔히 AI, 기계학습, 딥러닝 하면 생각할 수 있는 분야에 대해 배울 수 있었습니다.
교육 내용은 이론에 집중된 내용이 많았습니다. 대학교, 대학원에서의 인공지능 관련된 전공 수업에서 배우는 내용과 비슷하다고 생각하시면 될 것 같습니다.
교육의 난이도는 조금 있는 편이라고 생각합니다. 애초에 전문가 수준의 모듈로 구성되어 있다고 공지되어 있었기 때문에 아예 기초적인 내용보다는 조금 더 어려운 내용이 많았던 것 같습니다.
개인적으로는 이론 교육과 함께 실제로 데이터 분석 시 유용한 정보들도 함께 배울 수 있었다면 더 좋았을 것 같아 아쉬운 점이 있습니다.
python, sklearn, keras, pytorch 등 데이터 분석을 할 때 필요한 프로그래밍 언어 및 라이브러리 사용법부터 강의하는 것은 아니므로 코딩 역량은 미리 준비하면 좋을 것 같습니다.
이론 교육 후 2월 한 달간은 온라인 해커톤을 진행하였습니다. 실제 스마트 공장 데이터를 기반으로, 제품의 품질 상태를 분류하는 AI 모델을 개발하는 문제였습니다.
저는 public 43위, private 194위를 기록하였습니다. 입상을 기대한 것은 아니지만 등수 차이가 생각보다 엄청 나서 당황했던 기억이 아직도 있네요.
대회 최종 제출이 끝난 후, 다른 참가자분들의 글을 읽어보며 데이터 분석을 다른 방향으로 접근했다면 더 좋았을 것 같다는 생각이 많이 들었습니다.
해커톤 후기 겸, 이번 분석 후 느꼈던 점은 아래와 같습니다.
우선은 모델 훈련 및 추론 과정입니다.
우선적으로 테스트 데이터의 통계 정보를 사용하는 것은 Data Leakage 처리되어 적용할 수 없었습니다. 테스트 데이터를 확인할 수 없다는 가정하에 모델 훈련을 진행해야 했습니다.
우선 제품 분류의 상태는 0(미달), 1(적합), 2(초과)로 다중 분류 문제였습니다. 총 3개의 클래스가 존재했는데, 각 클래스 간 비율의 차이가 컸습니다. 클래스 불균형 문제에 대해 접근할 수 있는 방법은 여러 가지가 있습니다. upsample, SMOTE 등 다양한 방법을 시도해보았고 리더보드 결과 upsample 방법을 선택했습니다.
데이터의 수에 비해 특성의 수가 많았습니다. 훈련 데이터의 경우 데이터 레코드의 수는 600개 이하인데, 특성의 수가 거의 2,900개 정도 되었던 것 같습니다. 이런 상황에서는 과대적합이 일어나기 쉬울 것 같아 과대적합을 억제하기 위한 방법을 생각해야 했었습니다. 과대적합을 억제하기 위한 방법 중 하나가 upsample이었고, 다양한 분류기를 엮어 앙상블을 시도했습니다.
제품 코드, 공정 라인 별 측정되는 변수 X가 모두 달랐습니다. 주어진 데이터는 어떤 제품의 제품 코드와, 그 제품이 들어가는 공정 라인, 그리고 그 공정 라인에서 측정되는 변수 X들의 집합이었습니다. 제품 코드는 전체 3가지였고, 공정 라인은 전체 6가지가 있었습니다.
각 제품 코드 A, T, O의 분포는 불균형적이고, T와 O는 같은 공정 라인을 공유하였습니다. 이를 바탕으로 저는 제품 A를 분류하는 모델과 제품 T, O를 분류하는 모델 두 모델을 훈련하기로 하였습니다.
특성의 개수에 비해 결측치가 많았습니다. 이는 공정 과정에서 추출되는 특성을 하나의 데이터셋에 모았기 때문이라고 생각합니다. 예를 들면, 제품 코드 A는 들어가지 않는 공정에서 추출되는 X들 또한 데이터셋에 존재하기 때문에 제품 코드 A에서는 결측치로 남아있는 것입니다.
이 결측치를 처리하는 것 또한 어려운 문제였습니다. 결과적으로 전체 두 모델에서 앙상블을 사용한 모델은 0으로, LGBMClassifier 만을 사용한 모델은 결측치를 대체하지 않았습니다.
훈련 데이터셋과 테스트 데이터셋에서의 차이가 있었던 것 같습니다. 데이터프레임에 dropna 메서드를 사용하면 모든 특성이 결측치인 특성을 제거할 수 있습니다. 이를 훈련/테스트 데이터셋에 적용한 결과, 같은 제품 코드에 같은 공정 라인임에도 남아있는 특성의 개수가 다른 경우가 있었습니다. 예를 들면, 같은 제품 코드에 공정 라인이지만 훈련 데이터에서는 500개의 특성을 측정했고, 테스트 데이터에서는 300개의 특성만을 측정한 것입니다.
저는 기본적으로 모델 훈련과 추론 시 같은 제품과 공정 라인에 대해서는 훈련 데이터와 테스트 데이터가 같은 특성을 공유할 것이라고 생각했지만 그렇지 않았습니다. 이런 상황에서, StandardScaler 및 PCA 등 데이터셋에 변환을 주는 전처리 과정이 부정적인 영향을 줄 수도 있을 것 같다고 생각되어 전처리 과정에서 스케일링 과정을 제외하였습니다. 스케일링 과정을 제외하였기에 Tree 기반의 추정기(RandomForest, LightGBM 등)들을 사용하였습니다.
특성의 개수가 많고, PCA를 적용하지 않았다 보니 특성 선택을 고려해 보았습니다. 모든 특성이 결측치인 특성을 제거해보고, SelectFromModel 등을 사용해 보았으나 전체 특성을 사용했을 때의 public 점수가 가장 좋았습니다.
이러한 과정을 통해, 제품 코드 A를 분류하는 7개의 분류기를 엮어 앙상블한 모델과 제품 코드 B를 분류하는 LGBMClassifier를 구현하였고, public 점수 0.7177629134를 얻었습니다.
훈련 과정에서의 의사결정, 예를 들면 어떤 알고리즘을 사용하는지와 같은 의사결정은 대부분 public 점수를 바탕으로 결정하였습니다. 지금 생각해보면 이렇게 해서 public 점수는 조금 올랐지만, 오히려 public 점수에 너무 맞춰진 모델로 구현된 것 같습니다.
이번 대회에서 public 점수는 전체 테스트 데이터의 30%만을 반영했습니다. 또한, 그 30%의 테스트 데이터에서 클래스 별 분포가 어떻게 되었는지 알 수 있는 방법이 없었습니다. 이런 상황에서, public 점수를 기준으로 모델을 수정해 나간 것은 오히려 private 점수가 떨어지게 되는 지름길이었던 것 같습니다.
public 점수의 테스트 데이터 포함 % 와 포함된 테스트 데이터의 클래스 분포까지는 미처 생각하지 못했던 것이 이번 대회에서의 가장 큰 문제였던 것 같습니다. 극단적으로 생각했을 때 public 점수에 포함된 테스트 데이터에는 정상인 데이터만 있었다면 그 점수를 기준 삼아 모델을 수정해 나가는 것은 현명하지 못한 일일 것입니다.
각 제품 코드별 분류를 위해 모델을 2가지로 나눴던 것은 public에서 좋은 점수를 받을 순 있었지만 결과적으로는 과대적합되어 전체 테스트 데이터에서는 좋지 못한 점수를 받은 것 같습니다. 전체 데이터에 대한 하나의 모델을 훈련하는 것이 더 좋았을 것 같습니다.
정리하자면 이 정도가 되는 것 같습니다. 자기 전에 쓰는 것이라 두서없이 막 적은 것 같네요. 데이터 분석 대회에 대한 경험이 아직 많이 없어 이런저런 문제점이 있었던 것 같습니다. 이번 기회에 얻은 여러 생각들을 잘 정리해서 차후 잘 써야겠습니다.
개학 전 길면 길고, 짧으면 짧았던 두 달간 있었던 교육은 입상과 상금을 떠나 매우 좋은 경험이었던 것 같습니다. 특히 온라인 해커톤을 진행하며 많이 고민하고 또 고민하면서 많은 것을 얻을 수 있었습니다. 애초에 수료증을 목표로 교육을 신청한 것이라 아쉬움보다는 감사함이 많이 느껴지는 것 같습니다.
추가로 LG Aimers 수료생들은 네이버 엑스퍼트에 등록 및 활동이 가능하다고 합니다. IT개발/외주의 전문가로 활동할 수 있다고 합니다.
이번 대회에서도 팀원 없이 준비하느라 부족했던 점이 참 많았던 것 같습니다. 그래도 많은 것을 배워 감사합니다. 좋은 기회를 제공해 주신 LG AI 연구원 및 Dacon분들께 감사 인사를 전합니다.