본문 바로가기
코알라UNIV

9주차 타이타닉에서는 누가 살아남았을까?

by 인듯아닌듯 2019. 12. 22.

기말고사가 모두 끝나고 오랜만에 보게된 팀원들 얼굴은 각양각색이였다. 시험이 다 끝나서 기쁜 얼굴도 있고,이제 막 끝나서 회복이 필요한 얼굴과 아직 끝나지않아 당장이라도 쓰러질것 같은 얼굴도 있었다.

 

데이터사이언스에 해당하는 7~12주차에서 7주차와 8주차내용을 되짚어보면, 7주차에는 엑셀을 이용해서 머신러닝 개념을 배워보았고, 8주차는 JuptyerNotebook에 대한 기본적인 사용방법과 데이터를 다양한 형태로 시각화하는 방법까지 배워보았다.

이번 9주차에는 7주차에 배운 머신러닝의 개념을 8주차에 익힌 JupterNotebook에서 해보는 것이다. 결과가 나오는 실제 러신머닝은 지금부터 시작이라고 할 수 있다.

 

9주차에서 가장 중요하다고 생각하는 부분은 Feature Engineering이라고 생각한다.

7주차에서 모임을 가졌을 때, 우리가 가장 고민하고 이야기를 많이 나눴던 부분은 '가중치를 어떻게 줄 것 인가??'  이였었는데, 실제로 싸이킷런을 사용해보니 그런부분은 우리가 정하지 않아도 되는 부분이였다. 우리는 머신러닝 모델만 잘 정하면 되는 것이였다.(물론 모델의 원리를 알수록 더 좋은 모델을 빠르고 확실하게 찾을 수 있다!!)

 

그래서 앞으로 코알라에서 배우는 데이터사이언스에서 우리가 해야할 일은 두가지로 정리할 수 있을 것 같다.

1. Feature Enginnering으로 데이터를 가공하고, 컴퓨터가 읽을 수 있는 숫자데이터로 만들어 주는 것

2. 파이썬의 라이브러리 싸이킷런의 다양한 예측모델을 배우고, 어떤 모델을 써야 더 좋은 결과를 얻을 수 있을지 판단하는 것


이번주차 내용을 가볍게 정리해보면,

stage1에서는 if문을 이용해서 decisionTree가 어떤 것인지에 대해 배워보았고,

stage2에서는 7주차에서 Excel로하던 FeatureEngineering을 JupyterNotebook으로 해보았다.

Excel의 '필터' 기능을 통해 알아보던 Data의 정보를 JupyterNotebook에서는

빈칸의 갯수 - .isnull().sum()

종류의 갯수 - .value_counts()

stage3에서는 싸이킷런 라이브러리를 사용해서 머신러닝을 진행

tree=decisionTreeclassfier()

tree. fit(x_train,y_train)

할 수 있는 것 .score  ,  .predict

stage4에서는 심화된 Feature Engineering을 해보았다.

1. facet 그래프를 통해 생존과죽음에 비슷한 영향을 보이는 나이대를 구분지어 나눌 수 있었다. 따라서 처음에 10대 20대 30대 ... 로  나누었던 나이분류를 비슷한 경향을 보이는 나이대를 기준으로 세워 묶을 수 있었다.

2. 나이의 빈칸이 있는 부분을 전체 평균값으로 넣지 않고 , 합리적인 근거를 가진 그룹의 평균값으로 넣을 수 있었다.

이름을 Mr. Mrs. Miss. 그외 나머지. 이렇게 4가지로 그룹짓고, 각 그룹에서의 평균값을 계산한 후, 나이의 빈칸이 있는 데이터의 이름이 어느 그룹에 들어가는지 확인하여 그룹의 나이평균값으로 빈칸을 채워주었다.

(객체를 만들어서 mapping 하는 것은 string을 수로 표현하는 대표적인 FeatureEngineering 방식)

3. 데이터를 train 과 valid로 나누는 방법 / 데이터를 나누는 이유는 다양한 모델을 비교하고 싶을때 train데이터로 여러 모델을 만든 뒤, 각 모델에 valid data를 넣어서 정확도나 속도를 값을 내어 비교할 수 있기때문이다.

 

 

DecisionTreeClassifier의 모델 시각화

 

출처:코알라유니브  (문제시자삭하겠습니다)

일반적으로 우리들은 판단을 할때, 다중 선택지중 하나를 선택후 나머지는 배제하는 '판단'을 한다 = 오른쪽 그림

하지만 그렇게 판단을 하면 질문의 순서에 따라 판단 결과가 달라질 수 있다. 위 오른쪽그림은 특수하게 아다리가 잘 맞아 떨어진 그림이지 일반적으로는 그렇지않다.

DecisonTreeClassifier모델은 왼쪽 그림처럼 양쪽모두 yes와 no가 존재할 수 있음 알아야한다.

출처:https://gdpresent.blog.me/221717260869

위 그림은 DecisonTreeClassifier가 depth(깊이)에 따라 질문의 층수이 늘어나는 모습을 볼 수 있다. 결국 끝까지 나눈다고하면 depth=9일때 학습 데이터에 한해서 완벽히 분류해낼 수 있다.

싸이킷런을 했을 때, 학습데이터 조차도 .score 값이 1이 안나오는 경우가 있는데, 이는 아마도 트리의 모든 leaf node에서 분류할 것이 있을때, depth+=1 하는 것이고, 어떤 하나의 leaf node에서라도 전부 분류가 되어 질문을 하지않아도 된다면 그때 분류를 그만두기 때문이라고 추측된다..이런 leaf를 pure node라고한다.