Tutorial de Scikit-Learn: ejemplos de aprendizaje automático en Python

¿Qué es Scikit-learn?

Scikit-learn es una biblioteca de Python de código abierto para el aprendizaje automático. La biblioteca soporta algoritmos de última generación como KNN, XGBoost, bosque aleatorio, SVM entre otros. Está construido en la parte superior de Numpy. Scikit-learn es ampliamente utilizado en la competencia kaggle, así como en empresas tecnológicas prominentes. Scikit-Learn ayuda en el preprocesamiento, la reducción de dimensionalidad (selección de parámetros), la clasificación, la regresión, la agrupación y la selección de modelos.

Scikit-learn tiene la mejor documentación de todas las bibliotecas de código abierto. Le proporciona un gráfico interactivo en http://scikit-learn.org/stable/tutorial/machine_learning_map/index.html.

Scikit-learn no es muy difícil de usar y proporciona excelentes resultados. Sin embargo, scikit learn no admite cálculos paralelos. Es posible ejecutar un algoritmo de aprendizaje profundo con él, pero no es una solución óptima, especialmente si sabe cómo usar TensorFlow.

En este tutorial, usted aprenderá.

Descargar e instalar scikit-learn

Opción 1: AWS

scikit-learn se puede utilizar sobre AWS. Consulte La imagen del docker tiene scikit-learn preinstalado.

Para usar la versión de desarrollador, use el comando en Jupyter

Opción 2: Mac o Windows con Anaconda

Para obtener más información sobre la instalación de Anaconda consulte https://www.guru99.com/download-install-tensorflow.html

Recientemente, los desarrolladores de scikit han lanzado una versión de desarrollo que aborda el problema común que enfrenta la versión actual. Nos pareció más conveniente usar la versión del desarrollador en lugar de la versión actual.

Si instaló scikit-learn con el entorno conda, siga el paso para actualizar a la versión 0.20

Paso 1) Activar el entorno de tensorflow

Paso 2) Eliminar scikit lean usando el comando conda

Paso 3) Instale la versión del desarrollador scikit learn junto con las bibliotecas necesarias.

NOTA: Windows utilizado necesitará instalar Microsoft Visual C++ 14. Puedes obtenerlo desde aquí .

Aprendizaje automático con scikit-learn

Este tutorial se divide en dos partes:

1. Aprendizaje automático con scikit-learn
2. Cómo confiar en su modelo con LIME

La primera parte detalla cómo construir una tubería, crear un modelo y ajustar los hiperparámetros, mientras que la segunda parte proporciona tecnología avanzada en términos de selección del modelo.

Paso 1) Importar los datos

Durante este tutorial, utilizará el conjunto de datos para adultos. Para obtener información sobre este conjunto de datos, consulte Si está interesado en obtener más información sobre las estadísticas descriptivas, utilice las herramientas de buceo y visión general. Consulte este tutorial para obtener más información sobre buceo y visión general

Importar el dataset con Pandas. Tenga en cuenta que necesita convertir el tipo de las variables continuas en formato flotante.

Este conjunto de datos incluye ocho variables categóricas:

Las variables categóricas se enumeran en CATE_FACTIES

  • clase de trabajo
  • educación
  • conyugal
  • ocupación
  • relación
  • raza
  • sexo
  • native_country

además, seis variables continuas:

Las variables continuas se enumeran en CONTI_FACTIES

  • edad
  • Fnlwgt
  • núm_educación_de_educación
  • capital_gain
  • capital_loss
  • horas_semana

Tenga en cuenta que cumplimentamos la lista a mano para que tenga una mejor idea de qué columnas estamos usando. Una forma más rápida de construir una lista de categóricos o continuos es usar:

Aquí está el código para importar los datos:

age fnlwgt education_num capital_gain capital_loss hours_week
count 32561.000000 3.256100e+04 32561.000000 32561.000000 32561.000000 32561.000000
mean 38.581647 1.897784e+05 10.080679 1077.648844 87.303830 40.437456
std 13.640433 1.055500e+05 2.572720 7385.292085 402.960219 12.347429
min 17.000000 1.228500e+04 1.000000 0.000000 0.000000 1.000000
25% 28.000000 1.178270e+05 9.000000 0.000000 0.000000 40.000000
50% 37.000000 1.783560e+05 10.000000 0.000000 0.000000 40.000000
75% 48.000000 2.370510e+05 12.000000 0.000000 0.000000 45.000000
max 90.000000 1.484705e+06 16.000000 99999.000000 4356.000000 99.000000

Puede comprobar el recuento de valores únicos de las entidades native_country. Se puede ver que sólo una casa viene de Holanda-Países Bajos. Esta casa no nos traerá ninguna información, pero lo hará a través de un error durante el entrenamiento.

Puede excluir esta fila no informativa del conjunto de datos

A continuación, almacena la posición de las entidades continuas en una lista. Lo necesitará en el siguiente paso para construir la tubería.

El siguiente código recorrerá todos los nombres de columnas en CONTI_FACTIES y obtendrá su ubicación (es decir, su número) y luego lo anexará a una lista llamada conti_features

El siguiente código hace el mismo trabajo que el anterior, pero para la variable categórica. El siguiente código repite lo que has hecho anteriormente, excepto con las características categóricas.

Puede echar un vistazo al conjunto de datos. Tenga en cuenta que, cada característica categórica es una cadena. No se puede alimentar un modelo con un valor de cadena. Debe transformar el conjunto de datos utilizando una variable ficticia.

De hecho, debe crear una columna para cada grupo en la entidad. En primer lugar, puede ejecutar el siguiente código para calcular la cantidad total de columnas necesarias.

Todo el conjunto de datos contiene 101 grupos como se muestra anteriormente. Por ejemplo, las características de la clase de trabajo tienen nueve grupos. Puede visualizar el nombre de los grupos con los siguientes códigos

unique () devuelve los valores únicos de las entidades categóricas.

Por lo tanto, el conjunto de datos de capacitación contendrá 101 + 7 columnas. Las últimas siete columnas son las entidades continuas.

Scikit-learn puede encargarse de la conversión. Se realiza en dos pasos:

  • Primero, debe convertir la cadena a ID. Por ejemplo, State-Gov tendrá el ID 1, Self-emp-no-Inc ID 2 y así sucesivamente. La función LabelEncoder hace esto por usted
  • Transpone cada ID a una nueva columna. Como se mencionó anteriormente, el conjunto de datos tiene 101 ID de grupo. Por lo tanto, habrá 101 columnas que capturan todos los grupos de entidades categóricas. Scikit-learn tiene una función llamada OneHotEncoder que realiza esta operación

Paso 2) Crear el tren o conjunto de pruebas

Ahora que el conjunto de datos está listo, podemos dividirlo 80/20. 80 por ciento para el conjunto de entrenamiento y 20 por ciento para el conjunto de pruebas.

Puede usar train_test_split. El primer argumento es el marco de datos es las entidades y el segundo argumento es el marco de datos de etiqueta. Puede especificar el tamaño del conjunto de pruebas con test_size.

Paso 3) Construir la tubería

La canalización facilita la alimentación del modelo con datos consistentes. La idea detrás es poner los datos sin procesar en una ‘canalización’ para realizar operaciones. Por ejemplo, con el dataset actual, necesita estandarizar las variables continuas y convertir los datos categóricos. Tenga en cuenta que puede realizar cualquier operación dentro de la tubería. Por ejemplo, si tiene ‘NA’ en el dataset, puede reemplazarlos por la media o mediana. También puede crear nuevas variables.

Tiene la opción: codificar los dos procesos o crear una canalización. La primera opción puede provocar fugas de datos y crear inconsistencias a lo largo del tiempo. Una mejor opción es usar la tubería.

El gasoducto realizará dos operaciones antes de alimentar el clasificador logístico:

1. Estandarizar la variable: StandardScaler () `
2. Convertir las características categóricas: OneHotEncoder (Sparse=false)

Puede realizar los dos pasos utilizando make_column_transformer. Esta función no está disponible en la versión actual de scikit-learn (0.19). Con la versión actual no es posible realizar el codificador de etiquetas y un codificador en caliente en la tubería. Es una de las razones por las que decidimos usar la versión para desarrolladores.

make_column_transformer es fácil de usar. Debe definir qué columnas aplicar la transformación y qué transformación operar. Por ejemplo, para estandarizar la función continua, puede hacer lo siguiente:

  • conti_features, standardScaler () dentro make_column_transformer.
  • conti_features: lista con la variable continua
  • StandardScaler: estandarizar la variable

El objeto OneHotEncoder dentro de make_column_transformer codifica automáticamente la etiqueta.

Puede probar si la tubería funciona con fit_transform. El conjunto de datos debe tener la siguiente forma: 26048, 107

El transformador de datos está listo para usar. Puede crear la canalización con make_pipeline. Una vez que los datos se transforman, puede alimentar la regresión logística.

El entrenamiento de un modelo con scikit-learn es trivial. Debe usar el ajuste del objeto precedido por la canalización, es decir, modelo. Puede imprimir la precisión con el objeto de partitura desde la biblioteca scikit-learn

Finalmente, puede predecir las clases con predict_proba. Devuelve la probabilidad de cada clase. Tenga en cuenta que se suma a uno.

Paso 4) Uso de nuestra tubería en una búsqueda de cuadrícula

Ajustar el hiperparámetro (variables que determinan la estructura de la red como unidades ocultas) puede ser tedioso y agotador. Una forma de evaluar el modelo podría ser cambiar el tamaño del conjunto de entrenamiento y evaluar el rendimiento. Puede repetir este método diez veces para ver las métricas de puntuación. Sin embargo, es demasiado trabajo.

En su lugar, scikit-learn proporciona una función para llevar a cabo el ajuste de parámetros y la validación cruzada.

Validación cruzada

Validación cruzada significa durante el entrenamiento, el conjunto de entrenamiento es deslizamiento n número de veces en pliegues y luego evalúa el modelo n tiempo. Por ejemplo, si cv se establece en 10, el conjunto de entrenamiento se capacita y evalúa diez veces. En cada ronda, el clasificador elige al azar nueve veces para entrenar el modelo, y el décimo pliegue está destinado a la evaluación.

Búsqueda de cuadrícula Cada clasificador tiene hiperparámetros para ajustar. Puede probar diferentes valores o puede establecer una cuadrícula de parámetros. Si vas a la web oficial scikit-learn, puedes ver que el clasificador logístico tiene diferentes parámetros para afinar. Para que el entrenamiento sea más rápido, elige ajustar el parámetro C. Controla el parámetro de regularización. Debería ser positivo. Un valor pequeño le da más peso al regularizador.

Puede utilizar el objeto GridSearchCV. Necesita crear un diccionario que contenga los hiperparámetros para sintonizar.

Enumere los hiperparámetros seguidos de los valores que desea probar. Por ejemplo, para ajustar el parámetro C, utilice:

  • ‘Logisticregresion__c’: [0.1, 1.0, 1.0]: El parámetro está precedido por el nombre, en minúsculas, del clasificador y dos guiones bajos.

El modelo intentará cuatro valores diferentes: 0.001, 0.01, 0.1 y 1.

Entrena el modelo usando 10 pliegues: cv=10

Puede entrenar el modelo usando GridSearchCV con los parámetros gri y cv.

SALIDA

Para acceder a los mejores parámetros, utilice best_params_

SALIDA

Después de entrenar el modelo con cuatro valores de regularización diferentes, el parámetro óptimo es

mejor regresión logística de búsqueda en cuadrícula: 0.850891

Para acceder a las probabilidades predecidas:

Modelo XGBoost con scikit-learn

Tratemos de entrenar a uno de los mejores clasificadores del mercado. XGBoost es una mejora sobre el bosque aleatorio. El fondo teórico del clasificador fuera del alcance de este tutorial. Tenga en cuenta que, XGBoost ha ganado muchas competiciones kaggle. Con un tamaño de conjunto de datos promedio, puede funcionar tan bien como un algoritmo de aprendizaje profundo o incluso mejor.

El clasificador es un reto de entrenar porque tiene un gran número de parámetros para afinar. Por supuesto, puede usar GridSearchCV para elegir el parámetro por usted.

En su lugar, veamos cómo usar una mejor manera de encontrar los parámetros óptimos. GridSearchCV puede ser tedioso y muy largo de entrenar si pasa muchos valores. El espacio de búsqueda crece junto con el número de parámetros. Una solución preferible es usar RandomizedSearchCV. Este método consiste en elegir los valores de cada hiperparámetro después de cada iteración aleatoriamente. Por ejemplo, si el clasificador está entrenado en 1000 iteraciones, entonces se evalúan 1000 combinaciones. Funciona más o menos como. GridSearchCV

Necesita importar xgboost. Si la biblioteca no está instalada, utilice pip3 install xgboost o

En el entorno de Jupyter

A continuación,

El siguiente paso incluye especificar los parámetros que desea ajustar. Puede consultar la documentación oficial para ver todos los parámetros a ajustar. Por el bien del tutorial, solo elige dos hiperparámetros con dos valores cada uno. XGBoost toma mucho tiempo para entrenar, cuantos más hiperparámetros haya en la cuadrícula, más tiempo necesitará esperar.

Se construye una nueva canalización con el clasificador XGBoost. Usted elige definir 600 estimadores. Tenga en cuenta que n_estimators son un parámetro que puede sintonizar. Un valor alto puede conducir a un exceso de ajuste. Puede probar por sí mismo diferentes valores, pero tenga en cuenta que puede tomar horas. Utilice el valor predeterminado para los otros parámetros

uede mejorar la validación cruzada con el validador cruzado Stratified K-Folds. Usted construye sólo tres pliegues aquí para acelerar el cálculo pero reducir la calidad. Aumente este valor a 5 o 10 en casa para mejorar los resultados.

Usted elige entrenar el modelo en cuatro iteraciones.

La búsqueda aleatoria está lista para usar, puede entrenar el modelo

Como puede ver, XGBoost tiene una puntuación mejor que la regresión logisitc anterior.

Crear DNN con MLPClassifier en scikit-learn

Finalmente, puede entrenar un algoritmo de aprendizaje profundo con scikit-learn. El método es el mismo que el otro clasificador. El clasificador está disponible en MLPClassifier.

Defina el siguiente algoritmo de aprendizaje profundo:

  • Adam solucionador
  • Función de activación Relu
  • Alfa = 0.0001
  • tamaño de lote de 150
  • Dos capas ocultas con 100 y 50 neuronas respectivamente

Puede cambiar el número de capas para mejorar el modelo

Puntuación de regresión DNN: 0.821253

LIME: Confíe en su modelo

Ahora que tienes un buen modelo, necesitas una herramienta para confiar en él. Se sabe que el algoritmo de aprendizaje automático, especialmente el bosque aleatorio y la red neuronal, es un algoritmo blax-box. Di lo contrario, funciona pero nadie sabe por qué.

Tres investigadores han llegado con una gran herramienta para ver cómo el ordenador hace una predicción. El periódico se llama ¿Por qué debería confiar en ti?

Desarrollaron un algoritmo llamado Local Interpretable Model-Agnóstico Explicaciones (LIME).

Tomemos un ejemplo:

a veces no sabes si puedes confiar en una predicción de aprendizaje automático:

Un médico, por ejemplo, no puede confiar en un diagnóstico sólo porque una computadora lo dijo. También necesita saber si puede confiar en el modelo antes de ponerlo en producción.

Imagine que podemos entender por qué cualquier clasificador está haciendo una predicción incluso modelos increíblemente complicados como redes neuronales, bosques aleatorios o svms con cualquier núcleo

será más accesible para confiar en una predicción si podemos entender las razones detrás de ella. A partir del ejemplo con el médico, si el modelo le dijo qué síntomas son esenciales, confiaría en él, también es más fácil averiguar si no debe confiar en el modelo.

Lime puede decirle qué características afectan las decisiones del clasificador

Preparación de datos

Son un par de cosas que necesita cambiar para ejecutar LIME con python. En primer lugar, debe instalar cal en la terminal. Puede usar pip install lime

Lime hace uso del objeto LimeMetabularExplainer para aproximar el modelo localmente. Este objeto requiere:

  • un dataset en formato numpy
  • El nombre de las entidades: feature_names
  • El nombre de las clases: class_names
  • El índice de la columna de las entidades categóricas: categorical_features
  • El nombre del grupo para cada elemento categórico: categorical_names

Crear conjunto de trenes numpy

Puede copiar y convertir df_train de pandas a numpy muy fácilmente

Obtener el nombre de la clase La etiqueta es accesible con el objeto unique (). Deberías ver:

  • ‘<=50K’
  • ‘>50K’

índice de la columna de las entidades categóricas

Puede usar el método que se inclina antes para obtener el nombre del grupo. Codificar la etiqueta con LabelEncoder. Repetirá la operación en todas las entidades categóricas.

Ahora que el dataset está listo, puede construir el dataset diferente. En realidad, transforma los datos fuera de la canalización para evitar errores con LIME. El conjunto de entrenamiento en el liMetabularExplainer debe ser una matriz numpy sin cadena. Con el método anterior, ya tiene un conjunto de datos de entrenamiento convertido.

Puede hacer la tubería con los parámetros óptimos de XGBoost

Recibéis una advertencia. La advertencia explica que no es necesario crear un codificador de etiquetas antes de la canalización. Si no desea utilizar LIME, puede utilizar el método de la primera parte del tutorial. De lo contrario, puede seguir con este método, primero crear un dataset codificado, establecer obtener el codificador caliente dentro de la canalización.

Antes de usar LIME en acción, vamos a crear una matriz numpy con las características de la clasificación incorrecta. Puede usar esa lista más adelante para tener una idea acerca de lo que confunde al clasificador.

(826, 16)

Cree una función lambda para recuperar la predicción del modelo con los nuevos datos. Lo necesitarás pronto.

Convierte el marco de datos pandas a una matriz numpy

Vamos a elegir un hogar aleatorio del conjunto de pruebas y ver la predicción del modelo y cómo el ordenador hizo su elección.

Puede usar el explicador con explain_instance para verificar la explicación detrás del modelo

Podemos ver que el clasificador predijo el hogar correctamente. El ingreso es, de hecho, por encima de los 50k.

Lo primero que podemos decir es que el clasificador no está tan seguro de las probabilidades pronosticadas. La máquina predice que el hogar tiene un ingreso superior a 50k con una probabilidad del 64%. Este 64% se compone de Ganancias de capital y conyugal. El color azul contribuye negativamente a la clase positiva y la línea naranja, positivamente.

El clasificador se confunde porque la ganancia de capital de este hogar es nula, mientras que la ganancia de capital suele ser un buen predictor de riqueza. Además, el hogar trabaja menos de 40 horas por semana. La edad, la ocupación y el sexo contribuyen positivamente al clasificador.

Si el estado civil fuera soltero, el clasificador habría predicho un ingreso inferior a 50k (0.64-0.18 = 0.46)

Podemos intentarlo con otro hogar que ha sido clasificado erróneamente

El clasificador predijo un ingreso por debajo de 50k mientras que es falso. Esta casa parece extraña. No tiene una ganancia de capital, ni pérdida de capital. Está divorciado y tiene 60 años, y es un pueblo educado, es decir, education_num > 12. De acuerdo con el patrón general, este hogar debería, como explica el clasificador, obtener un ingreso inferior a 50k.

Intentas jugar con LIME. Notará errores graves del clasificador.

Puede verificar el GitHub del propietario de la biblioteca. Proporcionan documentación adicional para la clasificación de imágenes y textos.

Resumen

A continuación se muestra una lista de algunos comandos útiles con scikit learn version >=0.20

create train/test dataset trainees split
Build a pipeline
select the column and apply the transformation makecolumntransformer
type of transformation
standardize StandardScaler
min max MinMaxScaler
Normalize Normalizer
Impute missing value Imputer
Convert categorical OneHotEncoder
Fit and transform the data fit_transform
Make the pipeline make_pipeline
Basic model
logistic regression LogisticRegression
XGBoost XGBClassifier
Neural net MLPClassifier
Grid search GridSearchCV
Randomized search RandomizedSearchCV
0 replies

Leave a Reply

Want to join the discussion?
Feel free to contribute!

Leave a Reply

Your email address will not be published. Required fields are marked *