MachineLearning - Decision Tree 타이타닉 생존자 예측하기 Part2
Part2
목표 : Decision Tree를 위한 데이터 전처리 및 Decision Tree 알고리즘 구현
데이터 출처 : www.kaggle.com/c/titanic/data
Titanic: Machine Learning from Disaster
Start here! Predict survival on the Titanic and get familiar with ML basics
www.kaggle.com
ipynb 파일 : github.com/sangHa0411/DataScience/blob/main/Titanic_Prediction_Part1.ipynb
sangHa0411/DataScience
Contribute to sangHa0411/DataScience development by creating an account on GitHub.
github.com
Part1 에서 말씀드린 대로 상관계수에 근거하여서 생존여부와 비교적 상관이 없는 것들은 삭제합니다.
여기서 데이터 전처리가 필요한데 Fare는 연속적인 변수이므로 이를 구간으로 나누어서 이산적인 변수로 변경해줍니다.
차례대로 Fare의 최댓값 최소값을 파악해서 이를 5구간으로 나누고 0 ~ 4 값으로 Mapping 합니다.
그리고 Sex 및 Embarked 또한 정수로 값을 변경합니다.
아래는 변경 이후에 데이터 구조입니다.
그리고 Decision Tree의 알고리즘을 구현하기 위해서는 Target 데이터 즉 Survived가 맨 마지막에 위치해야 합니다.
데이터에서 Survived 속성을 뺴고 뒤에 다시 붙여줌으로써 Column의 속성을 조정합니다. 그리고 Pandas DataFrame 구조에서 array로 데이터 구조를 변경합니다.
기존 데이터에서 Training Data , Validataion Data를 8 : 2 로 분할합니다.
이로써 Decision Tree위한 데이터 전처리 및 분할을 마쳤습니다. 이제 본 묙표인 Decision Tree의 알고리즘 원리를 파악해보곘습니다.
알고리즘의 원리를 앞서 말씀드리기 전에 제가 강조하고 싶은 것은 매번 Decision Tree를 사용하고자 할 때 앞으로 할 알고리즘을 매번 구현할 필요가 없다는 것입니다. 이는 그저 원리를 알아보기 위함일 뿐이고 실전에서는 Scikit learn의 함수를 이용하면됩니다.
이는 Part3에서 다루도록 하겠습니다.
1. 먼저 집합에서의 복잡도 = 엔트로피를 계산하는 함수가 필요합니다.
위 함수를 이해하기 쉽게 표현한 것이 아래 그림입니다. Data의 마지막은 target data 즉 label입니다. 이를 하나하나 조사하면서 label의 클래스와 이에 대한 갯수를 파악합니다.
타이타닉 데이터를 예시로 설명하자면 생존 성공 및 실패가 클래스가 됩니다.
그리고 이를 데이터 전체 갯수로 나누어서 각 label 클래스의 확률을 구하고 이를 이용해서 해당 데이터의 복잡도 = 엔트로피를 구합니다.
그리고 해당 데이터에서 특정 속성의 특정 값을 만족하면 이를 모아서 서브 데이터를 반환하는 함수를 만든다. 여기서 주의해야 할 점은 데이터를 분할하고 서브 데이터에 저장할 때 사용된 속성은 제외하고 저장한다는 것입니다.
위 두개의 함수를 이용해서 인자로 받은 데이터 중에서 "어떠한 속성으로 분할 이후에 엔트로피가 가장 줄어드는가?" 를 파악하고 해당 속성의 해당 값으로 데이터를 분할합니다.
앞서 말씀 드린 것과 같이 해당 속성으로 데이터를 분할 했을 때 엔트로피가 가장 많이 감소하는 속성을 파악하고 해당 속성으로 데이터를 분할합니다. 먼저 기존 데이터의 엔트로리플 구하고 그 이후에 해당 속성의 가능한 모든 값을 데이터에 있는 값들을 통해서 파악합니다.
그러면 속성과 속성의 값들을 파악이 가능하니 해당 서브 데이터를 구할 수 있습니다. 그러니 모든 서브 데이터들을 구하고 각 서브 데이터들의 엔트로피를 합해서 기존 데이터의 엔트로피와 비교합니다. 분할한 이후에 엔트로피가 가장 많이 감소한 속성이 결정이 됩니다.
앞서 말씀드린 대로 데이터를 분할 하면 분할 할수록 survived를 제외한 데이터의 속성이 줄어듭니다. 그러다가 속성이 없어서 더 이상 분할할 수가 없을 때 해당 데이터의 label 클래스와 해당 클래스의 갯수를 파악해서 가장 많은 갯수의 클래스를 반환합니다.
최종적으로 Decision Tree 만듭니다.
데이터를 분할하고 난 이후 서브 데이터가 생기는데 서브 데이터의 구조는 기존의 데이터와 같으니 제귀적 구조인 것을 확인할 수 있습니다.
Decision Trees 는 python dictionary 구조로 구현이 되는데 key 는 속성이고 value 는 서브 데이터가 됩니다.
위에서 만든 Decision Tree를 이용해서 앞서 분할한 Validation data로 성능을 측정해보겠습니다.
아래에서의 classify 함수는 위에 적혀진 github주소로 가시면 확인하실수 있습니다.
전체 정확도는 77% 정도입니다.
좀 더 정확하게 보면 True Positive Rate가 51% , 즉 실제 생존한 사람들 중에서 절반 가량을 예측에 성공했다는 뜻입니다.
False Positive Rate는 31%인데 생존에 실패했는데도 Decision Tree가 생존에 성공했다고 잘못 예측한 확률이 30%라는 뜻입니다.
Decision Tree 알고리즘 원리 참고자료 :www.yes24.com/Product/Goods/9046762
머신러닝 인 액션
최고의 한 수를 위한 데이터 마이닝!개발자를 위한 지침서. 기계 학습 소개, 다양한 예제로 기계 학습 실습하기, 매일 발생되는 데이터 분석하기, 어프라이어리와 에이다부스트 같은 전형적인 ��
www.yes24.com