본문 바로가기
ML/ML-Kaggle, 데이콘

의사결정나무

by lucian 2021. 9. 28.

(의사결정나무 복습)

의사결정나무란 의사결정 규칙들이 트리 구조로 도식화된 것이다. 일종의 스무고개라고도 할 수 있다.

 

의사결정나무는 두가지 데이터 유형으로 나뉘는데, 범주형의 데이터인 경우 분류나무(Classification Tree), 연속형 데이터인 경우 회귀나무(Regressiong Tree)로 나뉜다.

보통 범주형 데이터의 경우에 의사결정나무를 사용한다. 회귀모델의 경우 정확도가 낮기 떄문이다.

 

 

  • 구성요소
    • 뿌리노드 - 최초로 시작되는 노드(전체 데이터가 포함되어 있다)
    • 부모노드 - 자식노드의 상위 노드
    • 자식노드 - 부모노드에서 분류된 노드
    • 중간노드 - 부모, 자식노드가 있는 노드
    • 최종노드 - 자식 노드가 없는 노드
    • 가지 - 뿌리노드로부터 끝노드까지 연결된 노드들
    • 깊이 - 중간노드들의 수
  • 모형 구축
    • 의사결정 트리를 생성한다.
    • 잘못된 가능성을 가진 가지를 제거한다 : 가지치기
    • 평가
    • 해석 및 예측
  • 의사 결정 트리의 분리 기준
    • 카이제곱 통계량
    • p-value
    • 지니 지수
    • 엔트로피 지수

출처 :  https://github.com/pyohamen/Im-Being-Data-Scientist/wiki/what-is-decision-tree%3F

 

csv 데이터 안에는 각 행 안에 특징(feature)값들이 여러개가 있다. 이 특징값 중 하나의 특징값(ex. 날개 유무 특징값)을 선택하여 위의 그래프 처럼 날개가 있는지 없는지 판단해서 분류한다. 그 후 다른 특징값(ex. 날수 있는지 없는지 유무)으로 날 수 있는지 없는지를 분류하여 결과를 찾아가는 방식으로 진행된다.

 

물론 분류를 할 때 위의 처럼 이진분류기가 아닌 3진, 4진 분류기로도 나눌 수 있는데 그건 의사결정나무의 종류마다 다르다. 현재 이 그래프는 CART 의사결정나무이다.

 

지니는 CART의사결정나무, 엔트로피에는 C4.5의사결정나무를 이용한다.

분류기준의 대표인 지니지수와 엔트로피 지수는 불순도를 수치화한 지표라고 한다.

 

 

 

지니 지수와 엔트로피는 아래의 주소에서 잘 정리되어 있었다.

https://lucy-the-marketer.kr/ko/growth/decision-tree-and-impurity/

 

분류(Classification) – 의사결정 나무(Decision Tree) 2편 | 마케터 루시씨 블로그

 

lucy-the-marketer.kr

 

 


from sklearn.tree import DecisionTreeClassifier
from sklearn.tree import DecisionTreeRegressor

# scikit learn 라이브러리 안에 있는 의사결정나무 함수를 불러왔다.
classifier_model = DecisionTreeClassifier()
regressor_model = DecisionTreeRegressor()


# 데이터 다운로드 링크로 데이터를 코랩에 불러옵니다.
!wget 'https://bit.ly/3gLj0Q6'
import zipfile
with zipfile.ZipFile('3gLj0Q6', 'r') as existing_zip:
    existing_zip.extractall('data')
    
    
# 다운받은 데이터를 pandas의 df으로 불러와줬다.
train = pd.read_csv('data/train.csv') 
test = pd.read_csv('data/test.csv')


# 불러온 데이터에 결측치가 있는지 확인한다.
train.info()
train.shape
train.head(10)


# 결측치를 제거해야만 정확한 회귀가 가능하다.
# test에는 결측치에 0을 넣어줄 것이다. = 왜냐면 나중에 submission파일에 넣을 때 사라진 행이 없어야 하므로.
test= test.fillna(0)
train =train.dropna()


# null값이 잘 제거되었는지 확인해보자
print(train.isnull().sum())


# 이제 불러온 모델을 학습시켜야 한다!
# X에는 독립변수를 Y에는 종속변수를 넣어줘야한다. 
# 즉 X에는 분류 학습에 필요한 특징값들을 Y에는 결과값이 된다.
# X와 Y를 분류시켜줬다. 만약 두개의 열을 drop시키고 싶다면 ['컬럼명1', '컬럼명2']로 대괄호를 써주면 된다.
# axis=1은 이 train이란 dataframe에서 'count'란 이름의 열을 버린다는 뜻이다. (행이 아닌 열)

X_train=train.drop('count',axis=1)
Y_train=train['count'] # 버린 count가 Y값이므로 Y_train이란 변수에 넣어준다.(안넣어줘도 됨)

model.fit(X_train,Y_train) #이제 정말로 훈련시키는 함수인 fit을 불러와 인자로 X와 Y를 넣어주자!


# 훈련시킨 모델이 얼마나 잘 훈련햇는지 테스트를 해보자.
# 여기서 test df에는 label인 'count'열이 없음을 인지해야한다.
# 만약 test 내에 'count'열이 있다면 그것을 drop()함수로 제거하고 predict함수안에 넣어줘야 오류를 방지할 수 있다.
pred = model.predict(test)


# 예측이 완료되었다면 kaggle이나 데이콘에 제출할 csv파일을 만들어야한다.
# 데이콘에서 제공하는 아무것도 없는 submission.csv파일을 불러와서 우리가 예측한 값을 넣어준다.
# 그 후 to_csv('이름.csv', index=False or True)함수로 csv파일을 만든다.
submission = pd.read_csv('data/submission.csv')
submission['count']=pred
submission.to_csv('sub.csv',index=False)

 

댓글