Categories: CienciaNoticias

Aumente significativamente sus resultados de búsqueda en cuadrícula con estos parámetros

Búsqueda de cuadrícula sobre cualquier paso de canalización de aprendizaje automático utilizando un EstimatorSwitch

Foto de Héctor J. Rivas en Unsplash Un paso muy común en la construcción de un modelo de aprendizaje automático es buscar en cuadrículas los parámetros de un clasificador en el conjunto de trenes, usando validación cruzada, para encontrar los parámetros más óptimos. Lo que es menos conocido es que también puede buscar en cuadrículas en prácticamente cualquier paso de canalización, como los pasos de ingeniería de funciones. Por ejemplo, ¿qué estrategia de imputación funciona mejor para valores numéricos? ¿Media, mediana o arbitraria? ¿Qué método de codificación categórica usar? ¿Codificación one-hot, o tal vez ordinal? En este artículo, lo guiaré a través de los pasos para poder responder tales preguntas en sus propios proyectos de aprendizaje automático utilizando búsquedas en cuadrícula. Para instalar todos los paquetes de Python necesarios para este artículo: pip install extra-datascience-tools feature-engine

el conjunto de datos

Consideremos el siguiente conjunto de datos de dominio público muy simple que creé y que tiene dos columnas: último grado y curso aprobado. La columna de la última calificación contiene la calificación que el estudiante obtuvo en su último examen y la columna del curso aprobado es una columna booleana con True si el estudiante aprobó el curso y False si el estudiante reprobó el curso. ¿Podemos construir un modelo que prediga si un estudiante aprobó el curso en función de su última calificación? Primero exploremos el conjunto de datos: import pandas as pddf = pd.read_csv(‘last_grades.csv’)
df.isna().sum() SALIDA
último_grado 125
curso_aprobado 0
dtype: int64Nuestra variable de destino curso_aprobado no tiene valores nan, por lo que no es necesario eliminar filas aquí. Por supuesto, para evitar cualquier fuga de datos, primero debemos dividir nuestro conjunto de datos en un conjunto de entrenamiento y prueba antes de continuar. from sklearn.model_selection import train_test_splitX_train, X_prueba, y_tren, y_prueba = tren_prueba_dividir(
d.f.[[‘last_grade’]],
d.f.[‘course_passed’],
random_state=42) Debido a que la mayoría de los modelos de aprendizaje automático no permiten valores nan, debemos considerar diferentes estrategias de imputación. Por supuesto, en general, iniciaría EDA (análisis exploratorio de datos) para determinar si los valores nan son MAR (falta al azar), MCAR (falta completamente al azar) o MNAR (falta no al azar). Puede encontrar un buen artículo que explica las diferencias entre estos aquí: En lugar de analizar por qué a algunos estudiantes les falta su última calificación, simplemente intentaremos buscar en cuadrículas sobre diferentes técnicas de imputación para ilustrar cómo buscar en cuadrículas sobre cualquier paso de canalización. , como este paso de ingeniería de funciones. Exploremos la distribución de la variable independiente last_grade :import seaborn as snssns.histplot(data=X_train, x=’last_grade’)Distribución de last_grade (Imagen del autor)Parece que las últimas calificaciones se distribuyen normalmente con una media de ~6.5 y valores entre ~3 y ~9.5. Veamos también la distribución de la variable objetivo para determinar qué métrica de calificación usar: y_tren.value_counts() SALIDA
cierto 431
Falso 412
Nombre: curso_aprobado, tipo de d: int64 La variable de destino se divide aproximadamente por igual, lo que significa que podemos usar el marcador predeterminado de scikit-learn para las tareas de clasificación, que es el puntaje de precisión. En el caso de una variable de destino dividida de forma desigual, la puntuación de precisión no es precisa; utilice, por ejemplo, F1 en su lugar.

búsqueda de cuadrícula

A continuación, configuraremos el modelo y la búsqueda en cuadrícula y lo ejecutaremos simplemente optimizando los parámetros del clasificador, que es como veo que la mayoría de los científicos de datos usan una búsqueda en cuadrícula. Usaremos MeanMedianImputer de feature-engine por ahora para imputar la media y DecisionTreeClassifier de scikit-learn para predecir la variable objetivo. from sklearn.tree import DecisionTreeClassifier
de sklearn.pipeline canal de importación
from sklearn.model_selection import GridSearchCVfrom feature-engine.imputation import MeanMedianImputermodel = Pipeline(
[
(“meanmedianimputer”, MeanMedianImputer(imputation_method=”mean”)),
(“tree”, DecisionTreeClassifier())
]
)param_grid = [
{“tree__max_depth”: [None, 2, 5]}
]gridsearch = GridSearchCV(modelo, param_grid=param_grid)
gridsearch.fit(tren_X, tren_y)
gridsearch.tren(X_tren, y_tren)pd.DataFrame(gridsearch.cv_results_).loc[:,
[‘rank_test_score’,
‘mean_test_score’,
‘param_tree__max_depth’]
].sort_values(‘rank_test_score’)Resultados del código anterior (Imagen del autor) Como podemos ver en la tabla anterior, usando GridsearchCV aprendimos que podemos aumentar la precisión del modelo en ~0.55 simplemente cambiando la profundidad máxima de DecisionTreeClassifier de su valor predeterminado Ninguno a 5. Esto ilustra claramente el impacto positivo que puede tener la búsqueda en cuadrículas. Sin embargo, no sabemos si imputar las últimas calificaciones que faltan con la media es en realidad la mejor estrategia de imputación. Lo que podemos hacer es una búsqueda en cuadrícula sobre tres estrategias de imputación diferentes usando EstimatorSwitch de extra-datascience-tools: Imputación media Imputación media Imputación de número arbitrario (por defecto 999 para el motor de funciones ArbitraryNumberImputer .from feature_engine.imputation import (
Número arbitrarioImputador,
MediaMedianImputer,
)
de sklearn.model_selection importar GridSearchCV
de sklearn.tree importar DecisionTreeClassifier
from extra_ds_tools.ml.sklearn.meta_estimators importar EstimatorSwitch# crear una canalización con dos técnicas de imputación
modelo = tubería (
[
(“meanmedianimputer”, EstimatorSwitch(
MeanMedianImputer()
)),
(“arbitraryimputer”, EstimatorSwitch(
ArbitraryNumberImputer()
)),
(“tree”, DecisionTreeClassifier())
]
)# especifica la grilla de parámetros para el clasificador
clasificador_param_grid = [{“tree__max_depth”: [None, 2, 5]}]# especificar la cuadrícula de parámetros para la ingeniería de características
feature_param_grid = [
{“meanmedianimputer__apply”: [True],
“meanmedianimputer__estimator__imputation_method”: [“mean”, “median”],
“arbitraryimputer__apply”: [False],
},
{“medianaimputadora__aplicar”: [False],
“arbitraryimputer__apply”: [True],
},]# unir las cuadrículas de parámetros
modelo_param_grid = [
{
**classifier_params,
**feature_params
}
for feature_params in feature_param_grid
for classifier_params in classifier_param_grid
]Algunas cosas importantes a tener en cuenta aquí: encerramos ambas computadoras en Pipeline dentro de EstimatorSwitch de extra-datascience-tools porque no queremos usar ambas computadoras al mismo tiempo. Esto se debe a que después de que el primer imput ha transformado X, no quedarán valores nan para que los transforme el segundo imput. Dividimos la cuadrícula de parámetros entre una cuadrícula de parámetros de clasificador y una cuadrícula de parámetros de ingeniería de características. En la parte inferior del código, unimos estas dos cuadrículas para que cada cuadrícula de ingeniería de características se combine con cada cuadrícula clasificadora, porque queremos probar una profundidad máxima de árbol de Ninguno, 2 y 5 para ArbitraryNumberImputer y MeanMedianImputer. Usamos un lista de diccionarios en lugar de un diccionario en la cuadrícula de parámetros de características, de modo que evitamos que MeanMedianImputer y ArbitraryNumberImputer se apliquen al mismo tiempo. Usando el parámetro de aplicación de EstimatorSwitch podemos simplemente encender o apagar una de las dos computadoras. Por supuesto, también podría ejecutar el código dos veces, una vez con el primer imputador comentado y la segunda ejecución con el segundo imputado comentado. Sin embargo, esto conducirá a errores en nuestra cuadrícula de parámetros, por lo que tendríamos que ajustar esa también, y los resultados de las diferentes estrategias de imputación no están disponibles en la misma cuadrícula de resultados de búsqueda de cv, lo que hace que sea mucho más difícil compare.Veamos los nuevos resultados:gridsearch = GridSearchCV(model, param_grid=model_param_grid)
gridsearch.fit(tren_X, tren_y)
gridsearch.tren(X_tren, y_tren)pd.DataFrame(gridsearch.cv_results_).loc[:,
[‘rank_test_score’,
‘mean_test_score’,
‘param_tree__max_depth’,
‘param_meanmedianimputer__estimator__imputation_method’]
].sort_values(‘rank_test_score’)Resultados de búsqueda en cuadrícula sobre ingeniería de características (imagen del autor) Ahora vemos un nuevo mejor modelo, que es el árbol de decisión con una profundidad máxima de 2, utilizando ArbitraryNumberImputer . ¡Mejoramos la precisión en un 1,4 % al implementar una estrategia de imputación diferente! Y como un bono de bienvenida, la profundidad de nuestro árbol se ha reducido a dos, lo que hace que el modelo sea más fácil de interpretar. Por supuesto, la búsqueda en la cuadrícula ya puede llevar bastante tiempo, y no solo al buscar en la cuadrícula sobre el clasificador sino también sobre otros pasos de la canalización, el la búsqueda en cuadrícula también puede llevar más tiempo. Hay algunos métodos para reducir al mínimo el tiempo extra que se necesita: Primero busque en la cuadrícula los parámetros del clasificador y luego otros pasos, como los pasos de ingeniería de características, o viceversa, según la situación. Use herramientas de ciencia de datos adicionales ‘ filter_tried_params para evitar la configuración de parámetros duplicados de una búsqueda en cuadrícula. Use HalvingGridSearch o HalvingRandomSearch de scikit-learn en lugar de GridSearchCV (todavía en la fase experimental). Además de usar la búsqueda en cuadrícula para optimizar un clasificador como un árbol de decisión, vimos que puede optimizar virtualmente cualquier paso en una canalización de aprendizaje automático utilizando EstimatorSwitch de extra-datascience-tools, por ejemplo, buscando en cuadrículas sobre la estrategia de imputación. Algunos ejemplos más de pasos de tubería que vale la pena buscar en la cuadrícula además de la estrategia de imputación y el clasificador en sí son:

aliintizar71

Recent Posts

Máquina de mano Lean, Green, Raspberry Pi

Los días felices de la PDA y Blackberry han quedado definitivamente atrás, pero el factor…

2 years ago

Cómo pronosticar series de tiempo usando autorregresión

Tutorial sobre cómo pronosticar usando un modelo autorregresivo en PythonFoto de Aron Visuals en UnsplashForecasting…

2 years ago

Aquí están todas las formas en que puede cargar su AirPods Pro

Si tienes un iPhone, los AirPods Pro son la opción obvia para escuchar música, ¡aunque…

2 years ago

Las principales noticias tecnológicas del lunes: la prohibición de clientes de terceros de Twitter parece no ser un accidente

Ilustración de Alex Castro / The Verge Plus nuevos rumores sobre el quinto Galaxy Fold.…

2 years ago

AirPods Max 2: aquí están las características más solicitadas

Se rumorea que los auriculares premium de próxima generación de Apple, los AirPods Max 2,…

2 years ago

El remake de Dead Space continúa luciendo terriblemente genial en el nuevo tráiler de la historia

El desarrollador Motive Studio y el editor EA han lanzado un nuevo tráiler de la…

2 years ago