Breaking

Post Top Ad

Your Ad Spot

viernes, 14 de junio de 2019

Descripción general de los métodos de clasificación en Python con Scikit-Learn

Introducción

¿Eres un programador de Python que está buscando ingresar al aprendizaje automático? Un excelente lugar para comenzar su viaje es familiarizarse con Scikit-Learn.
Hacer una clasificación con Scikit-Learn es una forma directa y sencilla de comenzar a aplicar lo aprendido, para concretar los conceptos de aprendizaje automático implementándolos con una biblioteca fácil de usar, bien documentada y robusta.

¿Qué es Scikit-Learn?

Scikit-Learn es una biblioteca para Python que fue desarrollada por primera vez por David Cournapeau en 2007. Contiene una gama de algoritmos útiles que pueden implementarse y ajustarse fácilmente para los propósitos de clasificación y otras tareas de aprendizaje automático.
Scikit-Learn utiliza SciPy como base, por lo que esta pila básica de bibliotecas debe instalarse antes de poder utilizar Scikit-Learn.

Definiendo nuestros términos

Antes de continuar con nuestra exploración de Scikit-Learn, tomemos un minuto para definir nuestros términos. Es importante comprender el vocabulario que se utilizará al describir las funciones de Scikit-Learn.
Para empezar, un sistema o red de aprendizaje automático toma entradas y salidas. Las entradas en el marco de aprendizaje automático a menudo se denominan "características" .
Las características son esencialmente las mismas que las variables en un experimento científico, son características del fenómeno en observación que se pueden cuantificar o medir de alguna manera.
Cuando estas características se incorporan a un marco de aprendizaje automático, la red intenta discernir patrones relevantes entre las características. Estos patrones se utilizan para generar los resultados del marco / red.
Las salidas del marco a menudo se denominan "etiquetas", ya que las características de salida tienen alguna etiqueta que les otorga la red, una cierta suposición acerca de la categoría en la que se encuentra la salida.

Crédito: Siyavula Education
En un contexto de aprendizaje automático, la clasificación es un tipo de aprendizaje supervisado . Aprendizaje supervisado significa que los datos suministrados a la red ya están etiquetados, con las características / atributos importantes ya separados en distintas categorías de antemano.
Esto significa que la red sabe qué partes de la entrada son importantes, y también hay un objetivo o una verdad fundamental sobre la cual la red puede verificar su integridad. Un ejemplo de clasificación es clasificar un grupo de diferentes plantas en diferentes categorías como helechos o angiospermas . Esa tarea se podría realizar con un Árbol de decisiones , un tipo de clasificador en Scikit-Learn.
En contraste, el aprendizaje no supervisado es donde los datos que se envían a la red no están etiquetados y la red debe tratar de aprender por sí misma qué características son las más importantes. Como se mencionó, la clasificación es un tipo de aprendizaje supervisado y, por lo tanto, no cubriremos los métodos de aprendizaje no supervisados ​​en este artículo.
El proceso de entrenamiento de un modelo es el proceso de introducir datos en una red neuronal y dejar que aprendan los patrones de los datos. El proceso de capacitación toma los datos y extrae las características del conjunto de datos. Durante el proceso de capacitación para una tarea de clasificación supervisada, la red pasa tanto las características como las etiquetas de los datos de capacitación. Sin embargo, durante las pruebas, la red solo se alimenta de características.
El proceso de prueba es donde se prueban los patrones que la red ha aprendido. Las funciones se asignan a la red y la red debe predecir las etiquetas. Los datos de la red se dividen en conjuntos de entrenamiento y prueba, dos conjuntos diferentes de entradas. No prueba el clasificador en el mismo conjunto de datos en el que lo entrenó, ya que el modelo ya ha aprendido los patrones de este conjunto de datos y sería un sesgo extremo.
En cambio, el conjunto de datos se divide en conjuntos de entrenamiento y pruebas, un conjunto en el que el clasificador entrena y un conjunto que el clasificador nunca ha visto antes.

Diferentes tipos de clasificadores


Crédito: CreativeMagic
Scikit-Learn proporciona un acceso fácil a numerosos algoritmos de clasificación diferentes. Entre estos clasificadores se encuentran:
Hay mucha literatura sobre cómo funcionan estos diversos clasificadores, y se pueden encontrar breves explicaciones de ellos en el sitio web de Scikit-Learn .
Por esta razón, no profundizaremos en cómo funcionan aquí, pero habrá una breve explicación de cómo funciona el clasificador.

K-vecinos más cercanos


Crédito: Antti Ajanki AnAj
K-Nearest Neighbors opera verificando la distancia desde algún ejemplo de prueba a los valores conocidos de algún ejemplo de entrenamiento. La clase que se selecciona es el grupo de puntos de datos / clase que daría la menor distancia entre los puntos de entrenamiento y el punto de prueba.

Árboles de decisión

Un clasificador de árbol de decisión funciona dividiendo un conjunto de datos en subconjuntos cada vez más pequeños según diferentes criterios. Se utilizarán diferentes criterios de clasificación para dividir el conjunto de datos, y el número de ejemplos se reducirá con cada división.
Una vez que la red ha dividido los datos en un ejemplo, el ejemplo se colocará en una clase que corresponda a una clave. Cuando varios clasificadores de bosques aleatorios están vinculados entre sí, se denominan clasificadores de bosques aleatorios .

Ingenuo bayes

Un clasificador Naive Bayes determina la probabilidad de que un ejemplo pertenezca a alguna clase, calculando la probabilidad de que ocurra un evento dado que ha ocurrido algún evento de entrada.
Cuando realiza este cálculo, se supone que todos los predictores de una clase tienen el mismo efecto en el resultado, que los predictores son independientes.

Análisis Lineal Discriminante

El Análisis Discriminante Lineal funciona al reducir la dimensionalidad del conjunto de datos, proyectando todos los puntos de datos en una línea. Luego combina estos puntos en clases según su distancia desde un punto o centroide elegido.
El análisis discriminante lineal, como podrá adivinar, es un algoritmo de clasificación lineal y se utiliza mejor cuando los datos tienen una relación lineal.

Máquinas de vectores de soporte


Crédito: Qluong2016
Las máquinas de vectores de soporte funcionan dibujando una línea entre los diferentes grupos de puntos de datos para agruparlos en clases. Los puntos en un lado de la línea serán una clase y los puntos en el otro lado pertenecen a otra clase.
El clasificador intentará maximizar la distancia entre la línea que dibuja y los puntos a cada lado, para aumentar su confianza en qué puntos pertenecen a cada clase. Cuando se trazan los puntos de prueba, el lado de la línea en que caen es la clase en la que se colocan.

Regresión logística

La Regresión logística genera predicciones sobre puntos de datos de prueba en una escala binaria, cero o uno. Si el valor de algo es 0.5 o superior, se clasifica como perteneciente a la clase 1, mientras que por debajo de 0.5 si se clasifica como perteneciente a 0.
Cada una de las características también tiene una etiqueta de solo 0 o 1. La regresión logística es un clasificador lineal y, por lo tanto, se utiliza cuando existe algún tipo de relación lineal entre los datos.

Ejemplos de tareas de clasificación

Las tareas de clasificación son cualquier tarea en la que tenga ejemplos en dos o más clases. Determinar si una imagen es un gato o un perro es una tarea de clasificación, como lo es determinar la calidad de una botella de vino en función de características como la acidez y el contenido de alcohol.
Dependiendo de la tarea de clasificación en cuestión, deseará usar diferentes clasificadores. Por ejemplo, un modelo de regresión logística es el más adecuado para las tareas de clasificación binaria, aunque existen múltiples modelos de regresión logística variable.
A medida que adquiera más experiencia con los clasificadores, adquirirá una mejor idea de cuándo usar qué clasificador. Sin embargo, una práctica común es crear una instancia de múltiples clasificadores y comparar su rendimiento entre sí, y luego seleccionar el clasificador con el mejor rendimiento.

Implementando un clasificador

Ahora que hemos analizado los diversos clasificadores a los que Scikit-Learn proporciona acceso, veamos cómo implementar un clasificador.
El primer paso para implementar un clasificador es importar el clasificador que necesita en Python. Echemos un vistazo a la declaración de importación para la regresión logística:
from sklearn.linear_model import LogisticRegression  
Aquí están las declaraciones de importación para los otros clasificadores discutidos en este artículo:
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis  
from sklearn.neighbors import KNeighborsClassifier  
from sklearn.naive_bayes import GaussianNB  
from sklearn.tree import DecisionTreeClassifier  
from sklearn.svm import SVC  
Scikit-Learn también tiene otros clasificadores, y sus respectivas páginas de documentación mostrarán cómo importarlos.
Después de esto, el clasificador debe ser instanciado. La creación de instancias es el proceso de creación del clasificador dentro de su programa Python, para crear una instancia del clasificador / objeto.
Esto normalmente se hace simplemente haciendo una variable y llamando a la función asociada con el clasificador:
logreg_clf = LogisticRegression()  
Ahora el clasificador necesita ser entrenado. Para lograr esto, el clasificador debe encajar con los datos de entrenamiento.
Las características de entrenamiento y las etiquetas de entrenamiento se pasan al clasificador con el fitcomando:
logreg_clf.fit(features, labels)  
Una vez que el modelo de clasificador ha sido entrenado en los datos de entrenamiento, puede hacer predicciones sobre los datos de prueba.
Esto se hace fácilmente llamando al comando predecir en el clasificador y proporcionándole los parámetros que necesita para realizar predicciones, que son las características de su conjunto de datos de prueba:
logreg_clf.predict(test_features)  
Estos pasos: creación de instancias, ajuste / entrenamiento y predicción son el flujo de trabajo básico para los clasificadores en Scikit-Learn.
Sin embargo, el manejo de los clasificadores es solo una parte de la clasificación con Scikit-Learn. La otra mitad de la clasificación en Scikit-Learn es el manejo de datos.
Para comprender cómo el manejo del clasificador y el manejo de los datos se juntan como una tarea de clasificación completa, tomemos un momento para entender el proceso de aprendizaje automático.

La tubería de aprendizaje de máquina

La línea de aprendizaje automático tiene los siguientes pasos: preparar datos, crear conjuntos de entrenamiento / prueba, crear una instancia del clasificador, entrenar al clasificador, hacer predicciones, evaluar el rendimiento, ajustar los parámetros.
El primer paso para entrenar a un clasificador en un conjunto de datos es preparar el conjunto de datos, para obtener los datos en la forma correcta para el clasificador y manejar cualquier anomalía en los datos. Si faltan valores en los datos, valores atípicos en los datos o cualquier otra anomalía, estos puntos de datos deben manejarse, ya que pueden afectar negativamente el rendimiento del clasificador. Este paso se conoce como preprocesamiento de datos .
Una vez que los datos han sido preprocesados, los datos deben dividirse en conjuntos de entrenamiento y pruebas. Anteriormente hemos discutido la justificación para crear conjuntos de entrenamiento y pruebas, y esto se puede hacer fácilmente en Scikit-Learn con una función útil llamada división de prueba de trenes .
Como se discutió anteriormente, el clasificador debe ser instanciado y entrenado en los datos de entrenamiento. Después de esto, se pueden hacer predicciones con el clasificador. Al comparar las predicciones hechas por el clasificador con los valores reales conocidos de las etiquetas en sus datos de prueba, puede obtener una medición de la precisión del clasificador.
Existen varios métodos para comparar las etiquetas hipotéticas con las etiquetas reales y evaluar el clasificador. Vamos a repasar estas diferentes métricas de evaluación más adelante. Por ahora, sepa que después de haber medido la precisión del clasificador, es probable que regrese y modifique los parámetros de su modelo hasta que alcance la precisión con la que está satisfecho (ya que es poco probable que su clasificador cumpla con sus expectativas en la primera correr).
Veamos un ejemplo de la línea de aprendizaje automático, pasando del manejo de datos a la evaluación.

Ejemplo de implementación de clasificación

# Begin by importing all necessary libraries
import pandas as pd  
from sklearn.metrics import classification_report  
from sklearn.metrics import confusion_matrix  
from sklearn.metrics import accuracy_score  
from sklearn.neighbors import KNeighborsClassifier  
from sklearn.svm import SVC  
Debido a que el conjunto de datos del iris es tan común, Scikit-Learn ya lo tiene, disponible para cargar con el siguiente comando:
sklearn.datasets.load_iris  
Sin embargo, cargaremos el archivo CSV aquí, para que pueda ver cómo cargar y preprocesar los datos. Puedes descargar el archivo csv aquí .
Simplemente coloque el archivo de datos en el mismo directorio que su archivo de Python. El pandasbiblioteca tiene una forma fácil de cargar en los datos, read_csv():
data = pd.read_csv('iris.csv')

# It is a good idea to check and make sure the data is loaded as expected.

print(data.head(5))  
Debido a que el conjunto de datos se ha preparado tan bien, no necesitamos hacer mucho preprocesamiento. Una cosa que podemos querer hacer es descartar la columna "ID", ya que es solo una representación de la fila en la que se encuentra el ejemplo.
Como esto no es útil, podríamos eliminarlo del conjunto de datos mediante la drop()función:
data.drop('Id', axis=1, inplace=True)  
Ahora necesitamos definir las características y etiquetas. Podemos hacer esto fácilmente con Pandas dividiendo la tabla de datos y eligiendo ciertas filas / columnas con iloc():
# Pandas ".iloc" expects row_indexer, column_indexer  
X = data.iloc[:,:-1].values  
# Now let's tell the dataframe which column we want for the target/labels.  
y = data['Species']  
La notación de corte anterior selecciona cada fila y cada columna, excepto la última columna (que es nuestra etiqueta, la especie).
Alternativamente, puede seleccionar ciertas características del conjunto de datos en el que estaba interesado usando la notación de corchete y pasando los encabezados de columna:
# Alternate way of selecting columns:
X = data.iloc['SepalLengthCm', 'SepalWidthCm', 'PetalLengthCm']  
Ahora que tenemos las características y las etiquetas que queremos, podemos dividir los datos en conjuntos de entrenamiento y pruebas utilizando la práctica característica de sklearn train_test_split():
# Test size specifies how much of the data you want to set aside for the testing set. 
# Random_state parameter is just a random seed we can use.
# You can use it if you'd like to reproduce these specific results.
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.20, random_state=27)  
Es posible que desee imprimir los resultados para asegurarse de que sus datos se están analizando como espera:
print(X_train)  
print(y_train)  
Ahora podemos instanciar los modelos. Intentemos usar dos clasificadores, un clasificador de vectores de soporte y un clasificador de vecinos más cercanos a K:
SVC_model = svm.SVC()  
# KNN model requires you to specify n_neighbors,
# the number of points the classifier will look at to determine what class a new point belongs to
KNN_model = KNeighborsClassifier(n_neighbors=5)  
Ahora vamos a encajar los clasificadores:
SVC_model.fit(X_train, y_train)  
KNN_model.fit(X_train, y_train)  
La llamada ha entrenado al modelo, por lo que ahora podemos predecir y almacenar la predicción en una variable:
SVC_prediction = SVC_model.predict(X_test)  
KNN_prediction = KNN_model.predict(X_test)  
Ahora deberíamos evaluar cómo se desempeñó el clasificador. Existen múltiples métodos para evaluar el rendimiento de un clasificador, y puede leer más sobre los diferentes métodos a continuación.
En Scikit-Learn, simplemente pasa las predicciones contra las etiquetas de la verdad básica que se almacenaron en las etiquetas de prueba:
# Accuracy score is the simplest way to evaluate
print(accuracy_score(SVC_prediction, y_test))  
print(accuracy_score(KNN_prediction, y_test))  
# But Confusion Matrix and Classification Report give more details about performance
print(confusion_matrix(SVC_prediction, y_test))  
print(classification_report(KNN_prediction, y_test))  
Para referencia, aquí está la salida que obtuvimos en las métricas:
SVC accuracy: 0.9333333333333333  
KNN accuracy: 0.9666666666666667  
A primera vista, parece que KNN se desempeñó mejor. Aquí está la matriz de confusión para SVC:
[[ 7  0  0]
 [ 0 10  1]
 [ 0  1 11]]
Esto puede ser un poco difícil de interpretar, pero la cantidad de predicciones correctas para cada clase se ejecuta en la diagonal desde la parte superior izquierda a la inferior derecha. Revise a continuación para obtener más información sobre esto.
Finalmente, aquí está la salida para el informe de clasificación para KNN:
precision    recall  f1-score   support

Iris-setosa       1.00      1.00      1.00         7  
Iris-versicolor       0.91      0.91      0.91        11  
Iris-virginica       0.92      0.92      0.92        12

micro avg       0.93      0.93      0.93        30  
macro avg       0.94      0.94      0.94        30  
weighted avg       0.93      0.93      0.93        30  

Evaluando el clasificador

Cuando se trata de la evaluación de su clasificador, hay varias maneras diferentes en que puede medir su desempeño.

Precisión de Clasificación

La precisión de la clasificación es el más simple de todos los métodos de evaluación de la precisión y el más utilizado. La precisión de la clasificación es simplemente el número de predicciones correctas divididas por todas las predicciones o una proporción de predicciones correctas con respecto a las predicciones totales.
Si bien puede darle una idea rápida de cómo se está desempeñando su clasificador, es mejor utilizarlo cuando el número de observaciones / ejemplos en cada clase es aproximadamente equivalente. Debido a que esto no sucede muy a menudo, probablemente esté mejor usando otra métrica.

Pérdida logarítmica

La pérdida logarítmica , o LogLoss, esencialmente evalúa qué tan seguro está el clasificador sobre sus predicciones. LogLoss devuelve las probabilidades de ser miembro de un ejemplo en una clase dada, sumándolas para dar una representación de la confianza general del clasificador.
El valor para las predicciones va de 1 a 0, con 1 completamente seguro y 0 sin confianza. La pérdida, o la falta general de confianza, se devuelve como un número negativo con 0 que representa un clasificador perfecto, por lo que los valores más pequeños son mejores.

Área bajo la curva ROC (AUC)

Esta es una métrica utilizada solo para problemas de clasificación binaria. El área debajo de la curva representa la capacidad del modelo para discriminar adecuadamente entre ejemplos positivos y negativos, entre una clase u otra.
Un 1.0, toda el área que cae bajo la curva, representa un clasificador perfecto. Esto significa que un AUC de 0.5 es básicamente tan bueno como adivinar al azar. La curva ROC se calcula con respecto a la sensibilidad (tasa / recuperación verdadera positiva) y especificidad (tasa negativa verdadera). Puede leer más sobre estos cálculos en este artículo de la curva ROC .

Matriz de confusión

Una matriz de confusión es una tabla o tabla, que representa la precisión de un modelo con respecto a dos o más clases. Las predicciones del modelo estarán en el eje X, mientras que los resultados / precisión se ubicarán en el eje y.
Las celdas se llenan con el número de predicciones que hace el modelo. Las predicciones correctas se pueden encontrar en una línea diagonal que se mueve desde la parte superior izquierda a la parte inferior derecha. Puedes leer más sobre la interpretación de una matriz de confusión aquí .

Informe de clasificacion

El informe de clasificación es una métrica incorporada en Scikit-Learn creada especialmente para problemas de clasificación. El uso del informe de clasificación puede darle una rápida intuición de cómo se está desempeñando su modelo. La recuperación compara el número de ejemplos que su modelo etiquetó como Clase A (algo de clase dada) contra el número total de ejemplos de Clase A, y esto se representa en el informe.
El informe también devuelve la predicción y la puntuación f1. La precisión es el porcentaje de ejemplos que su modelo etiquetó como Clase A, que en realidad pertenecía a la Clase A (verdaderos positivos contra falsos positivos), y la puntuación f1 es un promedio de precisión y recuperación.

Conclusión

Para llevar su comprensión de Scikit-Learn más lejos, sería una buena idea aprender más sobre los diferentes algoritmos de clasificación disponibles. Una vez que comprenda estos algoritmos, lea más acerca de cómo evaluar los clasificadores.
Muchos de los matices de la clasificación solo vienen con tiempo y práctica, pero si sigue los pasos de esta guía, estará bien encaminado para convertirse en un experto en tareas de clasificación con Scikit-Learn.

No hay comentarios.:

Publicar un comentario

Dejanos tu comentario para seguir mejorando!

Post Top Ad

Your Ad Spot

Páginas