1. 모델링 및 평가하기
모델링에 앞서 이번에도 데이터를 훈련셋과 시험셋으로 나누어보겠습니다.
from sklearn.model_selection import train_test_split # 임포트
X_train, X_test, y_train, y_test = train_test_split(data.drop('class', axis=1),
data['class'], test_size = 0.4, random_state = 100) # 훈련셋/시험셋 분리
이번에는 데이터가 비교적 크기 때문에 test_size를 0.4로 높여서 나누었습니다. 결정 트리 모델은 사이킷런의 tree에서 불러올 수 있는데, 분석 목적에 따라 연속형 변수를 위한 DecisionTreeRegressor와 범주형 변수를 위한 DecisionTreeClassifier로 나뉩니다.
여기서는 0과 1을 예측해야 하므로 DecisionTreeClassifier를 사용하겠습니다.
from sklearn.tree import DecisionTreeClassifier # 임포트
모델링 및 예측 방법은 이전과 같습니다.
model = DecisionTreeClassifier() # 모델 객체 생성
model.fit(X_train, y_train) # 학습
pred = model.predict(X_test) # 예측
X_train과 y_train으로 학습해, X_test에 대한 예측값을 만들었습니다. 그럼 이 예측값에 대한 정확도를 보겠습니다.
from sklearn.metrics import accuracy_score # 임포트
accuracy_score(y_test, pred) # 정확도 계산
0.8134309259354047
약 81%의 예측률을 보여줍니다. 그럼 이제 결정 트리가 어떤 원리로 작동되는지 살펴보고, 이를 기반으로 매개변수를 튜닝해 더 나은 예측값을 얻을 수 있는지 보겠습니다.
2. 이해하기 : 결정 트리
결정 트리는 특정 변수에 대한 특정 기준값으로 데이터를 계속 분류해가면서 유사한 그룹으로 묶어내어 예측값을 만드는 알고리즘입니다. 예를 들어 다음과 같은 데이터가 있다고 가정해봅시다.
사과인지 귤인지를 예측하는 모델을 만든다면, “지름이 5보다 큰가? 혹은 작은가?”라는 질문 하나로 이 둘을 명확하게 구분해낼 수 있을 겁니다. 트리 모델은 이런 식으로 특정 기준으로 계속 분류해나가는데, 실제 데이터에서는 이보다 훨씬 많은 독립변수가 있고, 대부분은 종속변수를 완전하게 분류해낼 수 있는 값은 없기 때문에, 수많은 분류의 분류를 거듭하게 됩니다.
이번에는 조금 더 복잡한 데이터로 예를 들겠습니다.
이 데이터에서 사과와 복숭아를 구분하는 모델을 고려해봅시다. 우선 지름과 무게 모두 중첩되는 부분이 있기 때문에 아까처럼 손쉽게 둘을 구분하는 기준점은 찾기 어렵습니다만, 몇 번의 분류 작업을 거치면 이 또한 잘 구분해낼 수 있습니다.
위의 그림과 같이 지름 7을 기준으로 2개의 그룹으로 나누면 “사과 2, 복숭아 1”, “사과 1, 복숭아2”처럼 뒤섞여 있습니다. 이를 다시 무게를 기준으로 나누면 사과와 복숭아를 완전히 분리해낼 수 있습니다.
이와 같은 원리 때문에 좋은 모델을 만들려면 첫 번째 분류에 사용할 변수 선정과 기준점 정하%LS