Graficar Bosque Iris

Beginner

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

Introducción

Esta práctica demuestra cómo trazar las superficies de decisión de bosques de árboles aleatorios en el conjunto de datos iris utilizando la biblioteca scikit-learn de Python. El conjunto de datos iris es un conjunto de datos comúnmente utilizado para tareas de clasificación. En esta práctica, compararemos las superficies de decisión aprendidas por un clasificador de árbol de decisión, un clasificador de bosque aleatorio, un clasificador de árboles extra y un clasificador AdaBoost.

Consejos sobre la VM

Una vez que se haya iniciado la VM, haga clic en la esquina superior izquierda para cambiar a la pestaña Cuaderno y acceder a Jupyter Notebook para practicar.

A veces, es posible que tenga que esperar unos segundos a que Jupyter Notebook termine de cargarse. La validación de las operaciones no se puede automatizar debido a las limitaciones de Jupyter Notebook.

Si tiene problemas durante el aprendizaje, no dude en preguntar a Labby. Deje sus comentarios después de la sesión y lo resolveremos rápidamente para usted.

Importar bibliotecas

En este paso, importaremos las bibliotecas necesarias para trazar las superficies de decisión en el conjunto de datos iris.

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap

from sklearn.datasets import load_iris
from sklearn.ensemble import (
    RandomForestClassifier,
    ExtraTreesClassifier,
    AdaBoostClassifier,
)
from sklearn.tree import DecisionTreeClassifier

Definir parámetros

En este paso, definiremos los parámetros necesarios para trazar las superficies de decisión en el conjunto de datos iris.

## Parameters
n_classes = 3
n_estimators = 30
cmap = plt.cm.RdYlBu
plot_step = 0.02  ## ancho de paso fino para los contornos de la superficie de decisión
plot_step_coarser = 0.5  ## anchos de paso para las adivinanzas de clasificador aproximadas
RANDOM_SEED = 13  ## fija la semilla en cada iteración

Cargar datos

En este paso, cargaremos el conjunto de datos iris.

## Cargar datos
iris = load_iris()

Definir modelos

En este paso, definiremos los modelos que se utilizarán para trazar las superficies de decisión en el conjunto de datos iris.

models = [
    DecisionTreeClassifier(max_depth=None),
    RandomForestClassifier(n_estimators=n_estimators),
    ExtraTreesClassifier(n_estimators=n_estimators),
    AdaBoostClassifier(DecisionTreeClassifier(max_depth=3), n_estimators=n_estimators),
]

Trazar superficies de decisión

En este paso, trazaremos las superficies de decisión de los modelos definidos en el conjunto de datos iris.

plot_idx = 1

for pair in ([0, 1], [0, 2], [2, 3]):
    for model in models:
        ## Solo tomamos las dos características correspondientes
        X = iris.data[:, pair]
        y = iris.target

        ## Mezclar
        idx = np.arange(X.shape[0])
        np.random.seed(RANDOM_SEED)
        np.random.shuffle(idx)
        X = X[idx]
        y = y[idx]

        ## Estandarizar
        mean = X.mean(axis=0)
        std = X.std(axis=0)
        X = (X - mean) / std

        ## Entrenar
        model.fit(X, y)

        scores = model.score(X, y)
        ## Crear un título para cada columna y la consola usando str() y
        ## cortando partes inútiles de la cadena
        model_title = str(type(model)).split(".")[-1][:-2][: -len("Classifier")]

        model_details = model_title
        if hasattr(model, "estimators_"):
            model_details += " con {} estimadores".format(len(model.estimators_))
        print(model_details + " con características", pair, "tiene una puntuación de", scores)

        plt.subplot(3, 4, plot_idx)
        if plot_idx <= len(models):
            ## Agregar un título en la parte superior de cada columna
            plt.title(model_title, fontsize=9)

        ## Ahora trazar el límite de decisión usando una malla fina como entrada a un
        ## trazado de contorno relleno
        x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
        y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
        xx, yy = np.meshgrid(
            np.arange(x_min, x_max, plot_step), np.arange(y_min, y_max, plot_step)
        )

        ## Trazar ya sea un solo DecisionTreeClassifier o mezclar alfa
        ## las superficies de decisión del conjunto de clasificadores
        if isinstance(model, DecisionTreeClassifier):
            Z = model.predict(np.c_[xx.ravel(), yy.ravel()])
            Z = Z.reshape(xx.shape)
            cs = plt.contourf(xx, yy, Z, cmap=cmap)
        else:
            ## Elegir el nivel de mezcla alfa con respecto al número
            ## de estimadores
            ## que se están usando (teniendo en cuenta que AdaBoost puede usar menos estimadores
            ## que su máximo si alcanza una ajuste lo suficientemente bueno al principio)
            estimator_alpha = 1.0 / len(model.estimators_)
            for tree in model.estimators_:
                Z = tree.predict(np.c_[xx.ravel(), yy.ravel()])
                Z = Z.reshape(xx.shape)
                cs = plt.contourf(xx, yy, Z, alpha=estimator_alpha, cmap=cmap)

        ## Construir una malla más gruesa para trazar un conjunto de clasificaciones del conjunto
        ## para mostrar cómo estas son diferentes a lo que vemos en las decisiones
        ## superficies. Estos puntos están regularmente espaciados y no tienen un
        ## contorno negro
        xx_coarser, yy_coarser = np.meshgrid(
            np.arange(x_min, x_max, plot_step_coarser),
            np.arange(y_min, y_max, plot_step_coarser),
        )
        Z_points_coarser = model.predict(
            np.c_[xx_coarser.ravel(), yy_coarser.ravel()]
        ).reshape(xx_coarser.shape)
        cs_points = plt.scatter(
            xx_coarser,
            yy_coarser,
            s=15,
            c=Z_points_coarser,
            cmap=cmap,
            edgecolors="none",
        )

        ## Trazar los puntos de entrenamiento, estos están agrupados juntos y tienen un
        ## contorno negro
        plt.scatter(
            X[:, 0],
            X[:, 1],
            c=y,
            cmap=ListedColormap(["r", "y", "b"]),
            edgecolor="k",
            s=20,
        )
        plot_idx += 1  ## pasar al siguiente trazado en secuencia

plt.suptitle("Clasificadores en subconjuntos de características del conjunto de datos Iris", fontsize=12)
plt.axis("tight")
plt.tight_layout(h_pad=0.2, w_pad=0.2, pad=2.5)
plt.show()

Resumen

En este laboratorio, aprendimos cómo trazar las superficies de decisión de bosques de árboles aleatorizados en el conjunto de datos iris utilizando la biblioteca scikit - learn de Python. Comparamos las superficies de decisión aprendidas por un clasificador de árbol de decisión, un clasificador de bosque aleatorio, un clasificador de árboles extra y un clasificador AdaBoost. También aprendimos cómo definir modelos, trazar superficies de decisión y cargar datos en Python.