Reclutamiento en campus: un problema de clasificación con regresión logística

Reclutamiento en campus: un problema de clasificación con regresión logística

Nodo de origen: 1996810

Introducción

En este proyecto, nos centraremos en los datos de la India. Y nuestro objetivo es crear un modelo predictivo, como Regresión Logística, etc. para que cuando demos las características de un candidato, el modelo pueda predecir si reclutará.

El  datos gira en torno a la temporada de colocación de una escuela de negocios en la India. El conjunto de datos tiene varios factores sobre los candidatos, como experiencia laboral, porcentaje de examen, etc. Finalmente, contiene el estado de los detalles de contratación y remuneración.

Problema de ciencia de datos con regresión logística

El reclutamiento del campus es una estrategia para buscar, involucrar y contratar jóvenes talentos para pasantías y puestos de nivel de entrada. A menudo implica trabajar con centros universitarios de servicios profesionales y asistir a ferias profesionales para conocer en persona a estudiantes universitarios y recién graduados.

Este artículo fue publicado como parte del Blogatón de ciencia de datos.

Índice del contenido

  1. Pasos involucrados en la solución del problema
  2. Preparar datos
  3. Construya un modelo de regresión logística
  4. Resultados del modelo de regresión logística
  5. Conclusión

Pasos involucrados en la solución del problema

En este artículo, importaremos ese conjunto de datos, lo limpiaremos y luego lo prepararemos para construir un modelo de regresión logística. Nuestros objetivos aquí son los siguientes:

Primero, vamos a preparar nuestro conjunto de datos para clasificación binaria. Ahora, ¿qué quiero decir? cuando tratamos de predecir un valor continuo, como el precio de un apartamento, puede ser cualquier número entre cero y muchos millones de dólares. Lo llamamos un problema de regresión.

Pero en este proyecto, las cosas son un poco diferentes. En lugar de predecir un valor continuo, tenemos grupos o clases discretos que intentamos predecir entre ellos. Entonces, esto se llama un problema de clasificación, y debido a que en nuestro proyecto, solo tendremos dos grupos entre los que trataremos de elegir, lo que lo convierte en una clasificación binaria.

El segundo objetivo es crear un modelo de regresión logística para predecir el reclutamiento. Y nuestro tercer objetivo es explicar las predicciones de nuestro modelo utilizando la razón de probabilidades.

Ahora, en términos del flujo de trabajo de aprendizaje automático, los pasos que seguiremos y algunas de las cosas nuevas que aprenderemos en el camino. Entonces, en la fase de importación, prepararemos nuestros datos para trabajar con un objetivo binario. En la fase de exploración, veremos el equilibrio de clases. Entonces, básicamente, ¿qué proporción de candidatos fue tercera y qué proporción no lo fue? y en la fase de codificación de características, codificaremos nuestras características categóricas. En la parte dividida, haremos una prueba aleatoria de trenes divididos.

Para la fase de creación de modelos, en primer lugar, estableceremos nuestra línea de base y, dado que usaremos puntajes de precisión, hablaremos más sobre qué es un puntaje de precisión y cómo construir una línea de base cuando esa es la métrica que nos interesa. En segundo lugar, haremos una regresión logística. Y por último, pero no menos importante, tendremos la fase de evaluación. Nos centraremos nuevamente en la puntuación de precisión. Finalmente, para comunicar los resultados, veremos la razón de probabilidades.

Por último, antes de sumergirnos en el trabajo, presentémonos a las bibliotecas que usaremos en el proyecto. Primero, importaremos nuestros datos al cuaderno de Google Colabe en la biblioteca io. Luego, como usaremos un modelo de regresión logística, lo importaremos desde scikit-learn. Después de eso, también de scikit-aprender, importaremos nuestras métricas de rendimiento, la puntuación de precisión y la división de prueba de entrenamiento.

Usaremos matplotlib y marino para nuestra visualización, y NumPy  será sólo para un poco de matemáticas.
Nosotros necesitamos Los pandas para manipular nuestros datos, labelencoder para codificar nuestras variables categóricas y escalador estándar para normalizar los datos. Esas serán las bibliotecas que necesitamos.

Pasemos a preparar los datos.

#import libraries
import io
import warnings import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import seaborn as sns
from sklearn.preprocessing import LabelEncoder
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler warnings.simplefilter(action="ignore", category=FutureWarning)

Preparar datos

Importa

Para comenzar a preparar los datos, hagamos nuestro importante trabajo. Primero, cargamos nuestro archivo de datos y luego debemos colocarlos en un DataFrame `df.`

from google.colab import files
uploaded = files.upload()
# Read CSV file
df = pd.read_csv(io.BytesIO(uploaded["Placement_Data_Full_Class.csv"]))
print(df.shape)
df.head()
Conjunto de datos para regresión logística

Podemos ver nuestro hermoso DataFrame, y tenemos 215 registros y 15 columnas que incluyen el atributo `status`, nuestro objetivo. Esta es la descripción de todas las características.

Regresión logística

Explorar

Ahora tenemos todas estas características que vamos a explorar. Así que comencemos nuestro análisis exploratorio de datos. Primero, echemos un vistazo a la información de este marco de datos y veamos si es posible que debamos conservar alguno de ellos o si debemos eliminarlo.

# Inspect DataFrame
df.info() <class 'pandas.core.frame.DataFrame'>
RangeIndex: 215 entries, 0 to 214
Data columns (total 15 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 sl_no 215 non-null int64 1 gender 215 non-null object 2 ssc_p 215 non-null float64 3 ssc_b 215 non-null object 4 hsc_p 215 non-null float64 5 hsc_b 215 non-null object 6 hsc_s 215 non-null object 7 degree_p 215 non-null float64 8 degree_t 215 non-null object 9 workex 215 non-null object 10 etest_p 215 non-null float64 11 specialisation 215 non-null object 12 mba_p 215 non-null float64 13 status 215 non-null object 14 salary 148 non-null float64
dtypes: float64(6), int64(1), object(8)
memory usage: 25.3+ KB

Ahora, cuando miramos la información `df`, hay un par de cosas que estamos buscando, tenemos 215 filas en nuestro marco de datos, y la pregunta que queremos hacernos es, ¿faltan datos? Y si miramos aquí, parece que no nos faltan datos, excepto la columna de salarios, como era de esperar, debido a los candidatos que no han sido contratados.

Otra preocupación para nosotros aquí es, ¿existen características con fugas que le darían información a nuestro modelo que no tendría si se implementara en el mundo real? Recuerde que queremos que nuestro modelo prediga si un candidato se colocará o no, y queremos que nuestro modelo haga esas predicciones antes de que ocurra el reclutamiento. Por lo tanto, no queremos dar ninguna información sobre estos candidatos después del reclutamiento.

Por lo tanto, está bastante claro que esta función de "salario" brinda información sobre el salario ofrecido por la empresa. Y debido a que este salario es para los aceptados, esta característica aquí constituye una fuga, y tenemos que eliminarla.

df.drop(columns="salary", inplace=True)

Lo segundo que quiero ver son los tipos de datos para estas diferentes funciones. Entonces, mirando estos tipos de datos, tenemos ocho características categóricas con nuestro objetivo y siete características numéricas, y todo es correcto. Entonces, ahora que tenemos estas ideas, tomemos un tiempo para explorarlas más profundamente.

Sabemos que nuestro objetivo tiene dos clases. Hemos colocado candidatos y no colocado candidatos. La pregunta es, ¿cuál es la proporción relativa de esas dos clases? ¿Están sobre el mismo equilibrio? ¿O es uno mucho más que el otro? Eso es algo a lo que debes echarle un vistazo cuando estés haciendo problemas de clasificación. Así que este es un paso significativo en nuestra EDA.

# Plot class balance
df["status"].value_counts(normalize=True).plot( kind="bar", xlabel="Class", ylabel="Relative Frequency", title="Class Balance"
);
Desequilibrio de clases para regresión logística

Nuestra clase positiva 'colocado' representa más del 65 % de nuestras observaciones, y nuestra clase negativa 'No colocado' representa alrededor del 30 %. Ahora, si estos estuvieran súper desequilibrados, como si fueran más de 80 o incluso más que eso, diría que estas son clases desequilibradas. Y tendríamos que trabajar un poco para asegurarnos de que nuestro modelo funcione correctamente. Pero este es un buen equilibrio.

Hagamos otra visualización para notar la conexión entre nuestras funciones y el objetivo. Comencemos con las características numéricas.

Primero, veremos la distribución individual de las características mediante un diagrama de distribución y también veremos la relación entre las características numéricas y nuestro objetivo mediante un diagrama de caja.

fig,ax=plt.subplots(5,2,figsize=(15,35))
for index,i in enumerate(df.select_dtypes("number").drop(columns="sl_no")): plt.suptitle("Visualizing Distribution of Numerical Columns Indivualy and by Class",size=20) sns.histplot(data=df, x=i, kde=True, ax=ax[index,0]) sns.boxplot(data=df, x='status', y=i, ax=ax[index,1]);
"Regresión logística

En la primera columna de nuestro diagrama, podemos ver que todas las distribuciones siguen una distribución normal, y la mayoría de los desempeños educativos de los candidatos están entre 60-80%.

En la segunda columna, tenemos un diagrama de caja doble con la clase 'Colocado' a la derecha y luego la clase 'No colocado' a la izquierda. Para las funciones 'etest_p' y 'mba_p', no hay mucha diferencia en estas dos distribuciones desde la perspectiva de la creación de modelos. Hay una superposición significativa en la distribución de las clases, por lo que estas características no serían un buen predictor de nuestro objetivo. En cuanto al resto de las características, son lo suficientemente distintas como para tomarlas como posibles buenos predictores de nuestro objetivo. Pasemos a las características categóricas. Y para explorarlos, usaremos una gráfica de conteo.

fig,ax=plt.subplots(7,2,figsize=(15,35))
for index,i in enumerate(df.select_dtypes("object").drop(columns="status")): plt.suptitle("Visualizing Count of Categorical Columns",size=20) sns.countplot(data=df,x=i,ax=ax[index,0]) sns.countplot(data=df,x=i,ax=ax[index,1],hue="status")
"Regresión logística

Mirando la trama, vemos que tenemos más candidatos masculinos que femeninos. Y la mayoría de nuestros candidatos no tienen experiencia laboral, pero estos candidatos fueron contratados más que los que tenían. Tenemos candidatos que hicieron comercio como su curso 'hsc' y, además de una licenciatura, los candidatos con formación en ciencias son los segundos más altos en ambos casos.

Una pequeña nota sobre los modelos de regresión logística, aunque son para clasificación, están en el mismo grupo que otros modelos lineales como la regresión lineal, y por esa razón, ya que ambos son modelos lineales. También debemos preocuparnos por el tema de la multicolinealidad. Entonces, necesitamos crear una matriz de correlación y luego trazarla en un mapa de calor. No queremos ver todas las características aquí, queremos ver solo las características numéricas y no queremos incluir nuestro objetivo. Ya que si nuestro objetivo se correlaciona con algunas de nuestras características, eso es muy bueno.

corr = df.select_dtypes("number").corr()
# Plot heatmap of `correlation`
plt.title('Correlation Matrix')
sns.heatmap(corr, vmax=1, square=True, annot=True, cmap='GnBu');
matriz de correlación

Aquí están el azul claro, que significa poca o ninguna correlación, y el azul oscuro, con el que tenemos una correlación más alta. Así que queremos estar atentos a esos azul oscuro. Podemos ver una línea azul oscuro, una línea diagonal que baja por el centro de este gráfico. Esas son las características que están correlacionadas consigo mismas. Y luego, vemos algunos cuadrados oscuros. Eso significa que tenemos un montón de correlaciones entre características.

En el paso final de nuestra EDA, debemos verificar la cardinalidad alta-baja en las características categóricas. La cardinalidad se refiere al número de valores únicos en una variable categórica. Alta cardinalidad significa que las características categóricas tienen una gran cantidad de valores únicos. No hay un número exacto de valores únicos que hagan que una característica sea de alta cardinalidad. Pero si el valor de la característica categórica es único para casi todas las observaciones, por lo general se puede descartar.

# Check for high- and low-cardinality categorical features
df.select_dtypes("object").nunique() gender 2
ssc_b 2
hsc_b 2
hsc_s 3
degree_t 3
workex 2
specialisation 2
status 2
dtype: int64

No veo ninguna columna donde el número de valores únicos sea uno o algo muy alto. Pero creo que hay una columna de tipo categórico que nos falta aquí. Y la razón es que no está codificado como un objeto sino como un número entero. La columna 'sl_no' no es un número entero en el sentido que conocemos. Estos candidatos están clasificados en algún orden. Solo una etiqueta de nombre única, y el nombre es como una categoría, ¿verdad? Así que esta es una variable categórica. Y no tiene ninguna información, así que tenemos que dejarlo.

df.drop(columns="sl_no", inplace=True)

Características Codificación

Terminamos nuestro análisis, y lo siguiente que debemos hacer es codificar nuestras características categóricas, usaré el 'LabelEncoder'. La codificación de etiquetas es una técnica de codificación popular para manejar variables categóricas. Con el uso de esta técnica, a cada etiqueta se le asigna un número entero único según el orden alfabético.

lb = LabelEncoder () cat_data = ['gender', 'ssc_b', 'hsc_b', 'hsc_s', 'degree_t', 'workex', 'specialisation', 'status']
for i in cat_data: df[i] = lb.fit_transform(df[i]) df.head()
salida de código

Mini Split

Importamos y limpiamos nuestros datos. Hemos realizado un poco de análisis de datos exploratorios, y ahora necesitamos dividir nuestros datos. Tenemos dos tipos de división: división vertical o características-objetivo y división horizontal o conjuntos de prueba de tren. Empecemos con la vertical. Crearemos nuestra matriz de características 'X' y el vector objetivo 'y'. Nuestro objetivo es el "estado". Nuestras características deben ser todas las columnas que quedan en el 'df'.

#vertical split
target = "status"
X = df.drop(columns = target)
y = df[target]

Los modelos generalmente funcionan mejor cuando tienen datos normalizados para entrenar, entonces, ¿qué es la normalización? Normalización es transformar los valores de varias variables en un rango similar. Nuestro objetivo es normalizar nuestras variables. Entonces, sus rangos de valores serán de 0 a 1. Hagámoslo, y usaré el "StandardScaler".

scaler = StandardScaler()
X = scaler.fit_transform(X)

Ahora hagamos los conjuntos de prueba de tren o división horizontal. Necesitamos dividir nuestros datos (X e y) en conjuntos de entrenamiento y prueba usando una división de prueba de tren aleatoria. nuestro conjunto de prueba debe ser el 20% de nuestros datos totales. Y no nos olvidamos de establecer un estado aleatorio para la reproducibilidad.

X_train, X_test, y_train, y_test = train_test_split( X, y, test_size = 0.2, random_state = 42 ) print("X_train shape:", X_train.shape)
print("y_train shape:", y_train.shape)
print("X_test shape:", X_test.shape)
print("y_test shape:", y_test.shape) X_train shape: (172, 12)
y_train shape: (172,)
X_test shape: (43, 12)
y_test shape: (43,)

Construya un modelo de regresión logística

Base

Entonces, ahora debemos comenzar a construir nuestro modelo y debemos comenzar a ordenar para establecer nuestra línea de base. Recuerda que el tipo de problema que estamos tratando es un problema de clasificación, y existen diferentes métricas para evaluar los modelos de clasificación. En lo que quiero centrarme es en la puntuación de precisión.

Ahora, ¿cuál es la puntuación de precisión? La puntuación de precisión en el aprendizaje automático es una métrica de evaluación que mide la cantidad de predicciones correctas realizadas por un modelo con respecto a la cantidad total de predicciones realizadas. Lo calculamos dividiendo el número de predicciones correctas por el número total de predicciones. Entonces, lo que eso significa es que la puntuación de precisión oscila entre 0 y 1. Cero no es bueno. Ahí es donde no quieres estar, y uno es perfecto. Entonces, tengamos eso en mente y recordemos que la línea de base es un modelo que da una predicción una y otra vez, independientemente de cuál sea la observación, solo una conjetura para nosotros.

En nuestro caso, tenemos dos clases, colocadas o no. Entonces, si pudiéramos hacer una sola predicción, ¿cuál sería nuestra suposición? Si dijiste la clase mayoritaria. Creo que eso tiene sentido, ¿verdad? Si solo podemos tener una predicción, probablemente deberíamos elegir la que tenga las observaciones más altas en nuestro conjunto de datos. Entonces, nuestra línea de base usará el porcentaje que la clase mayoritaria muestra en los datos de entrenamiento. Si el modelo no está superando esta línea de base, las características no están agregando información valiosa para clasificar nuestras observaciones.

Podemos usar el método 'value_counts' con el argumento 'normalize = True' para calcular la precisión de la línea de base:

acc_baseline = y_train.value_counts(normalize=True).max()
print("Baseline Accuracy:", round(acc_baseline, 2)) Baseline Accuracy: 0.68

Podemos ver que nuestra precisión de referencia es del 68 % o 0.68 como proporción. Entonces, para agregar valor para ser útil, queremos superar ese número y acercarnos a uno. Ese es nuestro objetivo, y ahora comencemos a construir nuestro modelo.

Iterar

Ahora es el momento de construir nuestro modelo utilizando la regresión logística. Usaremos la regresión logística, pero antes de hacerlo, hablemos un poco sobre qué es la regresión logística y cómo funciona, y luego podemos hacer la codificación. Y para eso, aquí tenemos una pequeña cuadrícula.

A lo largo del eje x, digamos que tengo los p_grados de candidatos en nuestro conjunto de datos. Y a medida que me muevo de derecha a izquierda, los grados aumentan más y más, y luego, a lo largo del eje Y, tengo las clases posibles para la ubicación: cero y uno.

gráfico para regresión logística

Entonces, si tuviéramos que trazar nuestros puntos de datos, ¿cómo se vería? Nuestro análisis muestra que es más probable que se contrate a un candidato de alto "p_degree". Entonces, probablemente se vería así, donde el candidato con un pequeño `p_degree` estaría en cero. Y el candidato con un `p_degree` alto estaría arriba en uno.

Grado p para regresión logística

Ahora digamos que queríamos hacer una regresión lineal con esto. Digamos que queríamos trazar una línea.
Ahora, si hiciéramos eso, lo que sucedería es que esa línea se trazaría de tal manera que trataría de estar lo más cerca posible de todos los puntos. Así que probablemente terminaríamos con una línea que se pareciera a esto. ¿Sería este un buen modelo?

iterar

No precisamente. Lo que sucedería es que, independientemente del grado p del candidato, siempre obtendríamos una especie de valor. Y eso no nos ayudará porque los números, en este contexto, no significan nada. Este problema de clasificación debe ser cero o uno. Entonces, no va a funcionar de esa manera.

Por otro lado, debido a que esta es una línea, ¿qué pasa si tenemos un candidato con un p_degree muy bajo? Bueno, de repente, nuestra estimación es un número negativo. Y de nuevo, esto no tiene ningún sentido. No hay un número negativo, ya sea tiene que ser cero o uno. Y de la misma manera, si tenemos un candidato con un p_grado muy alto, podría tener un positivo, algo por encima de uno. Y de nuevo, eso no tiene ningún sentido. Necesitamos tener un cero o uno.

predicción

Entonces, lo que vemos aquí son algunas limitaciones serias para usar la regresión lineal para la clasificación. entonces ¿que debemos hacer? Necesitamos crear un modelo que número uno: no vaya por debajo de cero ni por encima de uno, por lo que debe estar limitado entre cero y uno. Y el número dos, lo que resulte de esa función, esa ecuación que creamos, tal vez no deberíamos tratarlo como la predicción en sí, sino como un paso hacia nuestra predicción final.

Ahora, permítanme analizar lo que acabo de decir y recordemos que cuando hacemos nuestros modelos de regresión lineal, terminamos con esta ecuación lineal, que es la forma más simple. Y esta es esa ecuación o función que nos da esa línea recta.

img

Hay una forma de enlazar esa línea entre 0 y 1. Y lo que podemos hacer es tomar esta función que acabamos de crear y encerrarla en otra función, lo que se llama una función sigmoidea.

función para regresión logística

Entonces, voy a tomar la ecuación lineal que acabamos de tener, y la voy a reducir en la función sigmoidea y la pondré como exponencial.

función para regresión logística

Lo que sucede es que en lugar de obtener una línea recta, obtenemos una línea que se parece a esto. Está atascado en uno. Entra y se desliza hacia abajo. Entonces se queda atascado en cero.

regresión logística

Correcto, así es como se ve la línea, y podemos ver que hemos resuelto nuestro primer problema. Todo lo que obtengamos de esta función estará entre 0 y 1. En el segundo paso, no trataremos lo que resulte de esta ecuación como la predicción final. En su lugar, lo trataremos como una probabilidad.

regresión logística

¿Que quiero decir? Eso significa que cuando hago una predicción, obtendré un valor de punto flotante entre 0 y 1. Y lo que haré será tratarlo como la probabilidad de que mi predicción pertenezca a la clase positiva.

Entonces obtengo un valor de 0.9999. Diré que la probabilidad de que este candidato pertenezca a nuestra clase positiva colocada es del 99%. Así que estoy casi seguro de que pertenece a la clase positiva. Por el contrario, si está en el punto 0.001 o lo que sea, diré que este número es bajo. La probabilidad de que esta observación en particular pertenezca a la clase positiva colocada es casi cero. Entonces, voy a decir que pertenece a la clase cero.

Eso tiene sentido para los números que están cerca de uno o cerca de cero. Pero quizás te preguntes, ¿qué hago con otros valores intermedios? La forma en que funciona es que ponemos una línea de corte justo en 0.5, por lo que cualquier valor que obtenga por debajo de esa línea, lo pondré en cero, por lo que mi predicción es no, y si está por encima de esa línea, si está por encima del punto cinco. , Pondré esto en la clase positiva, mi predicción es una.

grado p

Entonces, ahora tengo una función que me da una predicción entre cero y uno, y la trato como una probabilidad. Y si esa probabilidad está por encima del 0.5 o el 50%, digo, está bien, clase uno positiva. Y si está por debajo del 50%, digo, eso es clase negativa, cero. Así es como funciona la regresión logística. Y ahora que entendemos eso, vamos a codificarlo y ajustarlo. Estableceré el hiperparámetro 'max_iter' en 1000. Este parámetro se refiere al número máximo de iteraciones para que converjan los solucionadores.

# Build model
model = LogisticRegression(max_iter=1000) # Fit model to training data
model.fit(X_train, y_train) LogisticRegression(max_iter=1000)

Evaluar

Ahora es el momento de ver cómo funciona nuestro modelo. Es hora de evaluar el modelo de regresión logística. Entonces, recordemos que esta vez, la métrica de rendimiento que nos interesa es la puntuación de precisión, y queremos una precisa. Y queremos superar la línea de base de 0.68. La precisión del modelo se puede calcular utilizando la función precision_score. La función requiere dos argumentos, las etiquetas verdaderas y las etiquetas predichas.

acc_train = accuracy_score(y_train, model.predict(X_train))
acc_test = model.score(X_test, y_test) print("Training Accuracy:", round(acc_train, 2))
print("Test Accuracy:", round(acc_test, 2)) Training Accuracy: 0.9
Test Accuracy: 0.88

Podemos ver nuestra precisión de entrenamiento en un 90%. Está superando la línea de base. La precisión de nuestra prueba fue un poco más baja, del 88 %. También superó la línea de base y estuvo muy cerca de nuestra precisión de entrenamiento. Esas son buenas noticias porque eso significa que nuestro modelo no se está sobreajustando ni nada.

Resultados del modelo de regresión logística

Recuerda que con la regresión logística, terminamos con estas predicciones finales de cero o uno. Pero debajo de esa predicción, hay una probabilidad de un número de coma flotante entre cero y uno, y algunas veces puede ser útil ver cuáles son esas estimaciones de probabilidad. Veamos nuestras predicciones de entrenamiento y veamos los primeros cinco. El método 'predecir' predice el objetivo de una observación no etiquetada.

model.predict(X_train)[:5] array([0, 1, 1, 1, 1])

Esas fueron las predicciones finales, pero ¿cuáles son las probabilidades detrás de ellas? Para obtenerlos, necesitamos hacer un código ligeramente diferente. En lugar de usar el método `predict` con nuestro modelo, usaré el `predict_proba' con nuestros datos de entrenamiento.

y_train_pred_proba = model.predict_proba(X_train)
print(y_train_pred_proba[:5]) [[0.92003219 0.07996781] [0.03202019 0.96797981] [0.00678421 0.99321579] [0.03889446 0.96110554] [0.00245525 0.99754475]]

Podemos ver una especie de lista anidada con dos columnas diferentes. La columna de la izquierda representa la probabilidad de que un candidato no sea colocado o nuestra clase negativa 'No Colocado'. La otra columna representa la clase positiva 'Colocado' o la probabilidad de que se coloque un candidato. Nos centraremos en la segunda columna. Si nos fijamos en la primera estimación de probabilidad a la derecha, podemos ver que es 0.07. Entonces, dado que está por debajo del 50 %, nuestro modelo dice que mi predicción es cero. Y para las siguientes predicciones, podemos ver que todas están por encima de 0.5, y es por eso que nuestro modelo predijo una al final.

Ahora queremos extraer los nombres de las funciones y su importancia y ponerlos en una serie. Y debido a que necesitamos mostrar la importancia de la característica como razones de probabilidades, solo necesitamos hacer una pequeña transformación matemática tomando el exponencial de nuestra importancia.

# Features names
features = ['gender', 'ssc_p', 'ssc_b', 'hsc_p', 'hsc_b', 'hsc_s', 'degree_p' ,'degree_t', 'workex', 'etest_p', 'specialisation', 'mba_p']
# Get importances
importances = model.coef_[0]
# Put importances into a Series
odds_ratios = pd.Series(np.exp(importances), index= features).sort_values()
# Review odds_ratios.head() mba_p 0.406590
degree_t 0.706021
specialisation 0.850301
hsc_b 0.876864
etest_p 0.877831
dtype: float64

Antes de discutir las razones de probabilidades y lo que son, vamos a colocarlas en un gráfico de barras horizontales. Usemos pandas para hacer el diagrama y recuerde que buscaremos los cinco coeficientes más grandes. Y no queremos usar todas las razones de probabilidades. Así que queremos usar la cola.

# Horizontal bar chart, five largest coefficients
odds_ratios.tail().plot(kind="barh")
plt.xlabel("Odds Ratio")
plt.ylabel("Feature")
plt.title("High Importance Features");
# Gráfico de barras horizontales, cinco coeficientes más grandes odds_ratios.tail().plot(kind=

Ahora quiero que imagines una línea vertical justo en el 5, y quiero empezar mirándola. Hablemos de cada uno de estos individualmente o solo de la primera pareja. Entonces, comencemos aquí con el 'ssc_p', que se refiere al 'porcentaje de educación secundaria - 10° grado'. Y podemos ver que la razón de probabilidades está en 30. Ahora, ¿qué significa eso? Significa que si un candidato tiene un 'ssc_p' alto, las probabilidades de su ubicación son seis veces mayores que las de otros candidatos, en igualdad de condiciones. Entonces, otra forma de pensarlo es cuando el candidato tiene `ssc_p`, la posibilidad de que el candidato sea reclutado aumenta seis veces.

Por lo tanto, cualquier razón de probabilidades superior a cinco aumenta las probabilidades de que se coloquen candidatos. Y por eso tenemos esa línea vertical a las cinco. Y estos cinco tipos de características son las que más se asocian con un mayor reclutamiento. Entonces, esa es nuestra relación de probabilidades. Ahora, hemos analizado las características que están más asociadas con un aumento en el reclutamiento. Veamos las características que se asocian con él, la disminución de la contratación. Así que ahora es el momento de mirar a los más pequeños. Entonces, en lugar de mirar la cola, la miraremos.

odds_ratios.head().plot(kind="barh")
plt.xlabel("Odds Ratio")
plt.xlabel("Odds Ratio")
plt.ylabel("Feature")
plt.title("Low Importance Features");
característica de poca importancia

Lo primero que debemos ver aquí es que observe que en el eje x todo es uno o inferior. Ahora, ¿qué significa eso? Así que echemos un vistazo a nuestra razón de probabilidades más pequeña aquí. Es mba_p que se refiere al porcentaje de MBA. Podemos ver que está listo alrededor de 0.45. Ahora, ¿qué significa eso? Bueno, la diferencia entre 0.45 y 1 es 0.55. ¿Está bien? ¿Y qué significa ese número? Aquellos candidatos con MBA tienen menos probabilidades de ser reclutados por un 55%, en igualdad de condiciones. ¿Está bien? Entonces disminuyó las probabilidades de reclutamiento por un factor de 0.55 o 55%. Y eso es verdad para todo aquí.

Conclusión

Entonces ¿Que aprendimos? Primero, en la fase de preparación de datos, aprendimos que estamos trabajando con clasificación, específicamente clasificación binaria, usando Regresión Logística. En términos de exploración de datos, hicimos un montón de cosas, pero en términos de aspectos destacados, observamos el equilibrio de clases, ¿verdad? La proporción de nuestras clases positivas y negativas. Luego dividimos nuestros datos.

Dado que la regresión logística es un modelo de clasificación, aprendimos sobre una nueva métrica de rendimiento, la puntuación de precisión. Ahora, la puntuación de precisión oscila entre 0 y 1. Cero es malo y uno es bueno. Cuando estábamos iterando, aprendimos sobre la regresión logística. Esa es una forma mágica, en la que puedes tomar una ecuación lineal, una línea recta, y ponerla dentro de otra función, una función sigmoidea y una función de activación, y obtener una estimación de probabilidad y convertir esa estimación de probabilidad en una predicción.

Finalmente, aprendimos sobre la razón de probabilidades y la forma en que podemos interpretar los coeficientes para ver si una característica determinada aumentará las probabilidades de que hayamos reclutado a un candidato o no.

Código fuente del proyecto: https://github.com/SawsanYusuf/Campus-Recruitment.git

Los medios que se muestran en este artículo no son propiedad de Analytics Vidhya y se utilizan a discreción del autor. 

Sello de tiempo:

Mas de Analítica Vidhya