카테고리 없음

캐글 도전기 (1) - 6/23 ~ 7/1

dongsunseng 2023. 7. 4. 17:53

캐글에 도전하겠다고 마음을 먹었지만 공부를 어디서부터 얼마나 해야 될지 굉장히 막막했다. 그동안 다른 개발공부를 해오며 터득한 해결 방법은 무작정 비싸고 양이 많은 책이나 강의를 결제하기 보다는 쉬운 책 하나를 일단 정독하는 것이 방향성을 잡는데에 큰 도움을 준다는 것이었다. 캐글에 입문하며 본 첫 책은 '쉽게 시작하는 캐글 데이터 분석' 이었고 캐글 대회의 흐름을 맛본다는 소기의 목적은 달성한 것 같다. 

 

책을 읽으며 간단한 데이터 분석에 대한 설명과 함께 캐글 대회의 공식 튜토리얼 대회인 타이타닉 대회와 주택 가격 예측 대회를 직접 해보며 데이터 분석의 흐름을 느낄 수 있었다. 이에 대한 내용을 공유하고자 한다

1) 데이터 분석

  • 데이터 분석은 데이터 혹은 해당 일의 범위에 따라 그 목적도 다양함 - 예측, 분류, 수리 최적화, 시뮬레이션, ...
  • 예측 과제에서 일반적으로 데이터를 분석하는 흐름:
    1. 목적, 평가 지표 결정
    2. 데이터 수집
    3. 데이터 가공 및 전처리
    4. 데이터 탐색 및 가시화
    5. 특징 값 추출
    6. 모델 작성, 예측 및 분류
    7. 모델 검증

2) 타이타닉 생존자 예측 대회

  1. 목적, 평가 지표 결정: 대회에서 주어지므로 스킵
  2. 데이터 수집: 대회에서 주어지므로 스킵
  3. 데이터 탐색 및 가시화
    • 탐색
      • EDA - Exploratory Data Analysis (데이터 개요 파악)
      • 결측치 확인
    • 가시화(시각화)
      • 목적 변수 Survived 관련 데이터 시각화: 열 간 상관관계 파악
        • 탐색하고 싶은 열과 목적변수의 관계 결측치 제외해서 그래프 등으로 시각화해보기
        • rate 등의 새로운 변수 만들어보기
        • 위의 과정을 통해서 상관관계 해석해보기
        • 카테고리 변수를 더미 변수화 하기 (one-hot encoding
        • 상관 행렬 작성해보기 (correlation coefficient) + 시각화(heatmap) + 해석해보기
  4. 데이터 가공 및 전처리 + 특징 값 추출
    • 전처리 과정 (상황에 따라 순서 바뀜):
      1. 학습 데이터 & 테스트 데이터 통합
      2. 전체 데이터의 결측치 수 확인
      3. 결측치 메우기
      4. 특징 값 추출 + 특징 값을 기준으로 데이터 탐색 + 해석 (Ex: Name 열의 Mr. Mrs. 등을 기준으로 호칭 열을 새로 만든 후 이를 기준으로 생존율 차이 탐색)
      5. 각 열 혹은 특징 값으로 만든 새로운 열의 결측치 메우기 
      6. 새로운 변수 추가하기: 1. 두 열을 합침 2. 특징 값 추출 등
      7. 불필요한 변수 삭제: 1. 말 그대로 불필요함 2. 새로운 특징 값을 만들었음 3. 규칙성을 찾기 힘듦 4. 결측치가 많음 등
      8. 카테고리 변수 수치로 변환: 라벨 인코딩 (scikit-learn 라이브러리 활용)
      9. 전체 데이터를 학습 데이터와 테스트 데이터로 되돌리기
  5. 모델 작성, 예측 및 분류 + 모델 검증
    1. 검증 데이터 분리: 교차검증 사용함
    2. LightGBM용 데이터셋 작성
    3. 하이퍼파라미터 설정
    4. LightGBM 사용해서 모델 학습시키기
    5. 변수 별 중요도 조사
    6. 검증 데이터로 예측 정확도 확인
  6. 결과: 70프로 후반대

3) 주택 가격 예측

  1. 목적, 평가 지표 결정: 대회에서 주어지므로 스킵 (평가 지표: 평균 제곱 오차: Root Mean Squared Error, RMSE)
    • 타이타닉은 이진 분류가 목적이었지만, 주택가격예측은 연속적인 값을 예측하는 회귀분석을 해야된다.
  2. 데이터 수집: 대회에서 주어지므로 스킵
  3. 벤치마크용 베이스라인 작성: 모델을 작성하려면 데이터 전처리 과정을 먼저 거치는 것이 일반적이지만 최소한의 카테고리 변수를 라벨 인코딩 처리한 후 LightGBM에 넣었을 때의 정확도를 베이스 라인으로 설정한 뒤 정확도를 높이는 것도 하나의 방법임
    1. 학습 데이터의 변수 유형 확인
    2. 학습 데이터와 테스트 데이터 결합해서 전처리
      • 카테고리 변수 수치로 변환
      • 결측치 수치로 변환
    3. 학습 데이터와 테스트 데이터로 분리
    4. 교차 검증으로 모델 학습 및 예측
    5. 현재 예측 값과 실제 값 차이 확인: plot 사용해서 시각화 -> 예측 값이 실제 값 경향을 어느정도는 따라가지만 실제 값이 어느정도 커지거나 작아지면 예측 값이 따라가지 못하는 것을 발견 -> 보완
  4. 상위 몇 개의 변수 중요도 확인
  5. 목적 변수 전처리
    1. 목적 변수 분포 확인
    2. 목적 변수 로그화 (평가 지표가 RMSE이기 때문)
    3. 분포 다시 확인
    4. 목적 변수 로그화한 후 예측 정확도 확인 (결과: 정확도 높아짐)
  6. 설명 변수 전처리 1차
    1. 전체 데이터 만들기 (학습 + 테스트)
    2. 결측치 확인
    3. 결측치가 높은 변수를 전처리할지 그냥 제외할지 검토
    4. 가능하다면 결측치가 많은 변수를 통합해서 새로운 변수로 만들기
  7. 이상치 제외
    1. 일단 각 설명 변수의 통계량 (describe()) 확인
    2. 통계량을 보고 이상치가 있어보이는 변수 처리
      1. 수치 데이터의 경우
        1. 비례 척도가 아닌 변수 제외
        2. 데이터가 0인 변수가 많은 변수 확인
        3. 특정 값만 가지는 변수 확인 (Ex: 욕실의 유무 - 0 / 1)
        4. 이상치가 있는 변수 확인
          • 이상치를 찾는 방법은 여러 가지가 있음
          • 여기서는 간단하게 sample mean +- 3std 를 기준으로 정함
        5. 이상치를 포함하는 변수 시각화해서 확인 -> 변수 값을 scatter plot으로 확인하면 일반적인 경향을 따라가지 않는 데이터가 있는데 이것들은 제외(삭제)
  8. 6번과 7번의 내용을 적용해서 다시 예측 정확도 확인 (결과: 정확도 높아짐)
  9. 설명 변수 전처리 2차: 특징 값 생성
    1. 설명 변수들을 시간관련 데이터, 넓이관련 데이터, 설비 관련 데이터, 품질 및 분류 관련 데이터의 카테고리로 나눌 수 있음을 확인
    2. 설명 변수가 많으므로 위의 카테고리별로 특징값을 만들어서 정리
    3. 각 카테고리의 통계량을 확인해서 이상치가 있는지 확인
    4. 카테고리별로 가능하다면 새로운 특징 값을 만들어서 변수 정리
    5. 예측 다시 해서 정확도 확인 (결과: 정확도 높아짐)
  10. 하이퍼파라미터 튜닝
    1. 하이퍼파라미터 튜닝용 패키지 Optuna 사용
    2. 예측 다시 해서 정확도 확인 (결과: 정확도 높아짐)
    3. 하이퍼파라미튜 튜닝에 너무 큰 노력을 쏟진 말 것
  11. 앙상블 기법 사용: XGBoost + LightGBM (LightGBM만을 이용하기보단 여러 방법을 조합해서 사용하는 것이 정확도 상승에 도움)을 줄 수 있음
    1. 랜덤 포레스트 방법: 결정 트리 여러 개 조합
      1. 랜덤 포레스트는 LightGBM 같이 결측치를 그대로 취급할 수 없으므로 일단 중앙값으로 대체
      2. 예측 다시 해서 정확도 확인 (결과: LightGBM보다 정확도 낮음)
    2.  XGBoost만 사용
      1. 예측 다시 해서 정확도 확인 (결과: LightGBM보다 정확도 높음)
    3. 앙상블 기법: XGBoost와 LightGBM 조합
      1. 0.5 * XGBoost + 0.5 * LightGBM 으로 예측 결과 평균 구하기
      2. 정확도 확인 (결과: 정확도 높아짐)
      3. 가중치(0.5)를 조합해서 더 높은 정확도를 만들 수 있음 (Ex: Random forest * 0.2 + 0.4 * XGBoost + 0.4 * LightGBM)

4) 앞으로의 계획

일단 흐름에 대한 파악을 어느정도 했으니 데이터 분석의 단계를 좀 더 깊게 파고드는 공부를 하면 될 것 같다

  • 목적, 평가 지표 결정 & 데이터 수집: 대회에서 주어지므로 스킵
  • 데이터 가공 및 전처리 & 데이터 탐색 및 가시화 & 특징 값 추출
    • 파이썬 패키지랑 친숙해지기:  
      • 데이터 조작: pandas, numpy
      • 데이터 시각화: matplotlib, seaborn
      • 문법에 어느정도 익숙해져야 데이터를 조작할 때 수월할 것 같다.
      • python이 오랜만이기도 하고 웹이나 앱 개발을 하며 썼던 언어와 패키지들(TypeScript, MERN stack)을 사용하는 느낌과 다른 느낌이라 익숙해지는데 연습이 좀 필요할 것 같다.
        • 그냥 관련 공부를 계속 하다보면 자연스럽게 익숙해지긴 하겠지만 관련 책을 따로 하나 보던가 해서 좀 더 빠른 시일내에 익숙해지는 것이 낫겠다고 생각이 들었다.
    • 특징 값을 추출하거나 결측치가 얼마나 많아야 열을 삭제하는건지 등 데이터를 가공하고 모델의 정확도를 높이기위한 데이터 조작을 하는 부분에 있어서는 많은 대회 예시들을 참고하며 감을 익히는 것이 맞다고 생각했다.
      1. 일단 타이타닉 대회와 주택 가격 예측 대회의 정확도를 높이기 위해서는 어떤 방법이 동원되는지 상위권 캐글러들의 노트북을 참고해서 공부해볼 생각이고
      2. 책 마지막에 초보자가 공부해보기 좋은 대회 및 노트북을 추천하고 있어서 이 대회들부터 뿌셔보기로 했다. 
        1. Predict Future Sales Competition
        2. PUBG Finish Placement Prediction Competition
        3. 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

위에 언급한 공부를 완수하는대로 찾아오도록 하겠습니다 :)

캐글을 위한 공부 말고도 학교 수강평 사이트를 개발 운영하는 등 사이드 프로젝트도 진행중이니 관련 글도 확인해보세요!

2023.07.02 - [분류 전체보기] - 학교 수강평 사이트 개발 및 운영을 하며 (1)