캐글에 도전하겠다고 마음을 먹었지만 공부를 어디서부터 얼마나 해야 될지 굉장히 막막했다. 그동안 다른 개발공부를 해오며 터득한 해결 방법은 무작정 비싸고 양이 많은 책이나 강의를 결제하기 보다는 쉬운 책 하나를 일단 정독하는 것이 방향성을 잡는데에 큰 도움을 준다는 것이었다. 캐글에 입문하며 본 첫 책은 '쉽게 시작하는 캐글 데이터 분석' 이었고 캐글 대회의 흐름을 맛본다는 소기의 목적은 달성한 것 같다.
책을 읽으며 간단한 데이터 분석에 대한 설명과 함께 캐글 대회의 공식 튜토리얼 대회인 타이타닉 대회와 주택 가격 예측 대회를 직접 해보며 데이터 분석의 흐름을 느낄 수 있었다. 이에 대한 내용을 공유하고자 한다
1) 데이터 분석
- 데이터 분석은 데이터 혹은 해당 일의 범위에 따라 그 목적도 다양함 - 예측, 분류, 수리 최적화, 시뮬레이션, ...
- 예측 과제에서 일반적으로 데이터를 분석하는 흐름:
- 목적, 평가 지표 결정
- 데이터 수집
- 데이터 가공 및 전처리
- 데이터 탐색 및 가시화
- 특징 값 추출
- 모델 작성, 예측 및 분류
- 모델 검증
2) 타이타닉 생존자 예측 대회
- 목적, 평가 지표 결정: 대회에서 주어지므로 스킵
- 데이터 수집: 대회에서 주어지므로 스킵
- 데이터 탐색 및 가시화
- 탐색
- EDA - Exploratory Data Analysis (데이터 개요 파악)
- 결측치 확인
- 가시화(시각화)
- 목적 변수 Survived 관련 데이터 시각화: 열 간 상관관계 파악
- 탐색하고 싶은 열과 목적변수의 관계 결측치 제외해서 그래프 등으로 시각화해보기
- rate 등의 새로운 변수 만들어보기
- 위의 과정을 통해서 상관관계 해석해보기
- 카테고리 변수를 더미 변수화 하기 (one-hot encoding
- 상관 행렬 작성해보기 (correlation coefficient) + 시각화(heatmap) + 해석해보기
- 목적 변수 Survived 관련 데이터 시각화: 열 간 상관관계 파악
- 탐색
- 데이터 가공 및 전처리 + 특징 값 추출
- 전처리 과정 (상황에 따라 순서 바뀜):
- 학습 데이터 & 테스트 데이터 통합
- 전체 데이터의 결측치 수 확인
- 결측치 메우기
- 특징 값 추출 + 특징 값을 기준으로 데이터 탐색 + 해석 (Ex: Name 열의 Mr. Mrs. 등을 기준으로 호칭 열을 새로 만든 후 이를 기준으로 생존율 차이 탐색)
- 각 열 혹은 특징 값으로 만든 새로운 열의 결측치 메우기
- 새로운 변수 추가하기: 1. 두 열을 합침 2. 특징 값 추출 등
- 불필요한 변수 삭제: 1. 말 그대로 불필요함 2. 새로운 특징 값을 만들었음 3. 규칙성을 찾기 힘듦 4. 결측치가 많음 등
- 카테고리 변수 수치로 변환: 라벨 인코딩 (scikit-learn 라이브러리 활용)
- 전체 데이터를 학습 데이터와 테스트 데이터로 되돌리기
- 전처리 과정 (상황에 따라 순서 바뀜):
- 모델 작성, 예측 및 분류 + 모델 검증
- 검증 데이터 분리: 교차검증 사용함
- LightGBM용 데이터셋 작성
- 하이퍼파라미터 설정
- LightGBM 사용해서 모델 학습시키기
- 변수 별 중요도 조사
- 검증 데이터로 예측 정확도 확인
- 결과: 70프로 후반대
3) 주택 가격 예측
- 목적, 평가 지표 결정: 대회에서 주어지므로 스킵 (평가 지표: 평균 제곱 오차: Root Mean Squared Error, RMSE)
- 타이타닉은 이진 분류가 목적이었지만, 주택가격예측은 연속적인 값을 예측하는 회귀분석을 해야된다.
- 데이터 수집: 대회에서 주어지므로 스킵
- 벤치마크용 베이스라인 작성: 모델을 작성하려면 데이터 전처리 과정을 먼저 거치는 것이 일반적이지만 최소한의 카테고리 변수를 라벨 인코딩 처리한 후 LightGBM에 넣었을 때의 정확도를 베이스 라인으로 설정한 뒤 정확도를 높이는 것도 하나의 방법임
- 학습 데이터의 변수 유형 확인
- 학습 데이터와 테스트 데이터 결합해서 전처리
- 카테고리 변수 수치로 변환
- 결측치 수치로 변환
- 학습 데이터와 테스트 데이터로 분리
- 교차 검증으로 모델 학습 및 예측
- 현재 예측 값과 실제 값 차이 확인: plot 사용해서 시각화 -> 예측 값이 실제 값 경향을 어느정도는 따라가지만 실제 값이 어느정도 커지거나 작아지면 예측 값이 따라가지 못하는 것을 발견 -> 보완
- 상위 몇 개의 변수 중요도 확인
- 목적 변수 전처리
- 목적 변수 분포 확인
- 목적 변수 로그화 (평가 지표가 RMSE이기 때문)
- 분포 다시 확인
- 목적 변수 로그화한 후 예측 정확도 확인 (결과: 정확도 높아짐)
- 설명 변수 전처리 1차
- 전체 데이터 만들기 (학습 + 테스트)
- 결측치 확인
- 결측치가 높은 변수를 전처리할지 그냥 제외할지 검토
- 가능하다면 결측치가 많은 변수를 통합해서 새로운 변수로 만들기
- 이상치 제외
- 일단 각 설명 변수의 통계량 (describe()) 확인
- 통계량을 보고 이상치가 있어보이는 변수 처리
- 수치 데이터의 경우
- 비례 척도가 아닌 변수 제외
- 데이터가 0인 변수가 많은 변수 확인
- 특정 값만 가지는 변수 확인 (Ex: 욕실의 유무 - 0 / 1)
- 이상치가 있는 변수 확인
- 이상치를 찾는 방법은 여러 가지가 있음
- 여기서는 간단하게 sample mean +- 3std 를 기준으로 정함
- 이상치를 포함하는 변수 시각화해서 확인 -> 변수 값을 scatter plot으로 확인하면 일반적인 경향을 따라가지 않는 데이터가 있는데 이것들은 제외(삭제)
- 수치 데이터의 경우
- 6번과 7번의 내용을 적용해서 다시 예측 정확도 확인 (결과: 정확도 높아짐)
- 설명 변수 전처리 2차: 특징 값 생성
- 설명 변수들을 시간관련 데이터, 넓이관련 데이터, 설비 관련 데이터, 품질 및 분류 관련 데이터의 카테고리로 나눌 수 있음을 확인
- 설명 변수가 많으므로 위의 카테고리별로 특징값을 만들어서 정리
- 각 카테고리의 통계량을 확인해서 이상치가 있는지 확인
- 카테고리별로 가능하다면 새로운 특징 값을 만들어서 변수 정리
- 예측 다시 해서 정확도 확인 (결과: 정확도 높아짐)
- 하이퍼파라미터 튜닝
- 하이퍼파라미터 튜닝용 패키지 Optuna 사용
- 예측 다시 해서 정확도 확인 (결과: 정확도 높아짐)
- 하이퍼파라미튜 튜닝에 너무 큰 노력을 쏟진 말 것
- 앙상블 기법 사용: XGBoost + LightGBM (LightGBM만을 이용하기보단 여러 방법을 조합해서 사용하는 것이 정확도 상승에 도움)을 줄 수 있음
- 랜덤 포레스트 방법: 결정 트리 여러 개 조합
- 랜덤 포레스트는 LightGBM 같이 결측치를 그대로 취급할 수 없으므로 일단 중앙값으로 대체
- 예측 다시 해서 정확도 확인 (결과: LightGBM보다 정확도 낮음)
- XGBoost만 사용
- 예측 다시 해서 정확도 확인 (결과: LightGBM보다 정확도 높음)
- 앙상블 기법: XGBoost와 LightGBM 조합
- 0.5 * XGBoost + 0.5 * LightGBM 으로 예측 결과 평균 구하기
- 정확도 확인 (결과: 정확도 높아짐)
- 가중치(0.5)를 조합해서 더 높은 정확도를 만들 수 있음 (Ex: Random forest * 0.2 + 0.4 * XGBoost + 0.4 * LightGBM)
- 랜덤 포레스트 방법: 결정 트리 여러 개 조합
4) 앞으로의 계획
일단 흐름에 대한 파악을 어느정도 했으니 데이터 분석의 단계를 좀 더 깊게 파고드는 공부를 하면 될 것 같다
- 목적, 평가 지표 결정 & 데이터 수집: 대회에서 주어지므로 스킵
- 데이터 가공 및 전처리 & 데이터 탐색 및 가시화 & 특징 값 추출
- 파이썬 패키지랑 친숙해지기:
- 데이터 조작: pandas, numpy
- 데이터 시각화: matplotlib, seaborn
- 문법에 어느정도 익숙해져야 데이터를 조작할 때 수월할 것 같다.
- python이 오랜만이기도 하고 웹이나 앱 개발을 하며 썼던 언어와 패키지들(TypeScript, MERN stack)을 사용하는 느낌과 다른 느낌이라 익숙해지는데 연습이 좀 필요할 것 같다.
- 그냥 관련 공부를 계속 하다보면 자연스럽게 익숙해지긴 하겠지만 관련 책을 따로 하나 보던가 해서 좀 더 빠른 시일내에 익숙해지는 것이 낫겠다고 생각이 들었다.
- 특징 값을 추출하거나 결측치가 얼마나 많아야 열을 삭제하는건지 등 데이터를 가공하고 모델의 정확도를 높이기위한 데이터 조작을 하는 부분에 있어서는 많은 대회 예시들을 참고하며 감을 익히는 것이 맞다고 생각했다.
- 일단 타이타닉 대회와 주택 가격 예측 대회의 정확도를 높이기 위해서는 어떤 방법이 동원되는지 상위권 캐글러들의 노트북을 참고해서 공부해볼 생각이고
- 책 마지막에 초보자가 공부해보기 좋은 대회 및 노트북을 추천하고 있어서 이 대회들부터 뿌셔보기로 했다.
- Predict Future Sales Competition
- PUBG Finish Placement Prediction Competition
- IEEE-CIS Fraud Detection Competition
- 기타 (책에서 언급했지만 깊게 들어가진 않은 내용들중에 공부가 필요할 것 같은 내용들)
- random seed
- 파이썬 패키지랑 친숙해지기:
- 모델 작성, 예측 및 분류 + 모델 검증
- 라이브러리와 익숙해지기:
- 머신러닝 라이브러리: scikit-learn, LightGBM, XGBoost
- 기타 (책에서 언급했지만 깊게 들어가진 않은 내용들중에 공부가 필요할 것 같은 내용들)
- 결정 트리
- 랜덤 포레스트
- gradient boosting decision tree: LightGBM, XGBoost
- 과적합과 과소적합
- 검증데이터 분리 과정
- 홀드 아웃
- 교차 검증
- 잭나이프법
- 하이퍼파라미터 설정 (Optuna 활용)
- 라이브러리와 익숙해지기:
- 기타
- 머신러닝(딥러닝) 관련 기본기 공부를 실전 공부(?)와 함께 병행할 생각이다.
- 강의를 사서 보는 것을 평소에는 선호하지만 요즘은 책으로 공부하는 것이 좋기도 하고 ML GDE 이신 박해선 님의 ML/DL 공부 랜드맵이 괜찮을 것 같아서 'Doit! 정직하게 코딩하며 배우는 딥러닝 입문' 와 '핸즈 온 머신러닝' 을 다음 책으로 골랐다. 책으로 공부하고 싶은데 어떤 책을 봐야할지 모르겠는 분들은 아래 로드맵을 참고해도 좋을 것 같다.
- https://tensorflow.blog/book-roadmap/
어떤 책을 봐야 하나요?
가끔 어떤 책을 봐야할지 문의하시는 분들이 있습니다. 아래 내용을 보시면 조금 도움이 되리라 생각합니다. 당연히 제일 좋은 방법은 서점에 가서 직접 책을 펼쳐 보는 거죠! :) 혼자 공부하는
tensorflow.blog
위에 언급한 공부를 완수하는대로 찾아오도록 하겠습니다 :)
캐글을 위한 공부 말고도 학교 수강평 사이트를 개발 운영하는 등 사이드 프로젝트도 진행중이니 관련 글도 확인해보세요!