본문 바로가기

배우기/복습노트[Python과 분석]

[복습] Python | 분석 | 의사결정나무(Decision Tree) (2)

728x90
반응형

https://metime.tistory.com/310

 

[복습] Python | 분석 | 의사결정나무(Decision Tree) (1)+ 하루끝(20240124)

의사결정나무(Decision Tree, DT)는 트리기반 분류모델 중 하나이다. 잠시 분류모델에 대하여 정리해보자. 분류모델 - tree: DT, RF, GBT, XGB, LightGBM(트리기반 모델로서 각광받고 있음). GBT까지는 old하고

metime.tistory.com

 

전 시간에 이어서 DT를 계속 알아보자.

 

트리 길이를 줄이기 위한 목적? 트리의 길이를 제한하는 이유는 무엇일까. 바로 과대적합을 방지하기 위해서이다.

트리가 계속 분류하려고 학습하다보면 우연한 규칙을 발견하게된다. 이러한 우연한 규칙은 일반화 시킬 수 없다. 즉 일반화 할 수 없는 오류를 범하게 된다. 가지고 있는 데이터에만 집중을 하게 되면 남에게 갖지 않는 특징을 분류규칙으로 갖게 되기 때문이다. 따라서 트리 길이는 적당한 길이에서 정지 규칙을 가져야 한다.

 

정지규칙을 만드는 여러 규칙이 있다.

max_depth(최대 허용 길이 제한), min_samples_split(예를 들어 오분류 데이터가 7이면, 한번 더 추가 분류를 요청하는, 또는 방지하는 오분류데이터 기준에 제한을 두는 파라미터. 즉 최소 가지치기 기준이 클수록 오분류가 많음에도 불구하고 더 이상 분류하지 않아 트리는 단순해질수밖에 없음), max_features(임의성 정도)가 있다. 임의성 정도는 DT보다는 Random Forest에서 조절하며, 이 임의성 정도가 작을 수록 서로 독립적인 트리가 구성될 가능성이 높다. 

 

 

 

cancer data를 가지고 직접 테스트해보자.

 

 

1. 먼저 ID 컬럼을 index 처리한다(분석에는 필요 없는 컬럼이므로).

 

 

 

2. 독립변수 / 종속변수 데이터를 분리

 

 

 

3. train / test split

train_x, test_x, train_y, test_y = train_test_split(cancer_x, cancer_y, random_state = 0)

 

위의 random_state = 0은 R에서 set.seed = 0과 같은 것으로 train_x, test_x, train_y, test_y 를 일정하게 추출하고자 할 때 seed 값을 고정하는 것이다.

 

 

 

4. 모델링(전처리가 되어 있다는 가정 및 라벨인코딩이 되어있다는 가정 하에 진행)

 

 

 

5. 모델 평가

train data로 모델 score를 보니 100 점이 나왔다.

과대 적합 되었을 가능성이 있겠다.

 

 

728x90

 

 

6. 모델 튜닝

1) min_samples_split 튜닝

 

 

min_samples_split은 6~7 정도가 가장 적절한 것으로 나타났다.

 

위 분석 모델은 min_samples_split = 7 로 학습하고 test에 적용하도록 하겠다.

 

 

 

 

7. 최종평가

 

 

나머지 변수들도 튜닝할 가치가 있다면 튜닝하는 것이 좋다. 요구하는 매개변수들이 트리의 깊이를 조절하는 매개변수이기 때문에 세 개를 다 튜닝할 필요는 없다. 특히 임의성 정도는 DT에서는 크게 의미가 없기 때문에 RF에 가서 테스트 할 법하다.

 

 

8. Decision Tree 시각화

Decision Tree를 시각화 하기 위해서는 graphviz를 설치하여야 한다. 설치 방법은 아래 링크를 참고하면 되겠다.

https://metime.tistory.com/317

 

[Python] 의사결정나무(Decision Tree) 시각화 하기

1. graphviz 설치(window용) 1) 사이트 접속 https://graphviz.gitlab.io/_pages/Download/Download_windows.html 위 사이트에 접속한다. 2) 최신버전의 window용6 64bit 설치파일 다운 3) 설치파일 실행 [다음]으로 계속 넘어가

metime.tistory.com

 

 

 

 

9. 예측 결과(test data set)

분석기사에서는 실제로 예측해서 제출해야 할 데이터를 test data set으로 제공하지만

현재는 데이터가 없으므로 전체 데이터셋을 예측하기로 한다.

각 관측치의 예측값이 리턴된다.

 

 

각 관측치의 클래스별 확률(class 값의 오름차순 순서대로 컬럼을 배치), 첫 번째 컬럼이 Benign, 두 번째 컬럼이 Malignant

 

 

Malignant인 확률을 제출하라고 하면 아래와 같이 제출하면 되겠다.

df_result = Series(m_dt.predict_proba(cancer_x)[:,1], index = cancer_x.index).reset_index()

 

 

df_result는 아래와 같은 형태로 저장된다.

 

 

반응형

 

 

 

그런데 이 모든 과정을 진행하기 전 가장 먼저 해야 할 것은 각각의 설명 변수들과 종속변수와의 상관관계를 통계적으로 확인하는 것이다.

종속변수(2-class factor)와 설명변수와의 상관관계이므로 T-TEST를 수행하여야 한다.

우선 x변수 하나를 가지고 확인해보자(radius_mean).

 

1) diagnosis(종속변수)와 radius_mean 변수와의 상관관계

statistic은 T통계량이고, p_value는 p-value 이다.

p-value가 0.025보다 작아서 영가설은 기각된다. 두 집단의 유의미하게 평균의 차이가 발생하느냐, 즉 양성일 때와 악성일 때의 radius_mean의 수치값의 평균이 서로 일치하느냐 유의미하게 다르냐를 평가해야해서 T-TEST를 수행한 것이다. radius_mean에 의해 유의마한 차가 없다(영가설), 차이가 없으면 변수가 쓸모가 없다는 것이며, 영가설을 기각하게 되면 변수가 쓸모가 있다는 것이다. 그러면 전체 설명변수에 대하여 statistic과 p-value를 구하여보겠다.

 

2) 모든 설명변수와의 p-value 추출

 

# 함수 생성

 

# 전체 적용

t통계량은 다음과 같다.

 

 

p-value는 다음과 같다.

대부분의 변수들이 양성/악성 분류에 어느정도 영향력을 준다는 것을 확인할 수 있다. 

p-value의 크기가 변수의 중요도를 측정하지는 못한다.

또한 제거를 고려하는 변수들이 다시 추가되기도 한다. 일변량 테스트를 해서 변수의 상관관계를 고려하여 1차적으로 변수를 제거 및 선택하며, 제거 변수 중에서 유의미한 변수를 추가할 수도 있다. 적정성을 전문가와 논의 후 추가 변수를 고려할 수도 있겠다.

728x90
반응형