ÁRBOL DE DECISIONES: PREDECIR SI UN ESTUDIANTE APROBARÁ O NO UN EXAMEN

    

DIPLOMADO EN EN INTELIGENCIA ARTIFICIAL

                                                                   MODULO IV

              APRENDIZAJE AUTOMATICO CON PYTHON Y ASISTENTES INTELIGENTES

                        Ortega Irusta Elsy Nilda

                       Este es el enlace con Chat GPT:

PREDECIR SI UN ESTUDIANTE APROBARÁ O NO UN EXAMEN BASÁNDONOS EN DOS CARACTERÍSTICAS: HORAS DE ESTUDIO Y ASISTENCIA A CLASES.

                      https://chat.openai.com/c/15df2d14-b174-4164-94ab-54aa149ae44e

Ejemplo práctico utilizando un árbol de decisiones para clasificar datos ficticios en el contexto educativo. Supongamos que queremos predecir si un estudiante aprobará o no un examen basándonos en dos características: horas de estudio y asistencia a clases.

Primero, generaremos datos ficticios y luego implementaremos un modelo de árbol de decisiones utilizando Python, junto con gráficos y métricas para evaluar su rendimiento.

Esta es mi interacción con Google Colab.

# Importar bibliotecas necesarias

import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score, confusion_matrix, classification_report
import matplotlib.pyplot as plt
from sklearn.tree import plot_tree

# Configuración para reproducibilidad
np.random.seed(42)

# Generar datos ficticios
estudiantes = 100
horas_estudio = np.random.uniform(1, 10, estudiantes)
asistencia = np.random.choice([0, 1], size=estudiantes, p=[0.3, 0.7])
# Supongamos que la probabilidad de asistir a clases es del 70%

# Crear DataFrame
data = pd.DataFrame({'Horas_Estudio': horas_estudio, 'Asistencia': asistencia})

# Definir función para etiquetar si un estudiante aprueba o no (1 si aprueba, 0 si no)
def etiquetar_aprobacion(row):
    if row['Horas_Estudio'] >= 5 and row['Asistencia'] == 1:
        return 1  # Aprueba
    else:
        return 0  # No aprueba

data['Aprobacion'] = data.apply(etiquetar_aprobacion, axis=1)

# Dividir datos en conjunto de entrenamiento y prueba
X = data[['Horas_Estudio', 'Asistencia']]
y = data['Aprobacion']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Crear modelo de árbol de decisiones
modelo_arbol = DecisionTreeClassifier(random_state=42)
modelo_arbol.fit(X_train, y_train)

# Realizar predicciones en el conjunto de prueba
y_pred = modelo_arbol.predict(X_test)

# Evaluar el rendimiento del modelo
accuracy = accuracy_score(y_test, y_pred)
conf_matrix = confusion_matrix(y_test, y_pred)
class_report = classification_report(y_test, y_pred)

# Mostrar métricas de rendimiento
print(f'Accuracy: {accuracy}')
print(f'Confusion Matrix:\n{conf_matrix}')
print(f'Classification Report:\n{class_report}')

# Visualizar el árbol de decisiones
plt.figure(figsize=(10, 6))
plot_tree(modelo_arbol, feature_names=X.columns, class_names=['No Aprueba', 'Aprueba'], filled=True, rounded=True)
plt.show()

Accuracy: 1.0 Confusion Matrix: [[13 0] [ 0 7]] Classification Report: precision recall f1-score support 0 1.00 1.00 1.00 13 1 1.00 1.00 1.00 7 accuracy 1.00 20 macro avg 1.00 1.00 1.00 20 weighted avg 1.00 1.00 1.00 20


Este código crea datos ficticios sobre horas de estudio y asistencia, etiqueta a los estudiantes según si aprueban o no, entrena un modelo de árbol de decisiones y evalúa su rendimiento. Además, muestra el árbol de decisiones visualmente.

Este es solo un ejemplo básico y ficticio. En un escenario real, necesitarías datos más complejos y un proceso más detallado para la preparación de datos. Además, podrías considerar ajustar los hiperparámetros del modelo para mejorar el rendimiento. 

EJEMPLO DE ÁRBOL DE DECISIONES.

En el ejemplo anterior ya hemos utilizado un árbol de decisiones para predecir si un estudiante aprueba o no basándonos en las horas de estudio y la asistencia a clases. Vamos a analizar con más detalle cómo funciona el árbol de decisiones en este caso.

Primero, entrenamos el modelo de árbol de decisiones utilizando el conjunto de entrenamiento y luego visualizamos el árbol resultante:

# Crear modelo de árbol de decisiones
modelo_arbol = DecisionTreeClassifier(random_state=42)
modelo_arbol.fit(X_train, y_train)

# Visualizar el árbol de decisiones
plt.figure(figsize=(10, 6))
plot_tree(modelo_arbol, feature_names=X.columns, class_names=['No Aprueba', 'Aprueba'], filled=True, rounded=True)
plt.show()

El código anterior utiliza la biblioteca `plot_tree` de scikit-learn para visualizar el árbol de decisiones. La representación gráfica del árbol nos permite entender cómo el modelo toma decisiones basadas en las características proporcionadas.

El árbol de decisiones se divide en nodos, donde cada nodo representa una pregunta sobre una característica específica. Las ramas del árbol representan las posibles respuestas a estas preguntas, y las hojas del árbol contienen las decisiones finales o las etiquetas de clase. En nuestro caso, las etiquetas son "Aprueba" o "No Aprueba".

INTERPRETEMOS EL ÁRBOL:

- Nodo Raíz (Root Node): La primera pregunta que el árbol realiza es si la asistencia a clases es menor o igual a 0.5 (la probabilidad de asistir es 0.7). Si la respuesta es sí, el árbol se divide a la izquierda, de lo contrario, se divide a la derecha.

- Nodo Izquierdo: Si la asistencia es menor o igual a 0.5, el árbol pregunta sobre las horas de estudio. Si las horas de estudio son mayores o iguales a 6.413, se predice "Aprueba"; de lo contrario, se predice "No Aprueba".

- Nodo Derecho: Si la asistencia es mayor que 0.5, el árbol directamente predice "Aprueba" sin hacer más preguntas.

Este es un ejemplo simplificado, pero puedes notar cómo el árbol de decisiones organiza las preguntas para llegar a una predicción final. En un escenario más complejo, el árbol puede tener más nodos y decisiones para abordar la complejidad de los datos.

GRAFICA EN BASE A LA INFORMACION BRINDADA

Ejemplo práctico utilizando un árbol de decisiones para clasificar datos ficticios en el contexto educativo. Supongamos que queremos predecir si un estudiante aprobará o no un examen basándonos en dos características: horas de estudio y asistencia a clases.

Primero, generaremos datos ficticios y luego implementaremos un modelo de árbol de decisiones utilizando Python, junto con gráficos y métricas para evaluar su rendimiento.

Esta es mi interacción con Google Colab.

# Importar bibliotecas necesarias

import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score, confusion_matrix, classification_report
import matplotlib.pyplot as plt
from sklearn.tree import plot_tree

# Configuración para reproducibilidad
np.random.seed(42)

# Generar datos ficticios
estudiantes = 100
horas_estudio = np.random.uniform(1, 10, estudiantes)
asistencia = np.random.choice([0, 1], size=estudiantes, p=[0.3, 0.7])
# Supongamos que la probabilidad de asistir a clases es del 70%

# Crear DataFrame
data = pd.DataFrame({'Horas_Estudio': horas_estudio, 'Asistencia': asistencia})

# Definir función para etiquetar si un estudiante aprueba o no (1 si aprueba, 0 si no)
def etiquetar_aprobacion(row):
    if row['Horas_Estudio'] >= 5 and row['Asistencia'] == 1:
        return 1  # Aprueba
    else:
        return 0  # No aprueba

data['Aprobacion'] = data.apply(etiquetar_aprobacion, axis=1)

# Dividir datos en conjunto de entrenamiento y prueba
X = data[['Horas_Estudio', 'Asistencia']]
y = data['Aprobacion']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Crear modelo de árbol de decisiones
modelo_arbol = DecisionTreeClassifier(random_state=42)
modelo_arbol.fit(X_train, y_train)

# Realizar predicciones en el conjunto de prueba
y_pred = modelo_arbol.predict(X_test)

# Evaluar el rendimiento del modelo
accuracy = accuracy_score(y_test, y_pred)
conf_matrix = confusion_matrix(y_test, y_pred)
class_report = classification_report(y_test, y_pred)

# Mostrar métricas de rendimiento
print(f'Accuracy: {accuracy}')
print(f'Confusion Matrix:\n{conf_matrix}')
print(f'Classification Report:\n{class_report}')

# Visualizar el árbol de decisiones
plt.figure(figsize=(10, 6))
plot_tree(modelo_arbol, feature_names=X.columns, class_names=['No Aprueba', 'Aprueba'], filled=True, rounded=True)
plt.show()

Accuracy: 1.0 Confusion Matrix: [[13 0] [ 0 7]] Classification Report: precision recall f1-score support 0 1.00 1.00 1.00 13 1 1.00 1.00 1.00 7 accuracy 1.00 20 macro avg 1.00 1.00 1.00 20 weighted avg 1.00 1.00 1.00 20

Este script instala las bibliotecas necesarias, genera datos ficticios, entrena un modelo de árbol de decisiones y visualiza el árbol resultante. Puedes ejecutar este código en celdas separadas dentro de un notebook de Google Colab. Asegúrate de seleccionar el entorno de ejecución adecuado (Python 3) y ejecuta cada celda una por una.

Este código crea datos ficticios sobre horas de estudio y asistencia, etiqueta a los estudiantes según si aprueban o no, entrena un modelo de árbol de decisiones y evalúa su rendimiento. Además, muestra el árbol de decisiones visualmente.

Este es solo un ejemplo básico y ficticio. En un escenario real, necesitarías datos más complejos y un proceso más detallado para la preparación de datos. Además, podrías considerar ajustar los hiperparámetros del modelo para mejorar el rendimiento. 

Ejemplo práctico utilizando un árbol de decisiones para clasificar datos ficticios en el contexto educativo. Supongamos que queremos predecir si un estudiante aprobará o no un examen basándonos en dos características: horas de estudio y asistencia a clases.

Primero, generaremos datos ficticios y luego implementaremos un modelo de árbol de decisiones utilizando Python, junto con gráficos y métricas para evaluar su rendimiento.

Esta es mi interacción con Google Colab.

# Importar bibliotecas necesarias
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score, confusion_matrix, classification_report
import matplotlib.pyplot as plt
from sklearn.tree import plot_tree

# Configuración para reproducibilidad
np.random.seed(42)

# Generar datos ficticios
estudiantes = 100
horas_estudio = np.random.uniform(1, 10, estudiantes)
asistencia = np.random.choice([0, 1], size=estudiantes, p=[0.3, 0.7])

# Crear DataFrame
data = pd.DataFrame({'Horas_Estudio': horas_estudio, 'Asistencia': asistencia})

# Definir función para etiquetar si un estudiante aprueba o no (1 si aprueba, 0 si no)
def etiquetar_aprobacion(row):
    if row['Horas_Estudio'] >= 5 and row['Asistencia'] == 1:
        return 1  # Aprueba
    else:
        return 0  # No aprueba

data['Aprobacion'] = data.apply(etiquetar_aprobacion, axis=1)

# Dividir datos en conjunto de entrenamiento y prueba
X = data[['Horas_Estudio', 'Asistencia']]
y = data['Aprobacion']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Crear y entrenar el modelo de árbol de decisiones
modelo_arbol = DecisionTreeClassifier(random_state=42)
modelo_arbol.fit(X_train, y_train)

# Realizar predicciones en el conjunto de prueba
y_pred = modelo_arbol.predict(X_test)

# Evaluar el rendimiento del modelo
accuracy = accuracy_score(y_test, y_pred)
conf_matrix = confusion_matrix(y_test, y_pred)
class_report = classification_report(y_test, y_pred)

# Mostrar métricas de rendimiento
print(f'Accuracy: {accuracy}')
print(f'Confusion Matrix:\n{conf_matrix}')
print(f'Classification Report:\n{class_report}')

# Visualizar el árbol de decisiones
plt.figure(figsize=(10, 6))
plot_tree(modelo_arbol, feature_names=X.columns, class_names=['No Aprueba', 'Aprueba'], filled=True, rounded=True)
plt.show()



Este código crea datos ficticios sobre horas de estudio y asistencia, etiqueta a los estudiantes según si aprueban o no, entrena un modelo de árbol de decisiones y evalúa su rendimiento. Además, muestra el árbol de decisiones visualmente.



Ejemplo simple para ilustrar cómo funciona un árbol de decisiones en el contexto educativo. Supongamos que queremos predecir si un estudiante aprobará un examen basándonos en dos características: "Horas de estudio" y "Asistencia a clases". Vamos a construir un árbol de decisiones para este propósito.

# Generar datos ficticios
estudiantes = 100
horas_estudio = np.random.uniform(1, 10, estudiantes)
asistencia = np.random.choice([0, 1], size=estudiantes, p=[0.3, 0.7])

# Crear DataFrame
data = pd.DataFrame({'Horas_Estudio': horas_estudio, 'Asistencia': asistencia})

# Definir función para etiquetar si un estudiante aprueba o no
def etiquetar_aprobacion(row):
    if row['Horas_Estudio'] >= 5 and row['Asistencia'] == 1:
        return 1  # Aprueba
    else:
        return 0  # No aprueba

data['Aprobacion'] = data.apply(etiquetar_aprobacion, axis=1)

# Dividir datos en conjunto de entrenamiento y prueba
X = data[['Horas_Estudio', 'Asistencia']]
y = data['Aprobacion']

# Crear modelo de árbol de decisiones
modelo_arbol = DecisionTreeClassifier(random_state=42)
modelo_arbol.fit(X, y)

# Visualizar el árbol de decisiones en forma de texto
tree_rules = export_text(modelo_arbol, feature_names=['Horas_Estudio', 'Asistencia'])
print("Reglas del Árbol de Decisiones:\n", tree_rules)

Reglas del Árbol de Decisiones:

-----Horas de Estudio  menor o igual a 5.35

         ---- Class: 0

---- Horas Estudio mayor a 5.35

         ----- Asistencia menor o igual a 0.50

                  ---- Class: 0

         ----- Asistencia mayor a 0.50

                  ---- Class: 1

Este código generará un archivo PDF llamado "arbol_decisiones.pdf" que contiene la representación gráfica del árbol de decisiones. Puedes abrir el archivo PDF para visualizar el árbol y entender cómo se toman las decisiones en base a las características proporcionada.

Este código utiliza un modelo de árbol de decisiones para clasificar si un estudiante aprueba o no en función de las horas de estudio y la asistencia a clases. La visualización del árbol de decisiones proporcionará una representación gráfica de cómo se toman las decisiones basadas en las características dadas. Recuerda que en situaciones del mundo real, se necesitarían datos más significativos y ajustes en el modelo para obtener resultados más precisos.

La importancia de las características y la poda del árbol son aspectos importantes en el análisis y mejora de modelos de árboles de decisión. Aquí te proporciono información sobre ambos temas:

Análisis de la Importancia de las Características:

Después de entrenar un modelo de árbol de decisiones, puedes acceder a la importancia de las características. La importancia de las características indica cuánto contribuye cada característica a las decisiones tomadas por el árbol. Puedes obtener esta información a través del atributo `feature_importances_` del modelo.

ANÁLISIS DE LA IMPORTANCIA DE LAS CARACTERÍSTICAS Y LA PODA DEL ÁRBOL EN BASE A LA INFORMACION BRINDADA.

La importancia de las características y la poda del árbol son aspectos importantes en el análisis y mejora de modelos de árboles de decisión. Aquí te proporciono información sobre ambos temas:

Análisis de la Importancia de las Características:

Después de entrenar un modelo de árbol de decisiones, puedes acceder a la importancia de las características. La importancia de las características indica cuánto contribuye cada característica a las decisiones tomadas por el árbol. Puedes obtener esta información a través del atributo `feature_importances_` del modelo.

# Obtener importancia de las características
importancias_caracteristicas = modelo_arbol.feature_importances_

# Crear un DataFrame para mostrar las importancias
importancias_df = pd.DataFrame({'Caracteristica': X.columns, 'Importancia': importancias_caracteristicas})
importancias_df = importancias_df.sort_values(by='Importancia', ascending=False)

# Visualizar la importancia de las características
plt.figure(figsize=(8, 5))
plt.bar(importancias_df['Caracteristica'], importancias_df['Importancia'])
plt.xlabel('Característica')
plt.ylabel('Importancia')
plt.title('Importancia de las Características')
plt.show()


Este código crea un gráfico de barras que muestra la importancia relativa de cada característica en la toma de decisiones del árbol. Puedes analizar este gráfico para entender qué características son más relevantes para la predicción.

Poda del Árbol:

La poda del árbol es un proceso mediante el cual se eliminan ciertas ramas (nodos y hojas) del árbol para evitar sobreajuste y mejorar la generalización del modelo. Puedes controlar la complejidad del árbol ajustando parámetros como la profundidad máxima.

# Obtener importancia de las características
importancias_caracteristicas = modelo_arbol.feature_importances_

# Crear un DataFrame para mostrar las importancias
importancias_df = pd.DataFrame({'Caracteristica': X.columns, 'Importancia': importancias_caracteristicas})
importancias_df = importancias_df.sort_values(by='Importancia', ascending=False)

# Visualizar la importancia de las características
plt.figure(figsize=(8, 5))
plt.bar(importancias_df['Caracteristica'], importancias_df['Importancia'])
plt.xlabel('Característica')
plt.ylabel('Importancia')
plt.title('Importancia de las Características')
plt.show()


Este código crea un árbol de decisiones con una profundidad máxima de 3. Puedes ajustar este valor según tus necesidades para evitar sobreajuste.

Ambos análisis te ayudarán a comprender mejor el modelo y a optimizar su rendimiento en base a la relevancia de las características y la complejidad del árbol.

Conclusiones y reflexiones: La importancia conocer estas herramientas como el árbol de decisiones (aprendizaje supervisado) y el desarrollo de un modelo de árbol de decisiones para un caso de estudio para predecir si un estudiante aprobara o no un examen son de gran ayuda para la practica en la docencia.


Comentarios

Entradas populares de este blog

DIAGNÓSTICO EN PERIODONTITIS EN ODONTOLOGÍA: APLICACIÓN DEL ALGORITMO NAIVE BAYES EN APRENDIZAJE SUPERVISADO.

DESARROLLANDO UN DATA SET EN PYTHON. DATOS DE ESTUDIANTES: NOMBRES EDADES Y CALIFICACIONES.

MODELO PARA PREDECIR LAS CALIFICACIONES DE LOS ESTUDIANTES EN FUNCIÓN DE LAS HORAS DE ESTUDIO.