2014-05-09 5 views
14

scikit-learn에서 의사 결정 트리의 결과를 이해하는 데는 두 가지 문제점이 있습니다. 예를 들어 이것은 내 의사 결정 트리 중 하나입니다.scikit-learn에서 의사 결정 트리를 설명하는 방법

enter image description here 제 질문은 어떻게 사용할 수 있습니까? 그렇지 않으면 RIGHT 간다, 샘플이 조건을 만족하는 경우, 다음은 (존재하는 경우) LEFT 지점으로 이동 :

첫 번째 질문이다. 필자의 경우, X [7]> 63521.3984 인 샘플. 그러면 샘플이 녹색 상자로 이동합니다. 옳은?

두 번째 질문은 다음과 같습니다. 샘플이 리프 노드에 도달하면 어떻게 속한 카테고리를 알 수 있습니까? 이 예에서는 분류 할 세 가지 범주가 있습니다. 빨간색 상자에는 각각 91, 212, 113 개의 샘플이 조건을 만족합니다. 그러나 카테고리를 어떻게 결정할 수 있습니까? 카테고리에 알리려면 clf.predict (샘플) 기능이 있습니다. 그래프에서 그걸 할 수 있습니까 ??? 많은 감사.

+1

호기심에서 벗어나 결정 트리를 어떻게 그렸습니까? – Matt

+4

먼저 트리를 JSON 형식으로 내 보낸 다음 (이 [link] (http://www.garysieling.com/blog/rending-scikit-decision-trees-d3-js) 참조) d3.js를 사용하여 트리를 플롯합니다 . 또는 임베디드 함수를 직접 사용할 수 있습니다 :'tree.export_graphviz (clf, out_file = your_out_file, feature_names = your_feature_names)'희망, @Matt –

답변

21

각 상자에있는 value 줄은 해당 노드에서 몇 개의 샘플이 각 범주에 속하는지 순서대로 알려줍니다. 그래서 각 상자에 value의 숫자와 sample의 숫자가 합쳐집니다. 예를 들어 빨간색 상자에서 91 + 212 + 113 = 416. 따라서이 노드에 도달하면 카테고리 1에 91 개의 데이터 요소가 있고 카테고리 2에 212 개의 데이터 요소가 있고 카테고리 3에는 113 개의 데이터 요소가 있습니다.

리프에 도달 한 새 데이터 요소에 대한 결과를 예측하려고한다면 결정 트리에서 범주 2를 예측할 수 있습니다. 범주 2는 해당 노드의 샘플에 대한 가장 일반적인 범주이기 때문입니다.

+0

어떤 값이 어떤 클래스에 속해 있는지 알고 싶었습니다. 'DecisionTreeClassifier.classes'는이 정보를 보유합니다. – ezdazuzena

+0

(유용한 답변 : 파이썬 색인 작성을 사용하여 명확히하기 : 빨간색 상자의 샘플 착륙은 카테고리 0 (91) 또는 카테고리 2 (113)가 아닌 카테고리 1로 예상됩니다 (212) :-)) –

0

"학습 scikit-learn : Python에서 기계 학습"이라는 책에 따르면 의사 결정 트리는 교육 데이터를 기반으로 한 일련의 결정을 나타냅니다.

! (http://i.imgur.com/vM9fJLy.png)

우리가 각 노드의 질문에 대답해야한다, 인스턴스를 분류합니다. 예를 들어 섹스가 < = 0.5입니까? (우리는 여자에 대해 이야기하고 있습니까?). 대답이 '예'인 경우 트리의 왼쪽 하위 노드로 이동합니다. 그렇지 않으면 오른쪽 하위 노드으로 이동합니다. 당신은 잎에 닿을 때까지 질문에 대답을 계속합니다 (그녀는 3 학년 이었습니까?, 1 학년 이었습니까? 그리고 13 세 미만 이었습니까?). 거기에있을 때 예측은 대부분의 인스턴스가 인 대상 클래스에 해당합니다.

2

첫 번째 질문 : 네 논리가 맞습니다. 왼쪽 노드는 참이고 오른쪽 노드는 거짓입니다. 이는 반 직관적입니다. true는 일반적으로 더 작은 값을 의미합니다.

두 번째 질문 : 이 문제는 트리를 pydotplus로 그래프로 시각화하면 가장 잘 해결됩니다. tree.export_graphviz()의 'class_names'속성은 클래스 선언을 각 노드의 다수 클래스에 추가합니다. 코드는 iPython에서 실행됩니다.홍채 데이터 세트처럼

from sklearn.datasets import load_iris 
from sklearn import tree 
iris = load_iris() 
clf2 = tree.DecisionTreeClassifier() 
clf2 = clf2.fit(iris.data, iris.target) 

with open("iris.dot", 'w') as f: 
    f = tree.export_graphviz(clf, out_file=f) 

import os 
os.unlink('iris.dot') 

import pydotplus 
dot_data = tree.export_graphviz(clf2, out_file=None) 
graph2 = pydotplus.graph_from_dot_data(dot_data) 
graph2.write_pdf("iris.pdf") 

from IPython.display import Image 
dot_data = tree.export_graphviz(clf2, out_file=None, 
        feature_names=iris.feature_names, 
        class_names=iris.target_names, 
        filled=True, rounded=True, # leaves_parallel=True, 
        special_characters=True) 
graph2 = pydotplus.graph_from_dot_data(dot_data) 

## Color of nodes 
nodes = graph2.get_node_list() 

for node in nodes: 
    if node.get_label(): 
     values = [int(ii) for ii in node.get_label().split('value = [')[1].split(']')[0].split(',')]; 
     color = {0: [255,255,224], 1: [255,224,255], 2: [224,255,255],} 
     values = color[values.index(max(values))]; # print(values) 
     color = '#{:02x}{:02x}{:02x}'.format(values[0], values[1], values[2]); # print(color) 
     node.set_fillcolor(color) 
# 

Image(graph2.create_png()) 
, 귀하의 예제는 하나의 클래스와 잎이없는 잎에서 클래스를 결정으로

enter image description here

. 이는 일반적이며 이러한 결과를 얻기 위해 모델을 지나치게 맞추어야 할 수도 있습니다. 클래스의 이산 분포는 많은 교차 유효성이 검증 된 모델에서 가장 좋은 결과입니다.

코드를 즐기십시오!

관련 문제