개발공부 & 부트캠프/[부트캠프] 회고

[데이터 엔지니어링 부트캠프]7월 1주차 회고

포리셔 2023. 7. 9. 21:25

몇 주차를 세는 방법을 찾은 것 같습니다. 그래 $N$월 $N$주차라고 적으면 되는 거였구나! 항상 깨달음이 늦음

좋았던 점

  • 본격적인 머신러닝 커리큘럼 - 전처리: 제가 대학원 바깥에서 데이터 엔지니어링이나 머신러닝 관련 이야기를 나누다 보면, 그거 그냥 머신러닝(또는 딥러닝) 모델 만들고 AI한테 예측해달라고 하면 되는 거 아니야? 라고 하는 걸 많이 들었습니다. 하지만 실상은 모델을 만드는 것만큼이나 그 전 과정이 굉장히 중요합니다. 요리할 때 재료 손질이 중요하고, 그림 그릴 때도 밑그림과 스케치 단계가 만만치 않게 중요하듯이, 데이터 엔지니어링과 분석에서도 일련의 전처리(preprocessing) 과정이 모델 만드는 것 못지 않게 중요합니다. 애초에 "trash in trash out"이라는 말이 있을만큼 집어넣는 데이터의 질에 따라서 모델의 성능이 좌우될 정도니까요.
    그런 면에서 일련의 데이터 전처리, 그리고 그 이후에 이어지는 파이프라인 수립까지 자세하게 설명을 들은 것이 좋았습니다.
  • Anaconda 가상 환경: 아나콘다를 오래 써오기는 했지만, 가상환경 관련 기능은 그 개념이 낯설다 보니 실제로는 잘 손이 가지 않았습니다. 하지만 머신러닝 전용으로 아나콘다 가상환경을 만들면서, 수업 들을 때 사용하는 환경과 개인적으로 연습할 때 쓰는 환경을 구분지을 수 있다는 점을 배웠습니다. 무엇보다 가장 좋았던 것은 몇 달 간 쩔쩔매면서 개인적인 프로젝트에 쓸 라이브러리 관리를 했던 것이 가상환경 하나 따로 구축하는 것으로 해결되었다는 점. 수업 외적으로도 많은 도움이 된 기능이었습니다.

아쉬웠던 점

  • 이론 설명의 비중과 난이도 조정과 관련하여: 부트캠프 같은 반 수강생들은 최소 1/4 정도는 아예 코딩 경험이 없고, 컴공과 출신은 한 손에 꼽을 정도로 적습니다. 그런데도 수업 자료의 설명 방식을 보면 비전공자들은 알아듣기 어려울 정도로 CS 배경 지식이 요구되는 경우가 있었습니다. 당장 저만 해도 컴공과 전공이 아닌 기계학부 출신이다 보니 못내 아쉬운 부분이었습니다.
    강사님 입장에서는 그런 부분을 메꾸고자, 또는 단순히 흥미를 돋구기 위한 주제였을지 모르지만, 너무 이론적인 부분까지 지나치게 파고 들어가는 면도 없지 않아 있었습니다. 수강생들끼리 스터디나 네트워크를 조직해서 서로 보충해줄 필요가 느껴집니다.

배운 점

기본 머신러닝 알고리즘

사이킷런(Scikit-learn)에서 제공하는 데이터셋들을 이용해 선형회귀, 로지스틱 회귀, 분류 트리, 서포트 벡터 머신(SVM) 기반의 알고리즘의 사용법을 배웠습니다.

교차 검증(cross-validation)

데이터는 많으면 많을 수록 좋지만, 실제로는 그 정도로 큰 데이터셋을 얻는 데 한계가 있습니다. 충분히 큰 데이터셋을 사용하지 않으면 특정 데이터의 특성에 편중된 학습을 할 수 있기 때문에 다른 방도가 필요합니다.
이때 사용하는 방법 중 하나가 KFold 방법으로, 데이터셋을 $n$개로 등분한 뒤에, $n$개의 데이터 중 하나씩을 테스트 데이터셋으로 사용해 모델의 성능을 평가하는 방식이 있습니다. 일반적으로 4~5등분을 하며 문헌 등에서는 이 숫자에 맞추어 five-fold cross validation 등으로 표현합니다. 학습과 검증이 끝나면 $n$개의 성능 지표에 산술 평균을 취해서 정확도 등을 평가합니다.

평가지표

정확도는 이진 분류 문제 등에서 제대로 된 성능 평가를 하지 못한다는 맹점이 존재합니다. 이를 보완하기 위해 혼동 행렬, 정밀도, 재현율, ROC curve와 ac score 등의 다양한 평가지표를 도입하게 됩니다. 어떤 평가지표를 사용할 지는 분석가가 사용하는 데이터와 모델이 어떤 평가지표를 더 중요하게 요구하는 지에 따라 선택할 수 있습니다.

데이터 전처리

앞서 좋았던 점 부분에서도 짚었듯이, 올바른 데이터 분석을 위해서는 모델이 효율적이고 정확한 학습을 할 수 있도록 데이터를 정제해야 하며, 이 일련의 과정을 전처리라고 합니다. 처리하고자 하는 데이터의 종류에 따라 범주형(categorical) 데이터와 연속형(continuous, 수치형이라고도 함) 데이터로 나뉘고, 이 두 부류의 데이터는 전처리 방식에서도 차이가 납니다.

범주형 데이터 전처리

분류 트리에 주력으로 사용되는 라벨 인코딩(Label Encoding) 방식은 범주형 데이터의 요소들을 0, 1, 2, ... 등의 정수형 인덱스로 변환합니다. 그 외의 머신러닝 모델에서 주로 사용하는 원 핫 인코딩(One-Hot Enconding) 방식은 정수형 인덱싱 대신, 특정한 크기의 배열의 특정 요소만 1이고 나머지 요소들은 0으로 변환해 인코딩을 합니다.
예를 들어 빨강, 파랑, 노랑이라는 세 가지 요소를 라벨 인코딩과 원 핫 인코딩으로 나타내면 아래와 같이 나타납니다.

# 라벨 인코딩
빨강 -> 0
파랑 -> 1
노랑 -> 2
# 원 핫 인코딩
빨강 -> [1, 0, 0]
파랑 -> [0, 1, 0]
노랑 -> [0, 0, 1]

두 전처리기는 각각 사이킷런의 preprocessing 서브모듈에서 LabelEncoder()OneHotEncoder()라는 클래스로 구현되어 있습니다.

연속형 데이터 전처리

연속형, 또는 수치형 데이터의 전처리는 통계적 방식에 기반을 둔 두 가지 기법을 주로 사용합니다. 정규화(normalization)은 최대값과 최소값을 각각 1과 0으로 설정해, 모든 데이터가 0 이상 1 이하의 값을 가지게끔 스케일을 조정합니다. 반대로 표준화(standardization)은 데이터의 평균값과 표준편차를 기반으로 아래 공식에 맞게 데이터를 스케일링합니다.
$$X_std = \frac{X-\mu}{\sigma}$$
여기서 $\mu$는 데이터의 평균, $\sigma$는 데이터의 표준편차를 뜻합니다.
이렇게 스케일을 조정하는 이유는 수치형 데이터는 수집한 데이터의 특성에 따라 어떤 열(column)은 0.1 단위, 어떤 열은 10만 단위로 스케일의 큰 차이가 날 수 있고, 이 데이터를 그대로 학습에 이용했을 경우 모델이 더 큰 스케일에 가중치를 두고 학습할 가능성이 높아지기 때문입니다. 따라서 올바른 학습을 위해서는 사용할 데이터의 스케일을 비슷하게 맞춰주는 작업이 필수입니다.

연속형 데이터 전처리와 관련된 팁

연속형 데이터를 전처리할 때, 특히 데이터셋을 훈련, (검증, ), 테스트 데이터셋으로 분할할 때 주의할 점은 전처리기를 훈련(fit)할 때는 반드시 훈련 데이터셋의 스케일을 기준으로 훈련해야 한다는 점입니다. 이는 실제로 모델이 맞닥뜨릴 데이터가 반드시 훈련 데이터셋의 범위와 특성을 따른다는 보장이 없기 때문으로, 검증 데이터셋과 테스트 데이터셋으로 시험했을 때는 여기에 포함되지 않는 데이터로 모델을 시험하게 하기 위함입니다.
어렵게 배운 것은 잊기도 어렵다는 말이 있습니다. 머신러닝 모델의 학습도 똑같습니다.

하이퍼파라미터 튜닝

모델의 성능을 결정하는 매개변수들을 하이퍼파라미터라고 부릅니다. 대표적인 예로 결정 트리 모델의 max_depthmax_leaf 등이 있습니다. 이러한 하이퍼파라미터를 바꿔가면서 최적의 성능을 내는 하이퍼파라미터를 찾는 일련의 과정을 튜닝이라고 하는데, 사람이 일일이 바꿔가면서 하기는 아무래도 번거롭기도 하고, 실수가 생길 수도 있습니다. 그렇다고 무작정 반복문을 돌리자니 파이썬 특유의 느린 실행속도가 발목을 잡습니다.
이를 위해 사이킷런의 두 가지 메서드를 사용합니다. GridSearchCVRandomSearchCV가 그것입니다. 원하는 모든 파라미터의 값을 리스트 등의 형식으로 부여하면 그 조합을 모두 시험해주는 것이 전자인 GridSearchCV입니다. 하지만 실행 시간이 워낙 오래 걸리기 때문에 조금 타협을 해서 몇 가지만 시험해보고자 할 때 사용하는 것이 후자인 RandomSearchCV입니다.
참고로 이름에 붙어있는 CV에서 짐작할 수 있다시피, 이 두 메서드는 교차 검증, 즉 cross validation까지 한꺼번에 수행합니다. 당연히 그만큼 실행 시간도 뻥튀기됩니다

파이프라인

데이터 전처리와 모델의 학습은 순서대로 이루어져야 합니다. 이를 자동화하기 위해 Pipeline이라는 방법을 사용해 그 순서를 고정시킬 수 있습니다. 사이킷런의 파이프라인은 데이터 전처리와 모델 학습뿐만 아니라 앞서 설명한 하이퍼파라미터 튜닝까지 순서를 결정하고 자동화할 수 있습니다.

앞으로 바라는 점

  • 다음주부터 알고리즘 테스트 문제를 부트캠프에서 뿌린대요. .....뭐요??
  • 실제로 머신러닝을 배우고 연구해본 입장에서는 머신러닝 수업을 한 달만에 한다는 것이 살짝 우려되기도 합니다. 아무리 학부 때 1주일에 두 번 수업이었다고는 하나, 16주간 각종 프로젝트와 과제를 하면서 숙달했다는 것을 생각하면 한 달이라는 기간은 자연스럽게 수강생들간의 이해도를 고려하기는 어려운 구조이고, 그 과정에서 부트캠프 이전에 경험해본 수강생과 비경험자들의 이해도나 퍼포먼스 면에서도 격차가 있을 수밖에 없을 것 같습니다. 월 말에 있을 프로젝트 때 이런 문제가 없으려면 앞서 말했듯이 수강생들 간의 스터디를 조직하거나 해서 격차를 메꾸는 과정이 반드시 필요해보입니다.