기계 학습 - 결정 트리

결정 트리 (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% 확신할 수 있는 답변을 제공할 수 없기 때문입니다. 가능성에 기반하여 답변이 달라질 수 있습니다.