[Day 33] Kaggle - Titanic

임종우·2022년 11월 1일
0

ai_school_TIL

목록 보기
23/34

22.11.01.
kaggle에서 타이타닉 경진대회에 참여하는 법을 배우며, 드디어 캐글에 대해 알았다!
얼른 여러 모델들도 배우고, 공부도 해서 여러 데이터로 다양한 연습을 해보고 싶다.
그러려면 집중 좀 하자....!!!
그리고 오늘 음 또.. 의사결정나무에 대해 좀 더 자세히 배웠다. 지니 불순도와 정보 엔트로피에 대해 배웠는데, 어렵더라.
그리고 추가 과제 영상을 통해, matplotlib에 대해 이해도를 매우매우 높일 수 있었다. 진짜 짱이다 matplotlib!


캐글 시작하기

회원가입 및 전화번호 인증을 한 후,
캐글 타이타닉
에서 데이터를 다운로드 받았다.

  • train data, test data 그리고 gender_submission.csv파일이 존재한다. 해당 파일은 최종 결과물로 제출해야하는 양식을 알려주기 위해, 여자이면 생존, 남자이면 사망으로 임의적으로 예측해놓은 임시 결과물이다. 해당 파일의 Survived 컬럼에 예측값을 넣어 저장한 csv를 제출하면 된다.

EDA 및 전처리

  • 다운받은 데이터를 불러와 살펴본다. train set과 test set에 있는 feature에 대해서도 살펴본다. Survived가 test에는 없는 걸 알 수 있다. train 과 test 데이터의 크기도 비교해본다.
  • read_csv할때, index_col = 'column'으로 인덱스를 설정해줄 수 있다.
  • 데이터를 한번 살펴본다. 결측치도 있고, 데이터 타입도 숫자, 문자 등 다양하다. 전처리가 필요함을 확인한다.
  • 이번 실습에서는 일단 결측치를 모두 0으로 채운 후, 먼저 모델을 만들어 동작하게 한 후, 추후 결측치를 다른 값으로 채워보도록 한다. .fillna(0)으로 간단히 사용하였다.
  • 전처리에는 정규화, 이상치 제거 및 대체, 결측치 제거 및 대체, 인코딩 등이 있다.
  • 주의할 점, test set에서는 결측치를 제거하면 안된다. 인코딩의 경우 범주형 데이터를 수치화하는 것도, 범위가 큰 수치 데이터를 구간으로 나누는 것도 있다.
  • 전처리를 진행할 때에는 train 데이터에 진행한 전처리를 동일하게 test 데이터에도 진행해주어야 한다! 당연!

데이터 나누기

  • 학습 및 평가 데이터를 나누기 전에, 먼저 컬럼들의 dtype을 살펴본다. 머신러닝 모델의 경우 수치형 데이터만 이용할 수 있기 때문이다. 따라서 feature로는 수치형 데이터만 넣어준다. object 형 데이터 중 EDA 결과 중요한 피쳐가 있다면, 수치형 데이터로 인코딩하여 사용한다. bool 값의 경우 수치형으로 취급된다.
  • 모든 전처리나 데이터를 나누는 과정을 진행하며, 잘 진행되고 있는지 중간중간 변수 값을 확인해주는 것은 필수다! 나중에 오류를 발견하여 헤매지 않게!

의사결정나무 알고리즘

  • 지난번에 의사결정나무를 이용해 분류를 진행하는 알고리즘을 실습했었다. 이번에도 마찬가지로 같은 방식을 이용한다.
  • 다시 의사결정나무가 동작하는 방식을 이해해보자.
  • 의사결정나무는, 여러가지 규칙을 순차적으로 적용하면서 데이터를 분할하는 분류 모형이다.
  • 이때 규칙은, 특정 독립변수에 대해 어떠한 기준값보다 크다 혹은 작다와 같은 방식으로 구성된다. 해당 규칙에 따라 큰 자료들을 하나의 자식노드로, 작은 자료들을 하나의 자식 노드로 나누게 되는 것이다.
  • 그렇게 나누어 내려가다가, 한가지 클래스의 데이터만 존재하는 자식노드는 더 이상 나누지 않고 중지한다.
  • 그럼 이 분할 규칙은 어떻게 정하는가?
  • 바로, 정보이득을 최대로 하는 독립변수와 기준 값을 정한다. 정보이득은 간단히 이해하면 어떠한 조건에 대해 정보 엔트로피가 얼마나 감소하였는가를 나타낸 값이다. 정보 엔트로피가 가장 많이 감소하게 하는 분할 규칙을 찾아 자식노드를 나누게 된다.
  • 따라서, 의사결정나무 알고리즘에는 분할이 제대로 이루어졌는지를 평가하는 지표가 존재한다. 지니계수와 정보 엔트로피가 바로 그것이다.

criterion

  • 지니 불순도
    지니 불순도는, 집합에 이질적인 것이 얼마나 섞였는지를 측정하는 지표이다. 이는 어떤 집합에서 한 항목을 뽑아 무작위로 라벨을 추정할 때 틀릴 확률을 의미한다. 공식은 다음과 같다.

1에서 각 샘플의 확률의 제곱을 빼준 값이다.

집합에 있는 모든 항목이 동일하다면, 지니 불순도 혹은 지니 계수는 0이 되어 최상의 값이다. 반대로, 여러 항목이 균일하게 분포되어 있다면 최악의 값을 가지게 된다. 결정트리에서 분류규칙을 만족하는 샘플과 만족하지 않는 샘플이 같아 확률이 1/2씩이라면 지니 계수는 0.5로 최악의 값이다.

  • 엔트로피
    와 이거 어렵다! 섀넌 엔트로피라는 것이 무엇을 의미하는지는 명확하게 이해를 못하겠다.

다만, DecisionTreeClassifier의 entropy는 Shannon의 정보 이득의 엔트로피를 의미한다. 섀넌 엔트로피(혹은 정보 엔트로피)는, 각 데이터에 포함된 정보의 기댓값(평균)이다. 수식으로는 다음과 같이 표현한다. 밑이 2이다.

정보 엔트로피가 크다는 것은, 각 데이터에 포함된 정보의 기댓값이 크다는 것, 사건을 관측했을 때 더 많은 정보를 얻을 수 있다는 것이다. 이는 변수의 불확실성이 높다는 것이며, 결국 확률이 낮음을 의미한다.
이렇게 엔트로피가 불확실성이면서 동시에 평균 정보량을 의미한다는 것을 파악할 수 있다. 사건의 확률이 높으면 발생해도 많은 유용한 정보를 제공하지 않으나, 사건의 발생 확률이 희박하면 발생하였을 때 더 많은 정보를 제공한다. 주사위던지기와 동전던지기의 예시를 생각해보면 된다. 주사위던지기의 엔트로피가 동전던지기보다 크다. 확률이 작고, 정보량이 많다.

모든 사건의 발생 확률이 동일한 경우 비트의 개수는 섀넌 엔트포리와 동일하다. 따라서 분류 문제에서, 클래스의 개수가 2의 N승이라면 최대 엔트로피가 N으로 정해진다. 반면 하나의 사건이 확실하게 일어나는 경우라면 엔트로피는 0 이 된다.

따라서 이 역시, 데이터에 클래스들이 얼마나 섞여있는지에 대한 지표가 된다. 클래스가 하나만 존재한다면 엔트로피는 0으로 최소가 될 것이고, 여러 클래스가 같은 확률로 존재한다면 엔트로피는 N으로 최댓값이 될 것이다.

추가로, 파이썬에서 로그는 np.log2(N)과 같이 쓸 수 있다.

  • 엔트로피나 지니불순도가 0이 될 때는 보통 샘플이 [1, 0] 이나 [2,0] 처럼 샘플의 개수가 적을 때가 많은데 이렇게 너무 자세하게 학습하면 일반화 하기 어려워져 과적합이 발생할 수 있다. 그러면 아마 min_samples_leaf나 max_depth를 설정하여 조정해줄 수 있겠다!

  • 이외에도 logloss라는 것을 이용할 수 있는데, 이건 나중에 배울 듯! 오늘은 멀티클래스일 경우에는 분류를 특정 클래스의 확률 예측으로 진행할 수 있고, 이때 logloss를 사용한다고만 들었다.


matplotlib

Youtube 강의 혼란한 matplotlib에서 질서찾기 - 이제현

와 matplotlib이 무엇인지 이걸 보고 좀 이해가 되었다.
그리고 matplotlib을 잘 사용하는 법도!

matplotlib을 잘 사용하기 위해선, matplotlib 생태계 전체를 잘 활용해야 한다.
그리고 matplotlib 자체에서도 상태기반 방식이 아닌, 객체지향 방식을 사용해야 한다.

matplotlib 생태계 활용하기

matplotlib은 numpy 기반이다.
그리고 matplotlib을 기반으로 하는 다양한 라이브러리, seaborn, Geopandas, NetworkX, scikit-learn 등이 존재한다.
이 생태계를 잘 활용해야 한다. 결국 생태계 내 어떤 라이브러리이든, matplotlib 객체를 반환한다는 것을 명심하자!

  • 시각화 진행 전, 스타일 설정이 편한 seaborn을 활용해 matplotlib 객체의 스타일 설정을 잘 해준다.

  • matplotlib으로 화면 구성을 설정한다.

  • 그 후, 생태계 내의 다양한 라이브러리를 사용해 그래프에 사용할 데이터를 얹어준다.!!!!!
    이게 핵심이다. 예를 들어, violin plot을 그릴거라면, seaborn으로 간단히 violin plot을 그려준다. 지도를 그릴거라면 Geopandas를 사용한다.

  • 그 후, 결국 반환된 것은 Matplotlib 객체이므로, matplotlib의 객체지향 방식을 사용해 요소 하나하나를 건드려가며 더 설득력있고, 눈에 잘 들어오는 시각화를 진행하면 된다.

객체 지향 방식

  • matplotlib의 사용 방식으로는 상태기반 방식과 객체 지향 방식이 있다. 는 것 까지만 알고 있었는데... 오늘 좀 느낌이 왔다!
  • 상태기반방식은, 그림을 그리는 순서대로 코드를 작성하여 진행하는 방식이다. plt.~~를 사용하여 코드를 진행하는 것이 상태기반 방식을 활용하는 것이라고 생각하면 된다.
  • 반면 객체지향방식은, 대상을 지정한 후에 그 대상을 그리는 방식이라고 생각하면 된다. 예를 들어 fig, ax, plot, label, legend, suptitle, line(선), collections(면) 등 다양한 객체를 지정하여 직접 접근하고, 각각의 속성을 바꾸어줄 수 있다.
  • 객체.set을 통해 특정 속성을 제어할 수 있다.

객체지향방식은 상태기반방식의 명확한 한계를 극복한다. 요소 하나하나에 직접 접근하여 세부적인 시각화를 진행할 수 있다. 순서대로 진행하기 때문에 여러 반복되는 코드를 작성해야 했던 상태기반 방식과는 달리 여러 객체에 접근하기 위해 반복문을 사용할 수도 있다.

ax.add_artist()를 통해 다양한 보조 도형 역시 추가할 수 있다!

일단 이 정도만 이해 했다. 자세한 사용법도 공부해보면 어느정도 수준까지는 금방 할 수 있지 않을까 싶다! matplotlib으로 이 정도 수준의 시각화를 해낼 수 있다는 것도 놀라웠고, 객체 지향 방식으로 matplotlib을 사용하는 법을 알게 되어 좋았다.
나중에 좀 자세한 시각화를 진행할 일이 있으면, 이 방법을 시도해봐도 좋겠다!


해당 내용은 멋쟁이사자처럼 AI School 오늘코드 박조은 강사님의 자료를 인용하였습니다.
의사결정나무
정보이득


더 공부해볼 것

  • 판다스에서 categorical 변수 다루는 법을 좀 찾아봐야겠다. cat 접근자랑!
  • 어우 시간이 왜이렇게 오래걸렸지ㅠㅠ 집중하는 법은 어디 없나!
profile
ai school 기간 동안의 TIL!

0개의 댓글