<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 Exercício - Árvores de Decisão
Neste exercício você irá colocar em prática seus conhecimentos em classificação com árvores de decisão utilizando o scikit-learn. Você irá o dataset disponível em
Step1:  Divisão do dataset em atributos e classes
Step2:  Divisão do dataset em treino e teste
Step3:  Deifinição do modelo
Step4:  Treinamento do modelo
Step5:  Predição utilizando o X_test
Step6:  Definição da acurácia
<ASSISTANT_TASK:>
Python Code:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.tree import DecisionTreeRegressor
from sklearn.model_selection import KFold, cross_val_score
import numpy as np
dataset = pd.read_csv('heart.csv')
dataset.head()
dataset.hist()
dataset.info()
Explanation: Exercício - Árvores de Decisão
Neste exercício você irá colocar em prática seus conhecimentos em classificação com árvores de decisão utilizando o scikit-learn. Você irá o dataset disponível em: https://www.kaggle.com/ronitf/heart-disease-uci.
Baseando-se no tutorial apresentado em sala de aula, realize as seguintes tarefas:
1 - Carregue o dataset. 
2 - Faça um histograma dos atributos presentes no dataset (dica: utilize o método hist do matplotlib). O que você pode perceber analisando o histograma? Os dados seguem algum padrão na sua distribuição? O atributo classe é balanceado? 
3 - Divida o dataset em atributos (X) e classe (Y). 
4 - Divida o dataset em conjuntos de treino (80%) e teste (20%). 
5 - Crie e treine a sua árvore de decisão. 
6 - Faça predições utilizando a árvore criada. 
7 - Avalie o algoritmo do modo tradicional (usando os conjuntos de treino e teste) e utilizando o K-fold cross-validation. 
8 - Altere os valores da profundidade da árvore (max_depth) e da quantidade de samples para split (min_samples_split) na etapa de treinamento. 
Faça testes com diversos valores e avalie se existem quedas ou aumentos da acurácia após a alteração desses parâmetros. Não esqueça também de variar a quantidade de conjuntos (n_splits) na etapa do K-fold e avaliar quais são as mudanças na acurácia após as alterações.
End of explanation
X = dataset.iloc[:,0:12]
Y = dataset.iloc[:,13]
Explanation: Divisão do dataset em atributos e classes
End of explanation
X_train, X_test, y_train, y_test = train_test_split(X, Y, train_size=0.8, test_size= 0.2, random_state=0)
Explanation: Divisão do dataset em treino e teste
End of explanation
model = DecisionTreeClassifier(criterion='gini', max_depth=4, min_samples_split= 20)
Explanation: Deifinição do modelo
End of explanation
model.fit(X_train, y_train)
Explanation: Treinamento do modelo
End of explanation
predicao = model.predict(X_test)
Explanation: Predição utilizando o X_test
End of explanation
accuracy = model.score(X_test, y_test)*100
print('Accuracy: %s%%' % accuracy)
maxAccuracy = 0
valueI, valueJ = '', ''
for i in range(2, 20):
    for j in range(2, 20):
        model = DecisionTreeClassifier(criterion='gini', max_depth=i, min_samples_split= j)
        model.fit(X_train, y_train)
        predicao = model.predict(X_test)
        accuracy = model.score(X_test, y_test)*100
        if accuracy > maxAccuracy:
            maxAccuracy = accuracy
            valueI, valueJ = i,j
print('I: {0}, J:{1} Accuracy: {2}%'.format(valueI, valueJ, maxAccuracy))
Explanation: Definição da acurácia
End of explanation
<END_TASK>