2016-12-15 10 views
0

Работает над набором данных Kaggle Titanic. Я пытаюсь лучше понять деревья решений, я работал с линейными регрессиями, но не принимал решения. Я пытаюсь создать визуализацию в python для моего дерева. Однако что-то не работает. Проверьте мой код ниже.Деревья принятия решений с SKlearn и визуализация

import pandas as pd 
from sklearn import tree 
from sklearn.datasets import load_iris 
import numpy as np 


train_file='.......\RUN.csv' 
train=pd.read_csv(train_file) 

#impute number values and missing values 
train["Sex"][train["Sex"] == "male"] = 0 
train["Sex"][train["Sex"] == "female"] = 1 
train["Embarked"] = train["Embarked"].fillna("S") 
train["Embarked"][train["Embarked"] == "S"]= 0 
train["Embarked"][train["Embarked"] == "C"]= 1 
train["Embarked"][train["Embarked"] == "Q"]= 2 
train["Age"] = train["Age"].fillna(train["Age"].median()) 
train["Pclass"] = train["Pclass"].fillna(train["Pclass"].median()) 
train["Fare"] = train["Fare"].fillna(train["Fare"].median()) 

target = train["Survived"].values 
features_one = train[["Pclass", "Sex", "Age", "Fare","SibSp","Parch","Embarked"]].values 


# Fit your first decision tree: my_tree_one 
my_tree_one = tree.DecisionTreeClassifier(max_depth = 10, min_samples_split = 5, random_state = 1) 

iris=load_iris() 

my_tree_one = my_tree_one.fit(features_one, target) 

tree.export_graphviz(my_tree_one, out_file='tree.dot') 

Как я могу увидеть дерево решений? Попытка визуализировать его.

Помогите оценить!

ответ

2

Вы проверили: http://scikit-learn.org/stable/modules/tree.html упоминает, как построить дерево как PNG изображения:

from IPython.display import Image 
import pydotplus 
dot_data = tree.export_graphviz(my_tree_one, out_file='tree.dot') 
graph = pydotplus.graph_from_dot_data(dot_data) ` 
Image(graph.create_png()) 
+0

>>> импорт os >>> os.unlink ('iris.dot') –

+0

I t говорит, чтобы сделать это ^. Однако это просто удаляет файл. есть идеи? У меня также нет pydotplus. Я попытался загрузить его с помощью pip, но это не сработало. –

+0

Я думаю, что проблема заключается в графике, и вы должны скачать ее: http://www.graphviz.org/Download..php http://stackoverflow.com/questions/18438997/why-is-pydot-unable-to-find -graphvizs-исполнимые-в-Windows-8. Сначала установите графику, затем pydot. Или используйте linux. Я вернусь к нему чуть позже. – Roxanne

0

Из википедии:

Язык DOT определяет график, но не предоставляет средства для оказания граф. Есть несколько программ, которые могут быть использованы для визуализации, просматривать и манипулировать графики на языке DOT:

Graphviz - коллекция библиотек и утилит для манипулирования и рендеринга графики

Canviz - библиотека JavaScript для визуализации точки файлы.

Viz.js - Простой Graphviz JavaScript клиент

Граппа -. Неполный порт из Graphviz в Java [4] [5]

Beluging - A Python & Google Cloud-viewer расширений DOT и Beluga. [1]

Tulip может импортировать точечные файлы для анализа

OmniGraffle может импортировать подмножество DOT, производя редактируемый документ. (Результат не может быть экспортирован обратно DOT, однако.)

ZGRViewer, ссылка GraphViz/DOT просмотр

VizierFX, A Flex график рендеринга подключаемой библиотеки

Gephi - интерактивная визуализация и исследование платформы для все виды сетей и сложных систем, динамические и иерархические графики

Таким образом, любая из этих программ могла бы визуализировать ваше дерево.

+0

Я использую graphviz уже, но я не могу заставить его отображаться как изображение. Он просто записывает его в .dot-файл. Я попытался изменить ti на pdf, но, похоже, не может заставить его работать. –

+0

Я считаю, что это должно просто написать .dot-файл. Затем вы должны использовать одно из приложений, перечисленных для просмотра .dot-файла. Мне лично нравится Гефи. –

0

Я сделал визуализацию, используя штриховые графики. Первый график показывает распределение классов. Первый заголовок представляет собой первый разделительный критерий. Все данные, удовлетворяющие этому критерию, приводят к левому основному подзаговору. Если нет, то правильный результат - результат. Таким образом, все заголовки указывают на разделенный критерий для следующего раскола.

Проценты являются значениями из исходного распределения. Поэтому, просматривая предварительные данные, можно легко получить, сколько от начального количества данных осталось после нескольких разрывов.

Обратите внимание, если вы установите max_depth высокими, что это повлечет за собой много сюжетных (max_depth, 2^глубина)

Tree visualization using bar plots

Код:

def give_nodes(nodes,amount_of_branches,left,right): 
    amount_of_branches*=2 
    nodes_splits=[] 
    for node in nodes: 
     nodes_splits.append(left[node]) 
     nodes_splits.append(right[node]) 
    return (nodes_splits,amount_of_branches) 

def plot_tree(tree, feature_names): 
    from matplotlib import gridspec 
    import matplotlib.pyplot as plt 
    from matplotlib import rc 
    import pylab 

    color = plt.cm.coolwarm(np.linspace(1,0,len(feature_names))) 

    plt.rc('text', usetex=True) 
    plt.rc('font', family='sans-serif') 
    plt.rc('font', size=14) 

    params = {'legend.fontsize': 20, 
      'axes.labelsize': 20, 
      'axes.titlesize':25, 
      'xtick.labelsize':20, 
      'ytick.labelsize':20} 
    plt.rcParams.update(params) 

    max_depth=tree.max_depth 
    left  = tree.tree_.children_left 
    right  = tree.tree_.children_right 
    threshold = tree.tree_.threshold 
    features = [feature_names[i] for i in tree.tree_.feature] 
    value = tree.tree_.value 

    fig = plt.figure(figsize=(3*2**max_depth,2*2**max_depth)) 
    gs = gridspec.GridSpec(max_depth, 2**max_depth) 
    plt.subplots_adjust(hspace = 0.6, wspace=0.8) 

    # All data 
    amount_of_branches=1 
    nodes=[0] 
    normalize=np.sum(value[0][0]) 

    for i,node in enumerate(nodes): 
     ax=fig.add_subplot(gs[0,(2**max_depth*i)/amount_of_branches:(2**max_depth*(i+1))/amount_of_branches]) 
     ax.set_title(features[node]+"$<= "+str(threshold[node])+"$") 
     if(i==0): ax.set_ylabel(r'$\%$') 
     ind=np.arange(1,len(value[node][0])+1,1) 
     width=0.2 
     bars= (np.array(value[node][0])/normalize)*100 
     plt.bar(ind-width/2, bars, width,color=color,alpha=1,linewidth=0) 
     plt.xticks(ind, [int(i) for i in ind-1]) 
     pylab.ticklabel_format(axis='y',style='sci',scilimits=(0,2)) 

    # Splits 
    for j in range(1,max_depth): 
     nodes,amount_of_branches=give_nodes(nodes,amount_of_branches,left,right) 
     for i,node in enumerate(nodes): 
      ax=fig.add_subplot(gs[j,(2**max_depth*i)/amount_of_branches:(2**max_depth*(i+1))/amount_of_branches]) 
      ax.set_title(features[node]+"$<= "+str(threshold[node])+"$") 
      if(i==0): ax.set_ylabel(r'$\%$') 
      ind=np.arange(1,len(value[node][0])+1,1) 
      width=0.2 
      bars= (np.array(value[node][0])/normalize)*100 
      plt.bar(ind-width/2, bars, width,color=color,alpha=1,linewidth=0) 
      plt.xticks(ind, [int(i) for i in ind-1]) 
      pylab.ticklabel_format(axis='y',style='sci',scilimits=(0,2)) 


    plt.tight_layout() 
    return fig 

Пример:

X=[] 
Y=[] 
amount_of_labels=5 
feature_names=[ '$x_1$','$x_2$','$x_3$','$x_4$','$x_5$'] 
for i in range(200): 
    X.append([np.random.normal(),np.random.randint(0,100),np.random.uniform(200,500) ]) 
    Y.append(np.random.randint(0,amount_of_labels)) 

clf = tree.DecisionTreeClassifier(criterion='entropy',max_depth=4) 
clf = clf.fit(X,Y) 
fig=plot_tree(clf, feature_names)