기계 학습 - 결정 트리


결정 트리 (Decision Tree)

이 장에서는 '결정 트리'를 만드는 방법을 보여드리겠습니다. 결정 트리는 이전 경험을 바탕으로 결정을 내리는 데 도움이 되는 프로세스 그래프입니다.

이 예시에서는 한 사람이 코미디 프로그램에 참가해야 하는지를 결정하려고 시도합니다.

우리의 예시 인물은 마을에서 코미디 프로그램이 열릴 때마다 등록되고, 코미디 배우에 대한 정보를 등록하고, 그/그녀가 간 적이 있는지도 기록합니다.

연령 경험 Rank Nationality Go
36 10 9 UK NO
42 12 4 USA NO
23 4 6 N NO
52 4 4 USA NO
43 21 8 USA YES
44 14 5 UK NO
66 3 7 N YES
35 14 9 UK YES
52 13 7 N YES
35 5 9 N YES
24 3 5 USA NO
18 3 7 UK YES
45 9 9 UK YES

이 데이터 셋을 기반으로 Python이 의사결정 트리를 생성할 수 있습니다. 이 의사결정 트리는 새로운 공연에 참석할 가치가 있는지 결정하는 데 사용될 수 있습니다.

작동 방식

먼저 필요한 모듈을 임포트하고 pandas를 사용하여 데이터 셋을 읽습니다:

예제

데이터 셋을 읽고 출력합니다:

import pandas
from sklearn import tree
import pydotplus
from sklearn.tree import DecisionTreeClassifier
import matplotlib.pyplot as plt
import matplotlib.image as pltimg
df = pandas.read_csv("shows.csv")
print(df)

실제 예제 실행

의사결정 트리를 만들기 위해 모든 데이터가 숫자여야 합니다.

비숫자 열 'Nationality'와 'Go'를 숫자로 변환해야 합니다.

Pandas는 map() 이 메서드는 값을 변환하는 방법에 대한 정보가 포함된 딕셔너리를 받아들이는 메서드입니다.

{'UK': 0, 'USA': 1, 'N': 2}

값 'UK'을 0으로, 'USA'를 1로, 'N'을 2로 변환합니다.

예제

문자 값을 숫자로 변경합니다:

d = {'UK': 0, 'USA': 1, 'N': 2}
df['Nationality'] = df['Nationality'].map(d)
d = {'YES': 1, 'NO': 0}
df['Go'] = df['Go'].map(d)
print(df)

실제 예제 실행

그런 다음, 특징 열과 목표 열을 분리해야 합니다.

특징 열은 우리가 예측하려는 열이며, 목표 열은 우리가 예측하려는 값이 있는 열입니다.

예제

X는 특징 열이고, y는 목표 열입니다:

features = ['Age', 'Experience', 'Rank', 'Nationality']
X = df[features]
y = df['Go']
print(X)
print(y)

실제 예제 실행

지금, 우리는 실제 의사결정 트리를 생성할 수 있으며, 그것을 우리의 세부 사항에 맞게 조정하고 컴퓨터에 .png 파일로 저장할 수 있습니다:

예제

결정 트리를 생성하고 이미지로 저장한 후 이미지를 표시합니다:

dtree = DecisionTreeClassifier()
dtree = dtree.fit(X, y)
data = tree.export_graphviz(dtree, out_file=None, feature_names=features)
graph = pydotplus.graph_from_dot_data(data)
graph.write_png('mydecisiontree.png')
img=pltimg.imread('mydecisiontree.png')
imgplot = plt.imshow(img)
plt.show()

실제 예제 실행

결과 설명

결정 트리는 이전 결정을 사용하여 코미디 연기자를 볼 가능성을 계산합니다.

결정 트리의 다른 면을 읽어보겠습니다:


Rank

Rank <= 6.5 6.5점 이하의 등급을 가진 코미디 연기자는 그에 따라 합니다. True 화살표(왼쪽 방향), 나머지는 그에 따라 합니다. False 화살표(오른쪽 방향).

gini = 0.497 이는 분할의 질을 나타내며, 항상 0.0에서 0.5 사이의 숫자입니다. 0.0은 모든 샘플이 동일한 결과를 얻었음을 의미하며, 0.5는 분할이 완전히 중간에서 이루어졌음을 의미합니다.

samples = 13 이 결정의 이점에서는 여전히 13명의 코미디 연기자가 남아 있습니다. 이는 첫 번째 단계이기 때문에 모두가 코미디 연기자입니다.

value = [6, 7] 이 13명의 코미디 연기자 중 6명은 "NO"를 받고, 7명은 "GO"를 받을 것입니다.

Gini

샘플을 분할하는 방법은 많습니다. 이 튜토리얼에서는 GINI 방법을 사용합니다.

Gini 방법은 다음 공식을 사용합니다:

Gini = 1 - (x/n)2 - (y/n)2

x는 확정적인 답변의 수("GO")이며, n은 샘플 수, y는 부정적인 답변의 수("NO")입니다. 다음 공식을 사용하여 계산합니다:

1 - (7 / 13)2 - (6 / 13)2 = 0.497


다음 단계에는 두 개의 상자가 포함되어 있으며, 하나는 'Rank'이 6.5점 이하인 코미디 연기자를 위한 상자이고, 나머지는 하나의 상자입니다.

True - 여기서 5명의 코미디 연기자가 끝납니다:

gini = 0.0 모든 샘플이 동일한 결과를 얻었습니다.

samples = 5 이 분기에는 여전히 5명의 코미디 연기자가 남아 있습니다(5명의 등급은 6.5점 이하의 코미디 연기자입니다).

value = [5, 0] 5 명은 "NO"를 받고, 0 명은 "GO"를 받을 것입니다.

False - 여덟 명의 연극 배우가 계속됩니다:

Nationality(국적)

Nationality <= 0.5 국적 값이 0.5 이하의 코미디 배우는 왼쪽 화살표를 따르고, 나머지는 오른쪽 화살표를 따릅니다(이는 영국에서 온 모든 사람을 의미합니다).

gini = 0.219 약 22%의 샘플이 한 방향으로 이동할 것입니다.

samples = 8 이 기능에는 여덟 명의 코미디 배우가 남아 있습니다(7.5 이상의 등급을 가진 여덟 명의 코미디 배우).

value = [1, 7] 이 여덟 코미디 배우 중 한 명은 "NO"를 받고, 일곱 명은 "GO"를 받을 것입니다.


True - 네 명의 연극 배우가 계속됩니다:

Age(연령)

Age <= 35.5 35.5 세 이하의 연령을 가진 코미디 배우는 왼쪽 화살표를 따르고, 나머지는 오른쪽 화살표를 따릅니다.

gini = 0.375 약 37.5%의 샘플이 한 방향으로 이동할 것입니다.

samples = 4 이 기능에는 네 명의 코미디 배우가 남아 있습니다(영국에서 온 네 명의 코미디 배우).

value = [1, 3] 이 네 코미디 배우 중 한 명은 "NO"를 받고, 세 명은 "GO"를 받을 것입니다.

False - 네 명의 코미디 배우가 여기까지 끝:

gini = 0.0 모든 샘플이 동일한 결과를 얻습니다.

samples = 4 이 기능에는 네 명의 코미디 배우가 남아 있습니다(영국에서 온 네 명의 코미디 배우).

value = [0, 4] 이 네 코미디 배우 중 0 명은 "NO"를 받고, 4 명은 "GO"를 받을 것입니다.


True - 2 명의 코미디 배우가 여기서 끝:

gini = 0.0 모든 샘플이 동일한 결과를 얻습니다.

samples = 2 이 기능에는 2 명의 코미디 배우가 남아 있습니다(35.5 세 또는 그 이하의 연령을 가진 2 명의 코미디 배우).

value = [0, 2] 이 두 코미디 배우 중 0 명은 "NO"를 받고, 2 명은 "GO"를 받을 것입니다.

False - 2 명의 연극 배우가 계속됩니다:

Experience(경험)

Experience <= 9.5 9.5 년 이상의 경험을 가진 코미디 배우는 왼쪽 방향의 화살표를 따르고, 나머지는 오른쪽 방향의 화살표를 따릅니다.

gini = 0.5 50%의 샘플이 한 방향으로 이동할 것입니다.

samples = 2 이 기능에는 2 명의 코미디 배우가 남아 있습니다(35.5 세 이상의 연령을 가진 2 명의 코미디 배우).

value = [1, 1] 이 두 코미디 배우 중 1 명은 "NO"를 받고, 1 명은 "GO"를 받을 것입니다.


True - 1 명 코미디 배우가 여기서 끝:

gini = 0.0 모든 샘플이 동일한 결과를 얻습니다.

samples = 1 이 분기에는 1명의 농담 배우가 남아 있습니다. 9.5년 이하의 경험을 가진 농담 배우 1명.

value = [0, 1] 0은 "NO"을, 1은 "GO"를 나타냅니다.

False - 농담 배우 1명까지:

gini = 0.0 모든 샘플이 동일한 결과를 얻습니다.

samples = 1 이 분기에는 1명의 농담 배우가 남아 있습니다. 중간 경험을 가진 농담 배우 1명.

value = [1, 0] 1은 "NO"을, 0은 "GO"를 나타냅니다.

예측 값

새 값을 예측하기 위해 결정 트리를 사용할 수 있습니다.

예를 들어: 40세의 미국 농담 배우가 10년의 경험을 가진 농담 등급이 7인 프로그램을 볼지 여부를 알아야 합니까?

예제

사용 방법: predict() 새 값을 예측하는 방법:

print(dtree.predict([[40, 10, 7, 1]]))

실제 예제 실행

예제

농담 등급이 6이면 답변은 무엇인가요?

print(dtree.predict([[40, 10, 6, 1]]))

실제 예제 실행

다른 결과

충분히 많이 실행되면, 입력 데이터가 동일하더라도 결정 트리가 다른 결과를 제공할 수 있습니다.

이는 결정 트리가 100% 확신할 수 있는 답변을 제공할 수 없기 때문입니다. 가능성에 기반하여 답변이 달라질 수 있습니다.