기계 학습 - 의사 결정 트리
의사결정나무
이 장에서는 "의사결정 트리"를 만드는 방법을 보여줍니다. 의사 결정 트리는 순서도이며 이전 경험을 기반으로 의사 결정을 내리는 데 도움이 될 수 있습니다.
예에서 사람은 코미디 쇼에 가야 할지 말아야 할지 결정하려고 할 것입니다.
운 좋게도 우리 예시 사람은 마을에서 코미디 쇼가 있을 때마다 등록하고 코미디언에 대한 정보를 등록했으며 그가 갔는지 여부도 등록했습니다.
나이 | 경험 | 계급 | 국적 | 가다 |
36 | 10 | 9 | 영국 | 아니요 |
42 | 12 | 4 | 미국 | 아니요 |
23 | 4 | 6 | N | 아니요 |
52 | 4 | 4 | 미국 | 아니요 |
43 | 21 | 8 | 미국 | 네 |
44 | 14 | 5 | 영국 | 아니요 |
66 | 삼 | 7 | N | 네 |
35 | 14 | 9 | 영국 | 네 |
52 | 13 | 7 | N | 네 |
35 | 5 | 9 | N | 네 |
24 | 삼 | 5 | 미국 | 아니요 |
18 | 삼 | 7 | 영국 | 네 |
45 | 9 | 9 | 영국 | 네 |
이제 이 데이터 세트를 기반으로 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 <= 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 = 1 - (x/n)2 - (y/n)2
여기서 x
는 긍정적인 답변의 수("GO"),
n
는 샘플의 수,
y
는 부정적인 답변의 수("NO")로 다음 계산을 제공합니다.
1 - (7 / 13)2 - (6 / 13)2 = 0.497
다음 단계에는 '순위'가 6.5 이하인 코미디언을 위한 상자와 나머지 상자가 하나씩 두 개의 상자가 있습니다.
True - 5명의 코미디언이 여기서 끝납니다.
gini = 0.0
모든 샘플이 동일한 결과를 얻었음을 의미합니다.
samples = 5
는 이 분기에 5명의 코미디언이 남아 있음을 의미합니다(랭크 6.5 이하의 코미디언 5명).
value = [5, 0]
5는 "NO"를, 0은 "GO"를 얻음을 의미합니다.
거짓 - 8명의 코미디언 계속:
국적
Nationality <= 0.5
즉, 국적 값이 0.5 미만인 코미디언은 왼쪽 화살표를 따르고(영국에서 온 모든 사람을 의미) 나머지는 오른쪽 화살표를 따릅니다.
gini = 0.219
이는 샘플의 약 22%가 한 방향으로 간다는 것을 의미합니다.
samples = 8
는 이 분기에 8명의 코미디언이 남아 있음을 의미합니다(순위가 6.5 이상인 코미디언 8명).
value = [1, 7]
8명의 코미디언 중 1명은 "NO", 7명은 "GO"를 받습니다.
True - 4명의 코미디언 계속:
나이
Age <= 35.5
는 35.5세 이하의 개그맨들은 왼쪽 화살표를 따르고 나머지는 오른쪽 화살표를 따라간다는 의미입니다.
gini = 0.375
이는 샘플의 약 37.5%가 한 방향으로 간다는 것을 의미합니다.
samples = 4
는 이 지점에 4명의 코미디언이 남아 있음을 의미합니다(영국에서 온 4명의 코미디언).
value = [1, 3]
이 4명의 코미디언 중 1명은 "NO"를, 3명은 "GO"를 받습니다.
거짓 - 4명의 코미디언이 여기서 끝납니다.
gini = 0.0
모든 샘플이 동일한 결과를 얻었음을 의미합니다.
samples = 4
는 이 지점에 4명의 코미디언이 남아 있음을 의미합니다(영국 출신이 아닌 4명의 코미디언).
value = [0, 4]
4명의 코미디언 중 0명은 "NO", 4명은 "GO"를 받습니다.
True - 2명의 코미디언이 여기서 끝납니다.
gini = 0.0
모든 샘플이 동일한 결과를 얻었음을 의미합니다.
samples = 2
는 이 지점에 2명의 코미디언이 남아 있음을 의미합니다(35.5세 이하의 코미디언 2명).
value = [0, 2]
이 2명의 코미디언 중 0은 "NO"를, 2는 "GO"를 얻는다는 것을 의미합니다.
False - 2명의 코미디언 계속:
경험
Experience <= 9.5
경력 9.5년 이하의 개그맨들은 왼쪽 화살표, 나머지는 오른쪽 화살표를 따라간다는 뜻이다.
gini = 0.5
샘플의 50%가 한 방향으로 간다는 것을 의미합니다.
samples = 2
이 분기에 2명의 코미디언이 남아 있음을 의미합니다(35.5세보다 오래된 코미디언 2명).
value = [1, 1]
즉, 이 2명의 코미디언 중 1명은 "NO"를, 1명은 "GO"를 받습니다.
True - 코미디언 1명이 여기서 끝납니다.
gini = 0.0
모든 샘플이 동일한 결과를 얻었음을 의미합니다.
samples = 1
이 지점에 개그맨 1명이 남았다는 뜻입니다(경력 9.5년 이하의 개그맨 1명).
value = [0, 1]
0은 "NO"를, 1은 "GO"를 얻음을 의미합니다.
거짓 - 코미디언 1명이 여기서 끝납니다.
gini = 0.0
모든 샘플이 동일한 결과를 얻었음을 의미합니다.
samples = 1
이 지점에 개그맨 1명(경력 9.5년 이상의 개그맨 1명)이 남았다는 의미입니다.
value = [1, 0]
1은 "NO"를, 0은 "GO"를 얻음을 의미합니다.
값 예측
의사 결정 트리를 사용하여 새 값을 예측할 수 있습니다.
예: 10년 경력의 40세 미국 코미디언이 출연하고 코미디 순위가 7인 쇼를 보러 가야 하나요?
예시
predict() 메서드를 사용하여 새 값을 예측합니다.
print(dtree.predict([[40, 10, 7, 1]]))
예시
코미디 순위가 6위라면 답은?
print(dtree.predict([[40, 10, 6, 1]]))
다른 결과
동일한 데이터를 제공하더라도 충분한 시간 실행하면 의사결정 트리가 다른 결과를 제공한다는 것을 알 수 있습니다.
의사결정나무가 100% 확실한 답을 주지 않기 때문입니다. 그것은 결과의 확률을 기반으로 하며 대답은 다양합니다.