Validaci贸n cruzada y b煤squeda de cuadr铆cula para la selecci贸n de modelos en Python

    Introducci贸n

    Un proceso t铆pico de Machine Learning implica entrenar diferentes modelos en el conjunto de datos y seleccionar el que tenga el mejor rendimiento. Sin embargo, evaluar el rendimiento del algoritmo no siempre es una tarea sencilla. Hay varios factores que pueden ayudarlo a determinar qu茅 algoritmo funciona mejor. Uno de esos factores es el rendimiento en el conjunto de validaci贸n cruzada y otro factor m谩s es la elecci贸n de par谩metros para un algoritmo.

    En este art铆culo exploraremos estos dos factores en detalle. Primero estudiaremos qu茅 es la validaci贸n cruzada, por qu茅 es necesaria y c贸mo realizarla a trav茅s de Python Scikit-Learn biblioteca. Luego pasaremos al Algoritmo de b煤squeda de cuadr铆cula y vea c贸mo se puede utilizar para seleccionar autom谩ticamente los mejores par谩metros para un algoritmo.

    Validaci贸n cruzada

    Normalmente, en un proceso de Machine Learning, los datos se dividen en conjuntos de entrenamiento y de prueba; el conjunto de entrenamiento se usa para entrenar el modelo y el conjunto de prueba se usa para evaluar el rendimiento de un modelo. Sin embargo, este enfoque puede generar problemas de variaci贸n. En palabras m谩s simples, un problema de varianza se refiere al escenario en el que nuestra precisi贸n obtenida en una prueba es muy diferente a la precisi贸n obtenida en otro conjunto de pruebas utilizando el mismo algoritmo.

    La soluci贸n a este problema es utilizar Validaci贸n cruzada de K-Fold para la evaluaci贸n del desempe帽o donde K es cualquier n煤mero. El proceso de validaci贸n cruzada de K-Fold es sencillo. Divide los datos en K pliegues. De los pliegues K, los conjuntos K-1 se utilizan para entrenamiento, mientras que el conjunto restante se utiliza para pruebas. El algoritmo se entrena y se prueba K veces, cada vez que se utiliza un nuevo conjunto como conjunto de prueba, mientras que los conjuntos restantes se utilizan para el entrenamiento. Finalmente, el resultado de la validaci贸n cruzada de K-Fold es el promedio de los resultados obtenidos en cada serie.

    Supongamos que queremos realizar una validaci贸n cruzada de 5 veces. Para hacerlo, los datos se dividen en 5 conjuntos, por ejemplo, los llamamos SET A, SET B, SET C, SET D y SET E. El algoritmo se entrena y prueba K veces. En el primer pliegue, SET A a SET D se utilizan como conjunto de entrenamiento y SET E se utiliza como conjunto de prueba como se muestra en la siguiente figura:

    En el segundo pliegue, SET A, SET B, SET C y SET E se usan para entrenamiento y SET D se usa como prueba. El proceso contin煤a hasta que cada conjunto se usa al menos una vez para entrenamiento y una vez para prueba. El resultado final es el promedio de los resultados obtenidos usando todos los pliegues. De esta forma podemos deshacernos de la varianza. Usando la desviaci贸n est谩ndar de los resultados obtenidos de cada pliegue, de hecho podemos encontrar la varianza en el resultado general.

    Validaci贸n cruzada con Scikit-Learn

    En esta secci贸n utilizaremos la validaci贸n cruzada para evaluar el rendimiento del algoritmo de bosque aleatorio para la clasificaci贸n. El problema que vamos a resolver es predecir la calidad del vino en base a 12 atributos. Los detalles del conjunto de datos est谩n disponibles en el siguiente enlace:

    https://archive.ics.uci.edu/ml/datasets/wine+quality

    Solo usamos los datos para el vino tinto en este art铆culo.

    Siga estos pasos para implementar la validaci贸n cruzada usando Scikit-Learn:

    1. Importaci贸n de bibliotecas necesarias

    El siguiente c贸digo importa algunas de las bibliotecas necesarias:

    import pandas as pd
    import numpy as np
    

    2. Importaci贸n del conjunto de datos

    Descargue el conjunto de datos, que est谩 disponible en l铆nea en este enlace:

    https://www.kaggle.com/piyushgoyal443/red-wine-dataset

    Una vez que lo hemos descargado, colocamos el archivo en la carpeta “Conjuntos de datos” de nuestra unidad “D” por el bien de este art铆culo. El nombre del conjunto de datos es “winequality-red.csv”. Tenga en cuenta que deber谩 cambiar la ruta del archivo para que coincida con la ubicaci贸n en la que guard贸 el archivo en su computadora.

    Ejecute el siguiente comando para importar el conjunto de datos:

    dataset = pd.read_csv(r"D:/Datasets/winequality-red.csv", sep=';')
    

    El conjunto de datos se separ贸 por punto y coma, por lo tanto, hemos pasado el “;” atributo al par谩metro “sep” para que los pandas puedan analizar correctamente el archivo.

    3. An谩lisis de datos

    Ejecute el siguiente script para obtener una descripci贸n general de los datos:

    dataset.head()
    

    La salida se ve as铆:

    acidez fija acidez vol谩til 谩cido c铆trico az煤cares residuales cloruros di贸xido de azufre libre di贸xido de azufre total densidad pH sulfatos calidad del alcohol
    01234

    7.40,700,001,90,07611,034,00.99783,510,569.45
    7.80,880,002.60,09825,067,00,99683,200,689,85
    7.80,760,042.30.09215.054,00,99703,260,659,85
    11,20,280,561,90,07517.060,00,99803,160,589,86
    7.40,700,001,90,07611,034,00,99783,510,569.45

    4. Procesamiento previo de datos

    Ejecute la siguiente secuencia de comandos para dividir los datos en conjuntos de caracter铆sticas y etiquetas.

    X = dataset.iloc[:, 0:11].values
    y = dataset.iloc[:, 11].values
    

    Dado que utilizamos la validaci贸n cruzada, no necesitamos dividir nuestros datos en conjuntos de prueba y entrenamiento. Queremos todos los datos en el conjunto de entrenamiento para que podamos aplicar la validaci贸n cruzada en eso. La forma m谩s sencilla de hacer esto es establecer el valor de la test_size par谩metro a 0. Esto devolver谩 todos los datos en el conjunto de entrenamiento de la siguiente manera:

    from sklearn.model_selection import train_test_split
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0, random_state=0)
    

    5. Escalar los datos

    Si observa el conjunto de datos, notar谩 que no est谩 bien escalado. Por ejemplo, la columna “acidez vol谩til” y “谩cido c铆trico” tienen valores entre 0 y 1, mientras que la mayor铆a del resto de las columnas tienen valores m谩s altos. Por lo tanto, antes de entrenar el algoritmo, necesitaremos reducir la escala de nuestros datos.

    Aqu铆 usaremos el StandardScalar clase.

    from sklearn.preprocessing import StandardScaler
    feature_scaler = StandardScaler()
    X_train = feature_scaler.fit_transform(X_train)
    X_test = feature_scaler.transform(X_test)
    

    6. Capacitaci贸n y validaci贸n cruzada

    El primer paso de la fase de formaci贸n y validaci贸n cruzada es sencillo. Solo tienes que importar la clase de algoritmo del sklearn biblioteca como se muestra a continuaci贸n:

    from sklearn.ensemble import RandomForestClassifier
    classifier = RandomForestClassifier(n_estimators=300, random_state=0)
    

    A continuaci贸n, para implementar la validaci贸n cruzada, cross_val_score m茅todo del sklearn.model_selection se puede utilizar la biblioteca. los cross_val_score devuelve la precisi贸n de todos los pliegues. Los valores de 4 par谩metros deben pasarse al cross_val_score clase. El primer par谩metro es el estimador, que b谩sicamente especifica el algoritmo que desea utilizar para la validaci贸n cruzada. El segundo y tercer par谩metro, X y y, contiene el X_train y y_train datos, es decir, caracter铆sticas y etiquetas. Finalmente el n煤mero de pliegues se pasa al cv par谩metro como se muestra en el siguiente c贸digo:

    from sklearn.model_selection import cross_val_score
    all_accuracies = cross_val_score(estimator=classifier, X=X_train, y=y_train, cv=5)
    

    Una vez que haya ejecutado esto, simplemente imprimamos las precisiones devueltas para cinco pliegues por el cross_val_score m茅todo llamando print en all_accuracies.

    print(all_accuracies)
    

    Salida:

    [ 0.72360248  0.68535826  0.70716511  0.68553459  0.68454259 ]
    

    Para encontrar el promedio de todas las precisiones, simplemente use el mean() m茅todo del objeto devuelto por cross_val_score m茅todo como se muestra a continuaci贸n:

    print(all_accuracies.mean())
    

    El valor medio es 0,6972 o 69,72%.

    Finalmente, encontremos la desviaci贸n est谩ndar de los datos para ver el grado de varianza en los resultados obtenidos por nuestro modelo. Para hacerlo, llame al std() m茅todo en el all_accuracies objeto.

    print(all_accuracies.std())
    

    El resultado es: 0.01572 que es 1.57%. Esto es extremadamente bajo, lo que significa que nuestro modelo tiene una varianza muy baja, lo que en realidad es muy bueno, ya que eso significa que la predicci贸n que obtuvimos en un conjunto de prueba no es casual. Por el contrario, el modelo tendr谩 un rendimiento m谩s o menos similar en todos los equipos de prueba.

    B煤squeda de cuadr铆cula para selecci贸n de par谩metros

    Un modelo de Machine Learning tiene dos tipos de par谩metros. El primer tipo de par谩metros son los par谩metros que se aprenden a trav茅s de un modelo de Machine Learning, mientras que el segundo tipo de par谩metros son los hiperpar谩metros que pasamos al modelo de Machine Learning.

    En la 煤ltima secci贸n, al predecir la calidad del vino, usamos el algoritmo Random Forest. El n煤mero de estimadores que usamos para el algoritmo fue 300. De manera similar, en el algoritmo KNN tenemos que especificar el valor de K y para el algoritmo SVM tenemos que especificar el tipo de Kernel. Estos estimadores, el valor K y el kernel, son todos tipos de hiperpar谩metros.

    Normalmente establecemos aleatoriamente el valor de estos hiperpar谩metros y vemos qu茅 par谩metros dan como resultado el mejor rendimiento. Sin embargo, la selecci贸n aleatoria de par谩metros para el algoritmo puede resultar exhaustiva.

    Adem谩s, no es f谩cil comparar el rendimiento de diferentes algoritmos configurando aleatoriamente los hiperpar谩metros porque un algoritmo puede funcionar mejor que el otro con diferentes conjuntos de par谩metros. Y si se cambian los par谩metros, el algoritmo puede funcionar peor que los otros algoritmos.

    Por lo tanto, en lugar de seleccionar aleatoriamente los valores de los par谩metros, un mejor enfoque ser铆a desarrollar un algoritmo que encuentre autom谩ticamente los mejores par谩metros para un modelo en particular. Grid Search es uno de esos algoritmos.

    B煤squeda de cuadr铆cula con Scikit-Learn

    Implementemos el algoritmo de b煤squeda de cuadr铆cula con la ayuda de un ejemplo. El script de esta secci贸n debe ejecutarse despu茅s del script que creamos en la 煤ltima secci贸n.

    Para implementar el algoritmo Grid Search necesitamos importar GridSearchCV clase de la sklearn.model_selection biblioteca.

    El primer paso que debe realizar es crear un diccionario de todos los par谩metros y su correspondiente conjunto de valores que desea probar para obtener el mejor rendimiento. El nombre de los elementos del diccionario corresponde al nombre del par谩metro y el valor corresponde a la lista de valores del par谩metro.

    Creemos un diccionario de par谩metros y sus valores correspondientes para nuestro algoritmo Random Forest. Los detalles de todos los par谩metros para el algoritmo de bosque aleatorio est谩n disponibles en el Documentos de Scikit-Learn.

    Para hacer esto, ejecute el siguiente c贸digo:

    grid_param = {
        'n_estimators': [100, 300, 500, 800, 1000],
        'criterion': ['gini', 'entropy'],
        'bootstrap': [True, False]
    }
    

    Eche un vistazo con atenci贸n al c贸digo anterior. Aqu铆 creamos grid_param diccionario con tres par谩metros n_estimators, criteriony bootstrap. Los valores de los par谩metros que queremos probar se pasan en la lista. Por ejemplo, en el script anterior queremos encontrar qu茅 valor (de 100, 300, 500, 800 y 1000) proporciona la mayor precisi贸n.

    Del mismo modo, queremos encontrar qu茅 valor da como resultado el rendimiento m谩s alto para el criterion par谩metro: “gini” o “entrop铆a”? El algoritmo Grid Search b谩sicamente prueba todas las combinaciones posibles de valores de par谩metros y devuelve la combinaci贸n con la mayor precisi贸n. Por ejemplo, en el caso anterior, el algoritmo verificar谩 20 combinaciones (5 x 2 x 2 = 20).

    El algoritmo de b煤squeda de cuadr铆cula puede ser muy lento, debido a la gran cantidad de combinaciones para probar. Adem谩s, la validaci贸n cruzada aumenta a煤n m谩s el tiempo de ejecuci贸n y la complejidad.

    Una vez creado el diccionario de par谩metros, el siguiente paso es crear una instancia del GridSearchCV clase. Necesita pasar valores para el estimator par谩metro, que b谩sicamente es el algoritmo que desea ejecutar. los param_grid par谩metro toma el diccionario de par谩metros que acabamos de crear como par谩metro, el scoring par谩metro toma las m茅tricas de rendimiento, el cv El par谩metro corresponde al n煤mero de pliegues, que es 5 en nuestro caso, y finalmente el n_jobs El par谩metro se refiere al n煤mero de CPU que desea utilizar para la ejecuci贸n. Un valor de -1 para n_jobs par谩metro significa que utiliza toda la potencia de c谩lculo disponible. Esto puede ser 煤til si tiene una gran cantidad de datos.

    Eche un vistazo al siguiente c贸digo:

    gd_sr = GridSearchCV(estimator=classifier,
                         param_grid=grid_param,
                         scoring='accuracy',
                         cv=5,
                         n_jobs=-1)
    

    Una vez el GridSearchCV se inicializa la clase, el 煤ltimo paso es llamar al fit m茅todo de la clase y pasarle el conjunto de entrenamiento y prueba, como se muestra en el siguiente c贸digo:

    gd_sr.fit(X_train, y_train)
    

    Este m茅todo puede tardar alg煤n tiempo en ejecutarse porque tenemos 20 combinaciones de par谩metros y una validaci贸n cruzada de 5 veces. Por lo tanto, el algoritmo se ejecutar谩 un total de 100 veces.

    Una vez que el m茅todo completa la ejecuci贸n, el siguiente paso es verificar los par谩metros que devuelven la mayor precisi贸n. Para hacerlo, imprima el sr.best_params_ atributo del GridSearchCV objeto, como se muestra a continuaci贸n:

    best_parameters = gd_sr.best_params_
    print(best_parameters)
    

    Salida:

    {'bootstrap': True, 'criterion': 'gini', 'n_estimators': 1000}
    

    El resultado muestra que la mayor precisi贸n se logra cuando el n_estimators son 1000, bootstrap es True y criterion es “gini”.

    Nota: Ser铆a una buena idea agregar m谩s estimadores y ver si el desempe帽o aumenta a煤n m谩s desde el valor m谩s alto permitido de n_estimators fue elegido.

    El 煤ltimo y 煤ltimo paso del algoritmo Grid Search es encontrar la precisi贸n obtenida utilizando los mejores par谩metros. Anteriormente ten铆amos una precisi贸n media del 69,72% con 300 n_estimators.

    Para encontrar la mejor precisi贸n lograda, ejecute el siguiente c贸digo:

    best_result = gd_sr.best_score_
    print(best_result)
    

    La precisi贸n alcanzada es: 0,6985 del 69,85%, que es solo ligeramente mejor que el 69,72%. Para mejorar esto a煤n m谩s, ser铆a bueno probar los valores de otros par谩metros del algoritmo Random Forest, como max_features, max_depth, max_leaf_nodes, etc. para ver si la precisi贸n mejora o no.

    Conclusi贸n

    En este art铆culo estudiamos dos t茅cnicas muy utilizadas para la evaluaci贸n del desempe帽o y la selecci贸n del modelo de un algoritmo. La validaci贸n cruzada de K-Fold se puede utilizar para evaluar el rendimiento de un modelo manejando el problema de varianza del conjunto de resultados. Adem谩s, para identificar el mejor algoritmo y los mejores par谩metros, podemos utilizar el algoritmo Grid Search.

     

    Etiquetas:

    Deja una respuesta

    Tu direcci贸n de correo electr贸nico no ser谩 publicada. Los campos obligatorios est谩n marcados con *