Estás leyendo la publicación: Manejo de datos desequilibrados con pesos de clase en regresión logística
La regresión logística es una de las técnicas de aprendizaje automático supervisado que se utilizan para tareas de clasificación. La mayoría de las veces, los conjuntos de datos de clasificación tendrán un desequilibrio de clase con una determinada clase con más muestras y ciertas clases con una cantidad muy inferior de muestras. El uso de un conjunto de datos desequilibrado para la construcción del modelo daría cuenta de la predicción incorrecta y sería más favorable para las clases con más muestras. Entonces, en este artículo, intentemos comprender la importancia de los pesos de clase en la regresión logística y por qué es necesario equilibrar los pesos de clase para generar un modelo confiable.
Tabla de contenido
- ¿Qué son los pesos de clase?
- Problemas asociados con pesos de clase desequilibrados
- Comprender la importancia de los pesos de clase
- Pasos para calcular el peso de la clase
- Resumen
¿Qué son los pesos de clase?
Los pesos de clase son terminología utilizada para tareas de clasificación donde cada categoría del conjunto de datos recibirá ciertos pesos de acuerdo con la frecuencia de ocurrencia de cada categoría. Por lo tanto, los pesos de clase serán responsables de otorgar pesos iguales para todas las categorías en las actualizaciones de gradiente. El uso de pesos de clase desequilibrados será responsable del sesgo hacia las categorías más frecuentes en los datos. Para obtener un modelo de clasificación más confiable e imparcial, es importante tener una distribución uniforme de los pesos de las clases. La distribución uniforme de los pesos de las clases también generará varios parámetros como la precisión, la recuperación y la puntuación F1, ya que los pesos de las clases se equilibrarían.
Ahora intentemos comprender los problemas asociados con un desequilibrio en los pesos de las clases.
¿Está buscando un repositorio completo de bibliotecas de Python utilizadas en ciencia de datos, echa un vistazo aquí.
Problemas asociados con pesos de clase desequilibrados
El principal problema asociado con los pesos de clase desequilibrados es la precisión. La precisión producida en el mundo es alta, pero lo que importa es la corrección de la precisión. Para las ponderaciones de clases desequilibradas, la precisión obtenida sería generalmente alta, ya que estaría sesgada hacia la clase más frecuente, ya que daría cuenta de ponderaciones de clases más altas.
Supongamos que se utilizan datos de atención médica o datos empresariales y hay un desequilibrio de pesos de clase. Entonces, si no se aborda el desequilibrio de clases en los datos, se darían cuenta de las malas interpretaciones del modelo. Además, ciertos parámetros como falsos positivos y falsos negativos resultarán ser 0, ya que el modelo se inclinará más hacia la categoría de ocurrencia frecuente.
Comprender la importancia de los pesos de clase
Para comprender la importancia de los pesos de clase, consideremos un conjunto de datos de clasificación que tiene un desequilibrio en la distribución de la variable objetivo.
Aquí se está utilizando un conjunto de datos de atención médica y analicemos la distribución desigual de la variable objetivo a través de un gráfico de conteo.
sns.countplot(y)
Aquí podemos ver que la variable objetivo está enormemente desequilibrada donde la clase 0 tiene pesos de clase más altos en comparación con la clase 1. Así que construyamos una regresión logística con la variable objetivo de desequilibrio e intentemos evaluar ciertos parámetros del modelo.
X=df.drop(‘trazo’,eje=1) y=df[‘stroke’]
from sklearn.model_selection import train_test_split X_train,X_test,Y_train,Y_test=train_test_split(X,y,test_size=0.2,random_state=42) from sklearn.linear_model import LogisticRegression lr_imb=LogisticRegression(random_state=42) lr_imb_model=lr_imb.fit(X_train , Y_train) y_pred=lr_imb_model.predict(X_test) print(‘Informe de clasificación de regresión logística desequilibrada \n’,classification_report(Y_test,y_pred))
plot_confusion_matrix(lr_imb_model,X_test,Y_test)
Del informe de clasificación, podemos observar que la media armónica (puntuación F1) es mayor para la clase con mayor ponderación, y para la clase con menor ponderación, la media armónica y otros parámetros son 0. Además, el modelo ha arrojado una precisión puntuación del 94%, lo que significa que el modelo haría predicciones incorrectas y estaría más inclinado a las clases que ocurren con frecuencia. Entonces, este es el principal problema asociado con los pesos de clase desequilibrados y resulta que al equilibrar los pesos de clase se obtiene un modelo imparcial y más confiable.
Pesos de clase de equilibrio
Los pesos de clase se pueden equilibrar utilizando el modelo de regresión logística simplemente declarando el parámetro class_weight como equilibrado en el modelo de regresión logística. Los pesos de clase se pueden equilibrar automáticamente sin pasar por el parámetro estándar como pesos de clase equilibrados o se pueden proporcionar pesos aleatorios para cada una de las clases a cada una de las categorías en los datos.
Ahora veamos cómo equilibrar los pesos utilizando el “parámetro equilibrado” predefinido de la biblioteca de aprendizaje de scikit.
Uso del parámetro “equilibrado” para pesos de clase
Ahora el modelo de regresión logística se ajusta con pesos de clase como parámetro estándar como “equilibrado”. El parámetro está disponible fácilmente en los modelos de scikit-learn. Veamos cómo usar este parámetro y obtener un modelo de regresión logística y evaluar ciertos parámetros.
lr_bal=LogisticRegression(random_state=42,class_weight=”balanced”) lr_bal_model=lr_bal.fit(X_train,Y_train) y_pred_bal=lr_bal_model.predict(X_test) print(‘Informe de clasificación para clases equilibradas \n’,classification_report(Y_test,y_pred_bal) )
plot_confusion_matrix(lr_bal_model,X_test,Y_test)
Aquí podemos ver que después de usar los pesos de clase como balanceados mientras ajustamos el modelo de regresión logística, podemos ver que la precisión se ha reducido en comparación con el modelo de desequilibrio, pero la media armónica para la clase más baja ha visto un aumento. Otros parámetros como la precisión, la recuperación y la puntuación F1 también han experimentado un aumento, lo que ayuda a los ingenieros de aprendizaje automático a realizar interpretaciones adecuadas del modelo.
Este modelo se puede hiperafinar aún más para producir parámetros y rendimiento aún mejores. Además, si también se evalúa la matriz de confusión, podemos ver que podemos generar los parámetros correctos, como falso positivo y falso negativo, lo que muestra que el modelo no está inclinado o sesgado hacia la clase que ocurre con frecuencia.
Equilibrar pesos de clase usando el diccionario como parámetro
Los pesos de clase se equilibrarán utilizando un diccionario donde las claves del diccionario son las clases del conjunto de datos y las claves del diccionario serían el porcentaje de pesos que se asignarían a cada una de las clases de datos. Entonces, veamos cómo usar un diccionario como parámetro para los pesos de clase y evaluar ciertos parámetros del modelo.
lr_bal2=Regresión logística(estado_aleatorio=42,peso_clase={0: 0.2,1: 0.8}).fit(X_tren,Y_tren) y_pred_bal2=lr_bal2.predict(X_test) print(classification_report(Y_test,y_pred_bal2))
plot_confusion_matrix(lr_bal2,X_test,Y_test)
Entonces, después de usar una distribución aleatoria de pesos entre las clases en los datos, hemos visto un aumento en la precisión del modelo en comparación con el uso del parámetro “equilibrado”, pero aquí se muestra un balance de pesos de clase con un porcentaje de 80 y 20. Entonces, si las clases están equilibradas por igual o casi iguales, el modelo producirá un rendimiento similar al modelo obtenido al usar el parámetro “equilibrado”.
Así es como el desequilibrio y el equilibrio de los pesos de clase explican el rendimiento del modelo. En general, es una buena práctica usar datos equilibrados para generar un modelo confiable y obtener las predicciones correctas del modelo. Ahora intentemos comprender que los pesos de clase se calculan para diferentes parámetros de peso de clase.
Pasos para calcular los pesos de clase
Los pesos de clase para cualquier problema de clasificación se pueden obtener utilizando bibliotecas estándar de scikit-learn. Pero es importante comprender cómo scikit-learn calcula internamente los pesos de clase. Los pesos de clase generalmente se calculan utilizando la fórmula que se muestra a continuación.
w(j)=n/Kn(j)
w(j) = pesos de las clases
n = número de observaciones
K = Número total de clases
n(j) = Número de observaciones en cada clase
Por lo tanto, la biblioteca de utilidades de scikit-learn usa internamente esta fórmula para calcular los pesos de clase con diferentes conjuntos de parámetros que se usan para los pesos de clase. Ahora veamos cómo usar la biblioteca scikit-learn utils para calcular los pesos de clase en diferentes instancias.
Cálculo de pesos de clase de desequilibrio
Para calcular los pesos de clase, se utiliza la función incorporada “compute_class_weight” como se muestra a continuación y, en consecuencia, los pesos de clase para las clases minoritarias y mayoritarias se pueden calcular como se muestra a continuación.
# Calcula pesos usando sklearn
sklearn_weights1 = class_weight.compute_class_weight(class_weight=Ninguno,y=df[‘stroke’],clases=np.único(y)) sklearn_pesos1
Aquí los pesos asignados a ambas clases son iguales. Calculemos los pesos para cada una de las clases.
# Compara los valores print(f’Los pesos para la clase mayoritaria son {sklearn_weights1[0]*2:.3f}’) print(f’Los pesos para la clase minoritaria son {sklearn_weights1[1]*2:.3f}’)
Aquí podemos ver que para las clases desequilibradas, los pesos asignados a las clases mayoritarias y minoritarias son los mismos, lo que explica el sesgo del modelo hacia las clases mayoritarias.
Cálculo de pesos de clase después de usar el parámetro “equilibrado”
Los pesos de clase se pueden calcular después de usar el parámetro “equilibrado” como se muestra a continuación.
sklearn_weights2 = class_weight.compute_class_weight(class_weight=”balanced”,y=df[‘stroke’],classes=np.unique(y)) Sklearn_weights2
Aquí podemos ver que se le da más ponderación a la clase 1 ya que tiene una menor cantidad de muestras en comparación con la clase 0. Así que tratemos de obtener las ponderaciones que se pueden interpretar fácilmente como se muestra a continuación.
# Compara los valores print(f’Los pesos para la clase mayoritaria son {sklearn_weights2[0]*2:.3f}’) print(f’Los pesos para la clase minoritaria son {sklearn_weights2[1]*2:.3f}’)
Entonces, aquí podemos ver que el parámetro “equilibrado” ha proporcionado más peso a la clase minoritaria en comparación con la clase mayoritaria, lo que nos ayuda a generar un modelo más confiable.
Cálculo de pesos de clase utilizando el diccionario como parámetro
Aquí, los pesos de clase se calcularán proporcionando porcentajes aleatorios de distribución de pesos para cada clase de datos, como se muestra a continuación.
# Calcular pesos usando sklearn dict1={0: 0.2,1: 0.8} sklearn_weights3 = class_weight.compute_class_weight(class_weight=dict1,y=df[‘stroke’],clases=np.único(y)) sklearn_pesos3
Aquí podemos ver que, como se especifica, el 20 % de los pesos se aplica a la clase 0 y el 80 % del peso se aplica a la clase 1 del conjunto de datos. Ahora intentemos interpretar los pesos de clase como se muestra a continuación para facilitar la comprensión.
print(f’Los pesos para la clase mayoritaria son {sklearn_weights3[0]*2:.3f}’) print(f’Los pesos para la clase minoritaria son {sklearn_weights3[1]*2:.3f}’)
Así es como se imponen los pesos de clase para diferentes clases en el conjunto de datos mediante el uso del peso que se proporciona en el diccionario para cada una de las clases.
Resumen
Los pesos de clase juegan un papel muy importante en cualquiera de los modelos de aprendizaje automático de clasificación. Entonces, en este artículo, hemos visto cómo los pesos de clase y el equilibrio de los pesos de clase son importantes para obtener un modelo confiable. El equilibrio de peso de clase es muy esencial para obtener un modelo libre de sesgos que pueda tomarse para las predicciones correctas. El desequilibrio de los pesos de clase explica las predicciones defectuosas y las interpretaciones falsas del modelo. Por lo tanto, es muy importante equilibrar los pesos de clase para obtener un modelo confiable que pueda usarse para predicciones en tiempo real.