본문 바로가기
머신러닝 입문

[머신러닝 대회 입문] 머신러닝 Workflow: 머신러닝이란? 머신러닝 과정, 데이터 분석하기 (1)

by 미역청 2025. 1. 4.

머신러닝을 입문할 때 가장 어려움을 겪는 부분은 어떻게 모델을 학습시키는지, 그 방법을 정립하는 단계입니다.

 

최근 머신러닝에 대한 관심이 집중되며 다양한 머신러닝 관련 아티클이나 서적을 다수 찾아볼 수 있습니다만, 

정작 좋은 모델을 만들기 위한 일관된 Workflow에 대한 정보는 찾기 어렵습니다.

저 역시 이 과정을 이해하고, 저만의 방법을 정립해 체화하는데에 오랜 시간이 걸렸는데요,

 

오늘은 머신러닝, 특히 머신러닝 대회에 입문하는 초보를 위한 ML Workflow를 설명하겠습니다.

 

이 내용은 일반 머신러닝 뿐 아니라 딥러닝에도 적용됩니다! 

큰 도움이 되길 바래요 ;)

 

* 주의: 이 글은 입문자를 위해 머신러닝의 개념을 알기쉽게 의역한 부분이 다소 존재합니다.

머신러닝이란?

머신러닝이란, 데이터로부터 패턴을 학습하여 예측값을 내놓는 알고리즘입니다.

 

과거, 인류는 자연 요소 간의 상관관계를 파악하여 원하는 값을 예측하기 위해 수많은 시행착오를 겪었습니다. 

주로 여러 요소가 주어지면 이들을 적절히 계산하는 알고리즘을 구축하는 방식이었습니다.

 

즉, 이 모든 과정의 최종 목표는 어떠한 관찰대상이 주어졌을 때, 이 대상이 무엇인지를 파악하는 데에 도움을 주는 요소인 Feature을 뽑아내고, 그로부터 예측값을 도출하는 것이 됩니다.

Feature: 관찰대상에게서 발견할 수 있는 개별적이고 측정 가능한 경험적 속성

 

인간의 insight로 알고리즘을 만들어 직접 뽑은 feature를 Human-Driven Feature라 부릅니다.

Deep Learning은 이와 달리, 기계가 feature도 뽑고, feature 간의 관계까지 파악해내는 방식입니다.

Human-driven feature와 Deep learning의 차이

 

쌈@뽕한 모델 레시피

 

여기까지 읽고 눈치 빠른 분이라면 결국 데이터로부터 좋은 Feature를 뽑는 것이 성능 좋은 모델을 향한 첫 걸음이라는 것을 알아채셨을 겁니다.

그리고, 데이터로부터 좋은 Feature를 뽑기 위해서라면 데이터의 특성을 잘 이해하여 오류값이나 이상치를 조정하는 듯 데이터를 잘 가공해야 합니다.

 

이걸 모두 수행하기 위해선 데이터의 특성을 분석하는 실험이 선행되어야합니다.

 

정리하자면 성공적인 머신러닝 모델을 만들기 위해선 이 과정을 순서대로 수행해야 합니다:

 

1. 탐색적 데이터 분석(EDA)를 통해 데이터의 특성을 파악한다.

2. 데이터에 맞는 모델을 찾는다.

3. 데이터를 적절히 가공한다.

4. 모델을 데이터로 학습시킨다.

5. 모델 성능 검증

6. 하이퍼파라미터 튜닝

7. 모델 앙상블

머신러닝 모델 학습 과정. 이 틀은 대부분의 머신러닝, 딥러닝 과정에서 적용됩니다.

 

상황에 따라서 하이퍼파라미터튜닝, 앙상블이 생략될 수는 있지만 전반적인 학습 과정은 어떤 모델, 데이터를 쓰든 똑같습니다.

 

이제 각 단계에서 어떤 일을 수행해야하는지,

그 과정에서 궁극적으로 산출해야하는 것이 무엇인지를 소개하겠습니다.

 

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

탐색적 데이터 분석(Experimential Data Analysis)는 데이터 분석 초기에 데이터의 특성을 알아보는 탐색적 방법입니다.

 

머신러닝의 주요 아이디어는 빅데이터에서 Feature에 따른 Target의 평균값을 학습해 예측하는 것입니다. 

 

그림으로 표현하면 위와 같습니다.

Feature (=X축)와 Target값이 주어지면, 이들의 일반적인 경향을 학습한 prediction function을 그리는 것이죠.

이상적인 Model의 prediction function

 

하지만, 이 때 데이터에 문제가 있다면 과연 prediction function이 올바르게 그려질 수 있을까요?

 

이상치가 미치는 영향

이상치(Outlier)란, 관찰된 데이터들의 일반적인 범주에서 극단적으로 벗어난 아주 작거나 큰 값을 뜻합니다.

 

모델에 따라 적은 양의 이상치는 무시될 수도 있으나, 이상치가 많거나 학습 알고리즘이 이상치에 민감하다면 모델의 성능은 급격히 떨어질 것입니다.

예를 들어, 앞에서 설명한 모델이 만약 이상치를 반영했다면 아래와 같은 빨간색의 prediction function을 그릴 것입니다.

이상치로 안해 잘못 만들어진 prediction function

 

결측치가 미치는 영향

결측치(Missing Value)란, feature 일부나 전체가 유실된 데이터를 뜻합니다.

예시를 들어보겠습니다:

 

아래 표는 타이타닉 탑승자들의 신상정보와 생존유무를 재구성한 것입니다.

표를 보면 몇몇 신상정보가 공란으로 비워져있습니다.

이렇게 공란으로 비워진 데이터가 결측치입니다.

id 성별 나이 티켓번호 가족유무 생존
1 F 26 B125 ? Y
2 M 68 ? Y N
3 F 32 A001 N Y
... ... ... ... ... ...
521 M 12 C098 ? Y
522 M ? D29 N N
523 ? ? ? ? ?
524 F 78 S034 Y N

 

일반적으로 결측치는 공란으로 비워져있거나, 'NaN' 'N/A' 등으로 표시되어있습니다.

 

데이터에 공란인 결측치가 있다면 모델은 학습 자체를 수행할 수 없습니다.

('N/A' 등으로 표시라도 된 경우 학습은 되지만, 성능은 보장할 수 없습니다.)

 

때문에 우리는 결측치가 들어오면 적절한 값으로 채워줘야 합니다.

 

최근 기술이 발전하여 결측치가 들어오면 자체적으로 그걸 적절한 값으로 채워 학습시키는 머신러닝 라이브러리도 있습니다. (트리 기반 모델 - LightGBM, XGBoost, CatBoost, Random Forest 등)

하지만, 이들 대부분이 결측치를 결측값으로 표시하는 등 데이터의 특성을 고려하지 않은 단순하고 부정확한 방식을 사용합니다.

또한 SOTA 주요 모델 라이브러리 중 아직까지 해당 기능을 제공하지 않는 것도 많기 때문에 더더욱 결측치 해결은 필수입니다.

 

이상치와 결측치 다루기

예를 들어, 우리가 어떤 설문을 진행했다고 해보겠습니다.

Q1. A제품을 구매하지 않은 이유는 무엇입니까?
1. 가격이 비싸서
2. 디자인이 마음에 들지 않아서
3. 무상A/S 기간이 짧아서
4. 사용법이 타사제품에 비해 복잡해서
5. 기타 _____________

 

그런데, 실제 설문 결과를 확인해보니 다음과 같았습니다:

id 1번 답변
1 2
2 1
3 5. 기타: 출시한 줄 몰랐다.
4  
...  
20101 5. 기타: 개비쌈;;
20102 3
20103 5. 기타: B사는 A/S기간이 36개월인데 여긴 24개월 밖에 안됨
20104 5. 기타: 집가고싶다
20105 5. 기타: C 제품과 호환되지 않음

 

결과를 보면, 5번 '기타'를 고른 사람이 많다 는 걸 알 수 있습니다.

하지만, 과연 정말로 그럴까요?

 

답변 표를 보면 그렇지 않다는 것을 알 수 있습니다.

 

20101번 답변은 1번 답변으로,

20103번 답변은 3번 답변으로 재분류할 수 있습니다.

20104번 답변은 유효하지 않습니다.

4번은 어째서인지 답변이 유실되었습니다.

 

즉, 20101번, 20103번, 20104번이상치이고 4번결측치에 해당합니다.

 

따라서, 우리는 이들을 수정할 필요가 있습니다.

 

데이터 분포와 오버샘플링, 언더샘플링

모델은 데이터 분포 자체에 영향을 받기도 합니다.

데이터 분포가 지나치게 불균등하면 모델 학습이 잘 이루어지지 않기도 합니다..

 

분류(classification) 모델로 예시를 들어보겠습니다.

아래는 스팸메일분류 데이터셋의 데이터 분포입니다.

스팸 분류기 데이터 분포. 0은 정상메일(ham), 1은 스팸메일(spam)입니다.

 

전체 데이터에서 정상과 스팸의 비율은 약 9:1로 매우 불균형한 것을 볼 수 있습니다.

 

위의 예시에서, 만약 모델이 모든 데이터를 정상메일(0)로 분류하면 어떻게 될까요?

 

모델의 정확도(Accuracy)는 90%에 달하겠으나, 실제 분류기로서의 기능은 할 수 없을 것입니다.

 

하지만 모델은 이를 알 리 없으니 학습을 거듭할수록 모든 데이터를 정상메일로 분류하는 방향으로 갈 가능성이 높습니다.

그러므로 모델을 만든 후에는 해당 모델의 예측패턴을 파악하는 작업이 이루어져야합니다.

 

일반적으로 분류 문제에서는 혼동행렬(Confusion Matrix)을 뽑아보는데요, 이 부분은 5. 모델 성능 검증 에서 자세히 설명하겠습니다. 

분류모델의 혼동행렬(Confusion Matrix)

 

이러한 데이터 불균등을 해결하기 위해 새로운 데이터셋을 구해 넣어줄 수 있다면 더할나위 없이 좋겠으나, 현실적으로는 어려울 것입니다. 그러므로 우리는 오버샘플링 또는 언더샘플링을 사용합니다.

 

오버샘플링이란, 기존 데이터를 토대로 데이터가 부족한 부분에 가상데이터를 만들어 추가하는 방식입니다.

언더샘플링이란, 데이터가 많은 부분의 데이터를 일부 삭제하여 데이터 분포를 균등하게 만드는 방식입니다.

 

언더샘플링은 데이터 손실로 이어지고, 데이터 손실은 곧 모델 성능 저하로 이어질 수 있으므로 현재까지는 대회에서 오버샘플링을 더 많이 사용합니다.

 

※ 참고: 오버샘플링을 자동으로 해주는 라이브러리