Conjunto de Cadenas de Clasificadores

Beginner

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

Introducción

Esta práctica demuestra un ejemplo de uso de la cadena de clasificadores en un conjunto de datos de etiquetado múltiple. El algoritmo de Cadena de Clasificadores es una modificación del método de transformación de problema para la clasificación de etiquetado múltiple. Este método aprovecha la correlación entre las clases mediante la construcción de una cadena de clasificadores binarios. Cada modelo recibe las predicciones de los modelos anteriores en la cadena como características. Usaremos el conjunto de datos yeast que contiene 2417 puntos de datos, cada uno con 103 características y 14 etiquetas posibles. Cada punto de datos tiene al menos una etiqueta. Como línea base, primero entrenamos un clasificador de regresión logística para cada una de las 14 etiquetas. Para evaluar el rendimiento de estos clasificadores, hacemos predicciones en un conjunto de prueba separado y calculamos la puntuación de Jaccard para cada muestra.

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 inmediatamente.

Cargar el conjunto de datos de levadura

X, Y = fetch_openml("yeast", version=4, return_X_y=True, parser="pandas")
Y = Y == "TRUE"
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2, random_state=0)

Entrenar un modelo de regresión logística independiente para cada clase

base_lr = LogisticRegression()
ovr = OneVsRestClassifier(base_lr)
ovr.fit(X_train, Y_train)
Y_pred_ovr = ovr.predict(X_test)
ovr_jaccard_score = jaccard_score(Y_test, Y_pred_ovr, average="samples")

Entrenar un conjunto de cadenas de clasificadores de regresión logística

chains = [ClassifierChain(base_lr, order="random", random_state=i) for i in range(10)]
for chain in chains:
    chain.fit(X_train, Y_train)

Y_pred_chains = np.array([chain.predict(X_test) for chain in chains])
chain_jaccard_scores = [
    jaccard_score(Y_test, Y_pred_chain >= 0.5, average="samples")
    for Y_pred_chain in Y_pred_chains
]

Tomar la predicción promedio de todas las cadenas

Y_pred_ensemble = Y_pred_chains.mean(axis=0)
ensemble_jaccard_score = jaccard_score(
    Y_test, Y_pred_ensemble >= 0.5, average="samples"
)

Graficar las puntuaciones de similitud de Jaccard

model_scores = [ovr_jaccard_score] + chain_jaccard_scores
model_scores.append(ensemble_jaccard_score)

model_names = (
    "Independent",
    "Chain 1",
    "Chain 2",
    "Chain 3",
    "Chain 4",
    "Chain 5",
    "Chain 6",
    "Chain 7",
    "Chain 8",
    "Chain 9",
    "Chain 10",
    "Ensemble",
)

x_pos = np.arange(len(model_names))

fig, ax = plt.subplots(figsize=(7, 4))
ax.grid(True)
ax.set_title("Classifier Chain Ensemble Performance Comparison")
ax.set_xticks(x_pos)
ax.set_xticklabels(model_names, rotation="vertical")
ax.set_ylabel("Jaccard Similarity Score")
ax.set_ylim([min(model_scores) * 0.9, max(model_scores) * 1.1])
colors = ["r"] + ["b"] * len(chain_jaccard_scores) + ["g"]
ax.bar(x_pos, model_scores, alpha=0.5, color=colors)
plt.tight_layout()
plt.show()

Resumen

Esta práctica mostró cómo utilizar el algoritmo de Cadena de Clasificadores para construir un conjunto de cadenas de clasificadores de regresión logística para aprovechar las correlaciones entre las clases. La puntuación de similitud de Jaccard para cada cadena tiende a ser mayor que la de los modelos de regresión logística independientes. Finalmente, construimos un conjunto de votación de cadenas de clasificadores promediando las predicciones binarias de las cadenas y aplicando un umbral de 0,5. La puntuación de similitud de Jaccard del conjunto fue mayor que la de los modelos independientes y tendió a superar la puntuación de cada cadena en el conjunto.