핵심 키워드
- #결정 트리 #불순도 #정보 이득 #가지치기 #특성 중요도
- 결정 트리 알고리즘을 사용해 새로운 분류 문제를 다루어보고 결정 트리가 머신러닝 문제를 어떻게 해결하는지 이해하자
로지스틱 회귀로 와인 분류하기
- 레드 와인과 화이트 와인
레드 와인과 화이트 와인 표시가 누락되었을 때, 캔에 인쇄된 알코올 도수, 당도, PH 값으로 와인 종류를 구별할 수 있을까 - 데이터 준비하기
와인 데이터 셋을 판다스 데이터프레임으로 읽어옴
alcohol, sugar, pH, class 중에서 네 번째 열인 class는 타깃값으로 0이면 레드 와인, 1이면 화이트 와인
그러므로 레드 와인과 화이트 와인을 구분하는 이진 분류 문제이고, 화이트 와인이 양성 클래스
판다스 데이터프레임의 유용한 메소드 2개는 info() 메소드와 descibe() 메소드
info() 메소드는 데이터프레임의 각 열의 데이터 타입과 누락된 데이터가 있는지 확인하는데 유용
info()의 결과를 보면 총 6497개의 샘플이 있고 4개의 열은 모두 실숫값이며 Non-Null Count가 모두 6497이므로 누락 값 없음
descibe() 메소드는 열에 대한 간략한 통계를 출력해주므로 최소, 최대, 평균값 등을 볼 수 있어 유용
descibe()의 결과를 보면 평균, 표준편차, 최소, 1사분위수, 중간값(2차분위수), 3사분위수, 최대값을 볼 수 있음
또한 descibe() 메소드의 결과를 보게 되면 알코올 도수와 당도, pH 값의 스케일이 다르다는 것을 알 수 있으므로
사이킷런의 StandardScaler 클래스를 사용해 특성을 표준화해주어야 함을 알 수 있음
이를 위해 판다스 데이터프레임을 넘파이 배열로 바꾸고 처음 3개의 열을 넘파이 배열로 바꿔서 data 배열에 저장하고
마지막 class 열을 넘파이 배열로 바꿔서 target 배열에 저장
그리고 훈련 세트와 테스트 세트로 나누고 StandardScaler 클래스를 사용해 훈련 세트를 전처리
- 로지스틱 회귀
표준점수로 변환된 train_scaled와 test_scaled를 사용해 로지스틱 회귀 모델을 훈련
훈련 세트와 세트르 세트의 점수가 모두 낮으니 모델이 다소 과소적합된 것을 알 수 있음
또한 로지스틱 회귀가 학습한 계수와 절편을 출력해보면 이 모델은 알코올 도수 값에 0.51270274를 곱하고,
당도에 1.6733911을 곱하고, pH 값에 -0.68767781을 곱한 다음 모두 더한 후 1.81777902를 더함
이 값이 0보다 크면 화이트 와인, 작으면 레드 와인이므로
알코올 도수와 당도가 높을수록 화이트 와인일 가능성이 높고, pH가 높을수록 레드 와인일 가능성이 높은 것 같음
하지만 이를 이해하기 쉽지 않으므로 순서도와 같이 쉬운 방법으로 설명할 수 있는 모델이 필요함
결정 트리
- 결정 트리
결정 트리 모델은 스무고개와 같아서 질문을 하나씩 던져서 정답과 맞춰나감
데이터를 잘 나눌 수 있는 질문을 찾는다면 계속 질문을 추가해서 분류 정확도를 높일 수 있음
사이킷런이 결정 트리 알고리즘인 DecisionTreeClassfier 클래스를 제공하므로
이를 이용해 fit() 메소드를 호출해서 모델을 훈련한 다음 score() 메소드로 정확도를 평가
훈련 세트에 대한 점수가 엄청 높고 테스트 세트의 성능은 그에 비해 조금 낮으므로 과대적합된 모델이라고 볼 수 있음
이 모델을 그림으로 표현하기 위해서는 plot_tree() 함수를 사용해 결정 트리를 이해하기 쉬운 트리 그림으로 출력
결정 트리의 맨 위의 노드를 루트 노드라고 부르고 맨 아래 끝에 달린 노드를 리프 노드라고 함
- 결정 트리 분석
너무 복잡하니 plot_tree() 함수에서 트리의 깊이를 제한하여 출력하기 위해
max_depth 매개변수를 1로 주면 루트 노드를 제외하고 하나의 노드를 더 확장해 그리게 되며
filled 매개변수를 이용해 클래스에 맞게 노드의 색을 칠하며 어떤 클래스의 비율이 높아지면 점점 진한 색으로 표시할 수 있음
feature_names 매개변수에는 특성의 이름을 전달할 수 있음
루트 노드는 당도가 -0.239 이하인지 질문을 하므로
만약 어떤 샘플의 당도가 -0.239와 같거나 작으면 왼쪽 가지로 가게 되고 그렇지 않으면 오른쪽 가지로 이동하게 됨
루트 노드의 총 샘플 수는 5187개이며, value 값을 보면 이 중에서 음성 클래스는 1258개이고, 양성 클래스는 3939개임
왼쪽 노드는 당도가 더 낮은지 물어보므로
당도가 -0.802와 같거나 낮다면 다시 왼쪽 가지로, 그렇지 않으면 오른쪽 가지로 이동하게 됨
이 노드에서 음성 클래스와 양성 클래스의 샘플 개수는 각각 1177개와 1745개
오른쪽 노드는 음성 클래스가 81개, 양성 클래스가 2194개이므로 대부분의 화이트 와인 샘플이 이 노드로 이동했음을 알 수 있음
이를 통해 결정 트리의 예측 방법은 리프 노드에서 가장 많은 클래스가 예측 클래스가 됨을 알 수 있음
- 지니 불순도
위의 결정 트리에서 gini는 지니 불순도를 의미하고 DecisionTreeClassifier 클래스의 criterion 매개변수의 기본값은 gini
criterion 매개변수의 용도는 노드에서 데이터를 분할한 기준을 정하는 것임
지니 불순도는 클래스의 비율을 제곱해서 더한 다음 1에서 빼면 됨
루트 노드의 지니 불순도는 총 5198개의 샘플이 있고 그 중 1258개가 음성 클래스, 3939개가 양성 클래스이므로 0.367
왼쪽 노드의 지니 불순도는 0.481, 오른쪽 노드의 지니 불순도는 0.069
만약 노드에 두 클래스의 비율이 정확히 1/2씩이라면 지니 불순도는 가장 크므로 가장 불순하므로 0.5가 되어 최악
만약 노드에 하나의 클래스만 있다면 지니 불순도는 0이 되어 가장 작으며 이런 노드를 순수 노드라고 함
결정 트리 모델은 부모 노드와 자식 노드의 불순도 차이가 가능한 크도록 트리를 성장시키므로
부모 노드와 자식 노드의 불순도 차이를 계산하기 위해서는
자식 노드의 불순도를 샘플 개수에 비례하여 모두 더한 후 부모 노드의 불순도에서 빼면 0.066이 됨
이런 부모와 자식 노드 사이의 불순도 차이를 정보 이득이라고 부르며
결정 트리 알고리즘은 정보 이득이 최대가 되도록 데이터를 나누게 되며 이때 지니 불순도를 기준으로 사용함
노드를 순수하게 나눌수록 정보 이득이 커지며 새로운 샘플에 대해 예측할 때에는 노드의 질문에 따라 트리를 이동
그리고 마지막에 도달한 노드의 클래스 비율을 보고 예측을 만들게 됨
그런데 앞의 트리는 제한 없이 자라났기 때문에 훈련 세트보다는 테스트 세트에서 점수가 크게 낮은 과대적합이었음
+) 지니 불순도 이외에도 DecisionTreeClassifer 클래스에서는 criterion='entropy'를 지정하여 엔트로피 불순도를 사용
- 가지치기
제한하지 않으면 리프 노드가 순수노드가 될 때까지 분할하여 과대적합이 되므로 가지치기를 통해 과대 적합을 막아야 함
가지치기를 하는 가장 간단한 방법은 자라날 수 있는 트리의 최대 깊이를 정하는 것이므로
max_depth 매개변수를 3으로 지정하여 모델을 만들면 루트 노드 아래의 최대 3개의 노드까지만 성장
깊이 3에 있는 노드가 최종 노드인 리프 노드이며
왼쪽에서 세 번째에 있는 노드만 음성 클래스가 더 많으므로 이 노드에 도착해야만 레드 와인으로 예측하게 됨
루트 노드부터 이 노드까지 도달하려면 당도는 -0.239보다 작고 또 -0.802보다 커야하고 알코올 도수는 0.454보다 작아야 함
즉, 당도가 -0.802보다 크고 -0.239보다 작은 와인 중에서 알코올 도수가 0.454와 같거나 작은 것이 레드와인
- 스케일 조정하지 않은 특성 사용하기
앞에서 -0.802라는 음수로 된 당도는 뭔가 이상함을 느끼게 됨
즉, 특성값의 스케일은 결정 트리 알고리즘은 선형 함수를 훈련하는 함수가 아니므로 아무런 영향을 끼치지 못하는 것임
따라서 표준화 전처리를 할 필요가 없음
그러므로 앞에서는 전처리한 세트로 훈련을 했었으므로
이번에는 전처리하기 전의 훈련 세트와 테스트 세트로 결정 트리 모델을 다시 훈련하면 결과가 정확히 같이 나옴을 알 수 있음
결과를 보면 같은 트리지만, 특성값을 표준 점수로 바꾸지 않았기 때문에 이해하기가 훨씬 쉬움
즉, 당도가 1.625보다 크고 4.325보다 작은 와인 중에서 알코올 도수가 11.025와 같거나 작은 것이 레드와인
그 외에는 모두 화이트 와인으로 예측하게 됨
마지막으로 결정 트리는 어떤 특성이 가장 유용한지 나타내는 특성 중요도를 계산하여 feature_importances_ 속성에 저장함
이를 보면 루트 노드와 깊이 1에서 당도를 사용했기 때문에 당도가 가장 유용한 특성 중 하나로 나타나게 됨
특성 중요도를 활용하면 결정 트리 모델을 특성 선택에 활용할 수 있음
+) 확인 문제
- 사이킷런의 결정 트리 클래스가 제공하는 매개변수 중 min_imputiry_decrease를 사용해 가지치리를 해보자
이 매개변수의 값을 0.0005로 지정하고 결정 트리를 만들어보고 좌우가 균일하지 않은지, 테스트 세트의 성능은 어떤지 평가 - 이는 어떤 노드의 정보 이득 X (노드의 샘플 수) / (전체 샘플 수) 값이 이 매개변수보다 작으면 더 이상 분할하지 않음
'ML > 혼자 공부하는 머신러닝 + 딥러닝' 카테고리의 다른 글
[혼공머신] 05. 트리 알고리즘 - 트리의 앙상블 (0) | 2022.06.01 |
---|---|
[혼공머신] 05. 트리 알고리즘 - 교차 검증과 그리드 서치 (0) | 2022.06.01 |
[혼공머신] 04. 다양한 분류 알고리즘 - 확률적 경사 하강법 (0) | 2022.05.24 |
[혼공머신] 04. 다양한 분류 알고리즘 - 로지스틱 회귀 (0) | 2022.05.24 |
[혼공머신] 03. 회귀 알고리즘과 모델 규제 - 특성 공학과 규제 (0) | 2022.05.17 |