Poda de Árvores de Decisão

Beginner

This tutorial is from open-source community. Access the source code

Introdução

Em aprendizagem de máquina, árvores de decisão são modelos comumente utilizados. No entanto, as árvores de decisão tendem a sobreajustar os dados de treino, o que pode levar a um desempenho fraco nos dados de teste. Uma forma de prevenir o sobreajuste é através da poda da árvore de decisão. A poda por complexidade de custo é um método popular para podar árvores de decisão. Neste laboratório, utilizaremos o scikit-learn para demonstrar a poda por complexidade de custo para árvores de decisão.

Dicas da Máquina Virtual

Após o arranque da máquina virtual, clique no canto superior esquerdo para mudar para a aba Notebook para aceder ao Jupyter Notebook para a prática.

Às vezes, pode ser necessário esperar alguns segundos para que o Jupyter Notebook termine de carregar. A validação de operações não pode ser automatizada devido a limitações no Jupyter Notebook.

Se tiver problemas durante o aprendizado, sinta-se à vontade para perguntar ao Labby. Forneça feedback após a sessão e resolveremos prontamente o problema para si.

Carregar os Dados

Utilizaremos o conjunto de dados de cancro da mama do scikit-learn. Este conjunto de dados possui 30 características e uma variável alvo binária que indica se um paciente tem cancro maligno ou benigno.

from sklearn.datasets import load_breast_cancer

X, y = load_breast_cancer(return_X_y=True)

Dividir os Dados

Dividiremos os dados em conjuntos de treino e teste.

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)

Determinar os Valores Adequados de Alpha

Queremos determinar os valores apropriados de alpha a utilizar para podar a árvore de decisão. Podemos fazer isto representando a impureza total das folhas versus os alphas efectivos da árvore podada.

from sklearn.tree import DecisionTreeClassifier
import matplotlib.pyplot as plt

clf = DecisionTreeClassifier(random_state=0)
path = clf.cost_complexity_pruning_path(X_train, y_train)
ccp_alphas, impurities = path.ccp_alphas, path.impurities

fig, ax = plt.subplots()
ax.plot(ccp_alphas[:-1], impurities[:-1], marker="o", drawstyle="steps-post")
ax.set_xlabel("alpha efectivo")
ax.set_ylabel("impureza total das folhas")
ax.set_title("Impureza Total vs alpha efectivo para o conjunto de treino")

Treinar as Árvores de Decisão

Em seguida, treinaremos uma árvore de decisão usando cada um dos valores de alpha efectivos. O último valor em ccp_alphas é o valor de alpha que poda toda a árvore, deixando a árvore apenas com um nó.

clfs = []
for ccp_alpha in ccp_alphas:
    clf = DecisionTreeClassifier(random_state=0, ccp_alpha=ccp_alpha)
    clf.fit(X_train, y_train)
    clfs.append(clf)
print(
    "Número de nós na última árvore é: {} com ccp_alpha: {}".format(
        clfs[-1].tree_.node_count, ccp_alphas[-1]
    )
)

Remover Árvores Triviais

Vamos remover a árvore trivial com apenas um nó da lista de árvores de decisão.

clfs = clfs[:-1]
ccp_alphas = ccp_alphas[:-1]

Plotar o Número de Nós e a Profundidade da Árvore

Vamos plotar o número de nós e a profundidade da árvore à medida que o alpha aumenta.

node_counts = [clf.tree_.node_count for clf in clfs]
depth = [clf.tree_.max_depth for clf in clfs]
fig, ax = plt.subplots(2, 1)
ax[0].plot(ccp_alphas, node_counts, marker="o", drawstyle="steps-post")
ax[0].set_xlabel("alpha")
ax[0].set_ylabel("número de nós")
ax[0].set_title("Número de nós vs alpha")
ax[1].plot(ccp_alphas, depth, marker="o", drawstyle="steps-post")
ax[1].set_xlabel("alpha")
ax[1].set_ylabel("profundidade da árvore")
ax[1].set_title("Profundidade vs alpha")
fig.tight_layout()

Determinar o Melhor Valor de Alpha

Queremos determinar o melhor valor de alpha a utilizar para podar a árvore de decisão. Podemos fazer isso plotando a precisão versus alpha para os conjuntos de treino e teste.

train_scores = [clf.score(X_train, y_train) for clf in clfs]
test_scores = [clf.score(X_test, y_test) for clf in clfs]

fig, ax = plt.subplots()
ax.set_xlabel("alpha")
ax.set_ylabel("precisão")
ax.set_title("Precisão vs alpha para os conjuntos de treino e teste")
ax.plot(ccp_alphas, train_scores, marker="o", label="treino", drawstyle="steps-post")
ax.plot(ccp_alphas, test_scores, marker="o", label="teste", drawstyle="steps-post")
ax.legend()
plt.show()

Resumo

Neste laboratório, demonstramos como utilizar o scikit-learn para realizar a poda por complexidade de custo em árvores de decisão. Dividimos os dados em conjuntos de treino e teste, determinámos os valores apropriados de alpha para a poda, treinámos árvores de decisão utilizando os valores eficazes de alpha, plotámos o número de nós e a profundidade da árvore, e determinámos o melhor valor de alpha a utilizar para a poda com base na precisão dos conjuntos de treino e teste.