이전  Decision Tree를 정리하면서 분명 수식으로 계산된 값은 틀린것이 없는데 model 학습된 tree와 일치하지 않는 것이 있습니다. 결론은 데이타를 One-Hot-Encoding해야 하는 군요.. Label Encoding을 한것이 문제였습니다.

Encoding의 필요성은  문제를 다시 정리 해보죠..

필요성을 느끼니 또 Encoding에 대해서 공부를 해야 겠군요..이건 나중에..

 

 1. 해결하고자 하는 문제

데이타는 아래 표와 같고, Entropy 방식으로 풀어 나가면 오른쪽 Tree와 같습니다.  Tree의 노드가 날씨부터 시작합니다.

 

위의 표를 데이타로 활용하면.. 아래와 같은 에러가 발생합니다.

{
"name": "ValueError",
"message": "could not convert string to float: '맑음'",

.....

}

 

2. Label Encoding으로 전처리 후 Decision Tree 작성의 문제

데이타를 변환해야 합니다. 날씨 컬럼의 맑음, 흐림, 비의 값을 0, 1,2 로 변환합니다. 온도, 습도, 바람 컬럼의 문자열을 적당한 숫자로 변환합니다.

 

입력 데이타는 아래 표와 같이 만듦니다. Decision Tree를 만들었더니, Tree의 노드가 습도부터 시작합니다.

손으로 풀어간 1)의 Tree는 날씨부터 시작하는데, 아래 트리는 습도부터 시작합니다. 맘에 안듭니다.

 

3. One-Hot Encoding으로 전처리 후 Decision Tree 작성

1)에서 사용된 데이타를 판다스의 get_dummies()함수를 이용하여 전처리를 합니다.사용된 코드는 아래와 같습니다.

 

import pandas as pd

df = pd.read_excel('tennis2.xlsx')
data = df.iloc[:,0:4]
target = df.iloc[:,4]
 
#one-hot Encoding
df_enc_one_hot = pd.get_dummies(data)
df_enc_one_hot

 

전처리된 데이타는 아래 표와 같습니다. 날씨컬럼이 날씨_맑음, 날씨_비,날씨_흐림으로 생성이 됩니다. 이 데이타로 Decision Tree를 만들었더니 날씨로 시작하는 것을 볼 수 있습니다.

 

첨부 사용된 코드와 데이타

데이타와 코드를 공유 합니다.

tennis2.xlsx
0.32MB
decision.ipynb
0.41MB

+ Recent posts