Matriz de Confusion con el Modelo de Soporte Vectorial test y entrenamiento

 Introducción.-

Los modelos de aprendizaje automático se construyen con el objetivo de hacer predicciones o tomar decisiones basadas en datos. Para evaluar la eficacia de estos modelos, es crucial separar los datos disponibles en dos conjuntos distintos: uno para el entrenamiento y otro para el testeo. Esta práctica es fundamental en el campo de la ciencia de datos y el aprendizaje automático, y a continuación, se presenta una introducción a la misma.

Concepto de Entrenamiento y Testeo.-

Entrenamiento:

El conjunto de entrenamiento es utilizado para construir y afinar el modelo. Durante este proceso, el algoritmo de aprendizaje automático utiliza estos datos para aprender patrones, relaciones y características.
En el entrenamiento, se ajustan los parámetros del modelo para minimizar errores, como la diferencia entre las predicciones del modelo y los valores reales.
Testeo:

El conjunto de testeo, por otro lado, se utiliza para evaluar la efectividad del modelo. Son datos que el modelo no ha visto durante su entrenamiento y sirven para simular cómo el modelo se comportaría en situaciones del mundo real.
Al usar un conjunto de testeo, se puede medir la precisión, la sensibilidad, la especificidad y otras métricas relevantes para evaluar el rendimiento del modelo.
Importancia de la Separación
Evitar el Sobreajuste: Una de las razones más importantes para separar los datos en conjuntos de entrenamiento y testeo es evitar el sobreajuste. El sobreajuste ocurre cuando un modelo se ajusta demasiado bien a los datos de entrenamiento, capturando incluso el ruido y las fluctaciones aleatorias, lo que resulta en un pobre rendimiento en datos no vistos.

Evaluación Realista: 

Al separar los datos, se puede obtener una evaluación más realista de cómo el modelo se desempeñará en el mundo real. Un buen modelo debe no solo aprender de los datos de entrenamiento sino también generalizar bien a nuevos datos.

Métodos Comunes

División de Datos: La forma más común de separar los datos es mediante una división aleatoria, donde una porción típica (por ejemplo, 70% para entrenamiento y 30% para testeo) se asigna a cada conjunto.

Validación Cruzada: Otra técnica es la validación cruzada, donde los datos se dividen en varios subconjuntos y el modelo se entrena y se prueba varias veces, cada vez con diferentes subconjuntos de datos.

Procedimiento.-

Cuando realizamos modelos hay 3 conjuntos de datos fundamentales:
Conjunto de datos de entrenamiento: son los datos que entrenan los modelos
Conjunto de datos de validación: selecciona el mejor de los modelos entrenados
Conjunto de datos de test: Nos ofrece el error real cometido con el modelo seleccionado
Para entender mejor su importancia y como funcionan he preparado el siguiente 



Una empresa de telecomunicaciones de cara a mejorar la efectividad de sus campañas comerciales decide realizar un modelo de propensión a la desconexión. Se define un universo como los clientes activos a ultimo día de un mes y se determina cuales de ellos han desconectado nuestra línea al mes siguiente. Podría ser recomendable utilizar varias cosechas de clientes para evitar efectos estacionales o campañas agresivas de la competencia. Para el universo seleccionado la tasa de desconexión se sitúa en un 12%. Este universo hemos de dividirlo en 2 partes. La primera de ellas formará el conjunto de datos de entrenamiento y validación y aquí es importante realizar un sobremuestreo estratificado del número de desconexiones para mejorar el entrenamiento del modelo. El estrato será tiene evento VS no tiene evento. En el esquema gráfico aumento la proporción de desconexiones hasta un 50%, no es una proporción imprescindible, si nuestra muestra no nos permite esa proporción algunos expertos con los que he trabajado y yo mismo aseguramos que un 20% de eventos puede ser suficiente; pero si es posible buscaremos el 50-50. En un árbol de decisión (por ejemplo) este sobremuestreo nos identificaría ramas extremas. Una vez definido el conjunto de datos sobremuestreado lo separamos en entrenamiento y validación. Este dinosaurio siempre deja la proporción 70-30…

El conjunto de datos de test será un subconjunto del universo inicial y es el que de verdad nos indica como funciona el error del modelo. Volviendo al tema de las cosechas para evitar la estacionalidad en el ejemplo concreto de desconexiones de clientes en operadora de telefonía podríamos emplear como test todos los clientes de otro mes distinto al que empleamos para la creación del universo inicial.

La metodología de entrenamiento, validación y test nos permite aislar las relaciones aleatorias entre variables. Imaginemos que algún desequilibrado introduce en una máquina letra a letra el antiguo testamento en hebreo, tendremos un gran número de parámetros para un modelo y de forma aleatoria se pueden producir estructuras sintácticas debidas al azar. Si alguien detecta estas estructuras sintácticas, se inventa un código secreto y escribe un libro se puede hinchar a venderlo.

Exploracion de datos.-

A continuación se realizara con código python la data simulada de dos variables, var1  y var2 etiquetadas con y  (clase 0  y clase 1) y sus respectivas gráficas de Exploracion de datos.

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
from sklearn.metrics import confusion_matrix
from sklearn.preprocessing import StandardScaler

# Fijar la semilla para reproducibilidad
np.random.seed(0)

# Simular datos
X1 = np.random.normal(0, 1, (100, 2))
X2 = np.random.normal(2, 1, (100, 2))
X = np.vstack((X1, X2))
y = np.array([0] * 100 + [1] * 100)

# Convertir a DataFrame para el análisis exploratorio
df = pd.DataFrame(X, columns=['var1', 'var2'])
# etiquetas para los puntos
df['Class'] = y

# Análisis exploratorio
# plt.figure(figsize=(12, 5))

# Gráfico de dispersión
#plt.subplot(1, 2, 1)
sns.scatterplot(data=df, x='var1', y='var2', hue='Class')
plt.title('Scatter Plot de las variables 1 y 2')

# Pairplot
#plt.subplot(1, 2, 2)
sns.pairplot(data=df, hue='Class', diag_kind='kde')
plt.suptitle('Pairplot de las variables 1 y 2', y=1.02)  # Ajustar para título

plt.show()




En esta ocasion se utilizará el modelo SVC (Máquina de soporte vectorial) y dividir la data en 30% para test y 70% para entrenamiento, para luego mostrar la matriz de confusión

# Dividir en entrenamiento y prueba
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# Estandarización de los datos
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

# Entrenar el modelo SVM
svm_model = SVC(kernel='linear')
svm_model.fit(X_train, y_train)

# Predecir y calcular la matriz de confusión con la data test
y_pred = svm_model.predict(X_test)
conf_matrix = confusion_matrix(y_test, y_pred)

# Mostrar la matriz de confusión
sns.heatmap(conf_matrix, annot=True, fmt='g')
plt.xlabel('Predicted')
plt.ylabel('True')
plt.title('Matriz de Confusión')
plt.show()



La matriz de confusion muestra una evaluación acerca del grado de clasificación y de aprendizaje del modelo escogido, es decir, es una tabla cruzada entre los valores pronosticados versus los observados para luego obtener una serie de metricas de evaluación como ser:

Precisión: proporción de indentificaciones positivas que  fueron realmente correctas 
Sensibilidad (Recall): Es la proporción de positivos reales que fueron identificados correctamente.
Especificidad: Es la proporción de negativos reales que fueron identificados correctamente.
Puntaje F1: Es una medida que combina la precisión y la sensibilidad. Se calcula como el promedio armónico de la precisión y la sensibilidad

Estas métricas las podemos programar en python ya que el objeto que guarda la matriz de confusion se encuentra en: conf_matrix como se muestra a continuación.

# Ejemplo de valores de TN, FP, FN, TP
a, b, c, d = conf_matrix[0,0], conf_matrix[0,1], conf_matrix[1,0], conf_matrix[1,1]  

print("TN = VN = Verdaderos negativos = {} ".format(a))
print("FP = FP = Falsos positivos     = {} ".format(b))
print("FN = FN = Falsos negativos     = {} ".format(c))
print("TP = VP = Verdaderos positivos = {} ".format(d))

# Cálculo de las métricas
precisión = d / (d + b)
sensibilidad = d / (d + c)
especificidad = a / (a + b)
puntaje_f1 = 2 * (precisión * sensibilidad) / (precisión + sensibilidad)

print("Accuracy = precision = {}".format(round(precisión,2)))
print("Sensibilidad = {}".format(round(sensibilidad,2)))
print("Especificidad = {}".format(round(especificidad,2)))
print("Puntaje F1 = {}".format(round(puntaje_f1,2)))

print("\n El modelo propuesto de SVM con la data de entrenamiento tiene \n un nivel de precisión del {}%".format(round(precisión,2)*100))

TN = VN = Verdaderos negativos = 29 FP = FP = Falsos positivos = 2 FN = FN = Falsos negativos = 3 TP = VP = Verdaderos positivos = 26 Accuracy = precision = 0.93 Sensibilidad = 0.9 Especificidad = 0.94 Puntaje F1 = 0.91 El modelo propuesto de SVM con la data de entrenamiento tiene un nivel de precisión del 93.0%


Conclusión.-

La práctica de dividir los datos en conjuntos de entrenamiento y testeo es fundamental en el aprendizaje automático. Permite a los científicos de datos y a los ingenieros de machine learning construir modelos que no solo se desempeñen bien en los datos conocidos, sino que también mantengan su rendimiento en situaciones nuevas y desconocidas. 

A continuación, se presenta una conclusión detallada sobre el estudio de modelos de entrenamiento utilizando los resultados de la matriz de confusión:

Comprensión Profunda del Rendimiento del Modelo:

La matriz de confusión permite una evaluación detallada más allá de las métricas simples como la precisión. Ofrece una vista desglosada de los errores del modelo, distinguiendo entre falsos positivos y falsos negativos, así como verdaderos positivos y verdaderos negativos.
Esta desagregación es vital para entender en qué condiciones específicas el modelo es eficiente y en cuáles no.
Equilibrio entre Sensibilidad y Especificidad:

En muchos contextos, especialmente en los médicos y de seguridad, el equilibrio entre la sensibilidad (la capacidad de detectar verdaderos positivos) y la especificidad (la capacidad de detectar verdaderos negativos) es crucial.
La matriz de confusión ayuda a identificar si un modelo está sesgado hacia una sobre la otra, lo cual es esencial para ajustar el umbral de decisión del modelo según las necesidades específicas del uso.
Identificación de Sobreajuste o Subajuste:

Al comparar las matrices de confusión de los conjuntos de entrenamiento y de testeo, se puede identificar si el modelo está sobreajustado (demasiado ajustado a los datos de entrenamiento) o subajustado (demasiado simplificado y no captura la complejidad de los datos).
Guía para la Mejora del Modelo:

El análisis detallado proporcionado por la matriz de confusión puede orientar los esfuerzos para mejorar el modelo. Por ejemplo, un alto número de falsos negativos podría indicar la necesidad de hacer el modelo más sensible.
Importancia en Aplicaciones Específicas:

En algunos campos como el diagnóstico médico, la detección de fraude o la seguridad, las consecuencias de los falsos negativos y falsos positivos pueden ser significativas. La matriz de confusión proporciona una perspectiva crucial sobre estos aspectos.
Evaluación Holística del Modelo:

Las métricas derivadas de la matriz de confusión, como la precisión, el recall, la especificidad y el puntaje F1, ofrecen una evaluación holística del modelo, permitiendo a los científicos de datos y desarrolladores hacer comparaciones informadas entre diferentes modelos o enfoques.
Adaptabilidad a Diferentes Escenarios:

El análisis basado en la matriz de confusión es adaptable a diferentes escenarios y requisitos. Dependiendo del coste relativo de los falsos positivos frente a los falsos negativos en un caso de uso específico, se puede ajustar el modelo en consecuencia.
En conclusión, la matriz de confusión es una herramienta indispensable en el análisis de modelos de aprendizaje automático. Permite una comprensión detallada y matizada del rendimiento del modelo y proporciona información crucial para la mejora y ajuste del modelo, asegurando que sea robusto, confiable y adecuado para su aplicación en situaciones reales.

Comentarios

Entradas populares de este blog

Utilizando Gráficas Multivariantes con Python