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.