Análisis discriminante lineal es un algoritmo de clasificación lineal de aprendizaje de máquinas.
El algoritmo implica el desarrollo de un modelo probabilístico por clase basado en la distribución específica de las observaciones para cada variable de entrada. A continuación, se clasifica un nuevo ejemplo calculando la probabilidad condicional de que pertenezca a cada clase y seleccionando la clase con la mayor probabilidad.
Como tal, es un modelo de clasificación probabilística relativamente simple que hace fuertes suposiciones sobre la distribución de cada variable de entrada, aunque puede hacer predicciones efectivas incluso cuando se violan esas expectativas (por ejemplo, falla con gracia).
En este tutorial, descubrirás el algoritmo de aprendizaje de la máquina de clasificación del Análisis Discriminante Lineal en Python.
Después de completar este tutorial, lo sabrás:
- El Análisis Discriminatorio Lineal es un simple algoritmo de aprendizaje de máquina lineal para la clasificación.
- Cómo encajar, evaluar y hacer predicciones con el modelo de Análisis Discriminatorio Lineal con Scikit-Learn.
- Cómo ajustar los hiperparámetros del algoritmo de Análisis Discriminatorio Lineal en un determinado conjunto de datos.
Empecemos.
Resumen del Tutorial
Este tutorial está dividido en tres partes; son:
- Análisis discriminante lineal
- Análisis discriminante lineal con scikit-learn
- Sintonizar los hiperparámetros del LDA
Análisis discriminante lineal
El Análisis Discriminatorio Lineal, o LDA para abreviar, es un algoritmo de aprendizaje de la máquina de clasificación.
Funciona calculando estadísticas resumidas de las características de entrada por etiqueta de clase, como la media y la desviación estándar. Estas estadísticas representan el modelo aprendido de los datos de entrenamiento. En la práctica, las operaciones de álgebra lineal se utilizan para calcular las cantidades necesarias de manera eficiente mediante la descomposición de la matriz.
Las predicciones se hacen estimando la probabilidad de que un nuevo ejemplo pertenezca a cada etiqueta de clase en función de los valores de cada característica de entrada. La clase que da como resultado la mayor probabilidad se asigna entonces al ejemplo. Como tal, la LDA puede considerarse una simple aplicación del Teorema de Bayes para la clasificación.
El LDA supone que las variables de entrada son numéricas y están distribuidas normalmente y que tienen la misma varianza (difusión). De no ser así, puede ser conveniente transformar los datos para tener una distribución gaussiana y estandarizar o normalizar los datos antes de la modelización.
… el clasificador LDA resulta de asumir que las observaciones dentro de cada clase provienen de una distribución normal con un vector medio específico de la clase y una varianza común
– Página 142, Una introducción al aprendizaje estadístico con aplicaciones en R, 2014.
También asume que las variables de entrada no están correlacionadas; si lo están, una transformación PCA puede ser útil para eliminar la dependencia lineal.
… los profesionales deben ser particularmente rigurosos en el preprocesamiento de los datos antes de utilizar la LDA. Recomendamos que los predictores se centren y escalen y que se eliminen los predictores de varianza casi nula.
– Página 293, Applied Predictive Modeling, 2013.
Sin embargo, el modelo puede funcionar bien, incluso cuando se violan estas expectativas.
El modelo LDA es naturalmente multiclase. Esto significa que soporta problemas de clasificación de dos clases y se extiende a más de dos clases (clasificación multiclase) sin modificación o aumento.
Es un algoritmo de clasificación lineal, como la regresión logística. Esto significa que las clases están separadas en el espacio de las características por líneas o hiperplanos. Se pueden utilizar extensiones del método que permiten otras formas, como el Análisis Cuadrático Discriminatorio (QDA), que permite formas curvas en el límite de decisión.
… a diferencia de la LDA, la QDA asume que cada clase tiene su propia matriz de covarianza.
– Página 149, Una introducción al aprendizaje estadístico con aplicaciones en R, 2014.
Ahora que estamos familiarizados con la LDA, veamos cómo ajustar y evaluar los modelos usando la biblioteca de aprendizaje de ciencias.
Análisis discriminante lineal con scikit-learn
El Análisis Discriminatorio Lineal está disponible en la biblioteca de aprendizaje de la máquina Python a través de la clase de Análisis Discriminatorio Lineal.
El método puede utilizarse directamente sin configuración, aunque la aplicación ofrece argumentos para la personalización, como la elección del solucionador y el uso de una pena.
... # Crear el modelo IDA modelo = LinearDiscriminantAnalysis() |
Podemos demostrar el método de Análisis Discriminatorio Lineal con un ejemplo trabajado.
Primero, definamos un conjunto de datos de clasificación sintética.
Usaremos la función make_classification() para crear un conjunto de datos con 1.000 ejemplos, cada uno con 10 variables de entrada.
El ejemplo crea y resume el conjunto de datos.
# Conjunto de datos de clasificación de pruebas de sklearn.conjuntos de datos importación hacer_clasificación # Definir el conjunto de datos X, y = make_classification(n_muestras=1000, n_funciones=10, n_informativo=10, n_redundante=0, estado_aleatorio=1) # resumir el conjunto de datos imprimir(X.forma, y.forma) |
Ejecutando el ejemplo se crea el conjunto de datos y se confirma el número de filas y columnas del conjunto de datos.
Podemos ajustar y evaluar un modelo de Análisis Discriminatorio Lineal usando la validación cruzada de repetición estratificada k-fold a través de la clase RepeatedStratifiedKFold. Usaremos 10 pliegues y tres repeticiones en el arnés de prueba.
El ejemplo completo de evaluación del modelo de análisis discriminante lineal para la tarea de clasificación binaria sintética figura a continuación.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
# Evaluar un modelo de IDA en el conjunto de datos de numpy importación significa de numpy importación std de sklearn.conjuntos de datos importación make_classification de sklearn.model_selection importación puntaje_valor_cruzado de sklearn.model_selection importación RepeatedStratifiedKFold de sklearn.análisis_discriminatorio importación LinearDiscriminantAnalysis # Definir el conjunto de datos X, y = make_classification(n_muestras=1000, n_funciones=10, n_informativo=10, n_redundante=0, estado_aleatorio=1) # Definir el modelo modelo = LinearDiscriminantAnalysis() # Definir el método de evaluación del modelo cv = RepeatedStratifiedKFold(n_splits=10, n_repeticiones=3, estado_aleatorio=1) # Evaluar el modelo resultados = puntaje_valor_cruzado(modelo, X, y, puntuación=«exactitud, cv=cv, n_jobs=–1) # Resumir el resultado imprimir(«Precisión media: %.3f (%.3f) % (significa(resultados), std(resultados))) |
La ejecución del ejemplo evalúa el algoritmo de Análisis Discriminatorio Lineal en el conjunto de datos sintéticos e informa de la precisión media en las tres repeticiones de validación cruzada de 10 veces.
Sus resultados específicos pueden variar dada la naturaleza estocástica del algoritmo de aprendizaje. Considere ejecutar el ejemplo unas cuantas veces.
En este caso, podemos ver que el modelo alcanzó una precisión media de alrededor del 89,3 por ciento.
Precisión media: 0,893 (0,033) |
Podemos decidir usar el Análisis Discriminatorio Lineal como nuestro modelo final y hacer predicciones sobre nuevos datos.
Esto puede lograrse ajustando el modelo a todos los datos disponibles y llamando a la función predict() que pasa en una nueva fila de datos.
Podemos demostrarlo con un ejemplo completo que se enumera a continuación.
# Hacer una predicción con un modelo de IDA en el conjunto de datos # de sklearn.conjuntos de datos importación make_classification de sklearn.análisis_discriminatorio importación LinearDiscriminantAnalysis # Definir el conjunto de datos X, y = make_classification(n_muestras=1000, n_funciones=10, n_informativo=10, n_redundante=0, estado_aleatorio=1) # Definir el modelo modelo = LinearDiscriminantAnalysis() # Modelo de ajuste modelo.encajar(X, y) # Definir nuevos datos fila = [[0.12777556,–3.64400522,–2.23268854,–1.82114386,1.75466361,0.1243966,1.03397657,2.35822076,1.01001752,0.56768485] # hacer una predicción yhat = modelo.predecir([[fila]) # resumir la predicción imprimir(Clase prevista: %d’. % yhat) |
Ejecutando el ejemplo se ajusta al modelo y hace una predicción de etiqueta de clase para una nueva fila de datos.
A continuación, podemos ver la configuración de los hiperparámetros del modelo.
Sintonizar los hiperparámetros del LDA
Los hiperparámetros del método de Análisis Discriminante Lineal deben ser configurados para su conjunto de datos específico.
Un importante hiperparámetro es el solucionador, que por defecto es ‘svd…pero también se puede ajustar a otros valores para los solucionadores que apoyan la capacidad de encogimiento.
El siguiente ejemplo lo demuestra utilizando la clase GridSearchCV con una cuadrícula de diferentes valores de solver.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
# Resolvedor de búsqueda de cuadrículas para Ida de sklearn.conjuntos de datos importación make_classification de sklearn.model_selection importación GridSearchCV de sklearn.model_selection importación RepeatedStratifiedKFold de sklearn.análisis_discriminatorio importación LinearDiscriminantAnalysis # Definir el conjunto de datos X, y = make_classification(n_muestras=1000, n_funciones=10, n_informativo=10, n_redundante=0, estado_aleatorio=1) # Definir el modelo modelo = LinearDiscriminantAnalysis() # Definir el método de evaluación del modelo cv = RepeatedStratifiedKFold(n_splits=10, n_repeticiones=3, estado_aleatorio=1) # Definir la cuadrícula cuadrícula = dict() cuadrícula[[«solucionador] = [[«svd, «lsqr, «eigen] # Definir la búsqueda busca en = GridSearchCV(modelo, cuadrícula, puntuación=«exactitud, cv=cv, n_jobs=–1) # realizar la búsqueda resultados = busca en.encajar(X, y) # Resumir imprimir(Precisión media: %.3f’. % resultados.mejor_puntuación_) imprimir(Config: %s’ % resultados.best_params_) |
Al ejecutar el ejemplo se evaluará cada combinación de configuraciones utilizando una validación cruzada repetida.
Sus resultados específicos pueden variar dada la naturaleza estocástica del algoritmo de aprendizaje. Intente ejecutar el ejemplo unas cuantas veces.
En este caso, podemos ver que el solucionador SVD por defecto funciona mejor comparado con los otros solucionadores incorporados.
Precisión media: 0,893 Config: {‘solver’: ‘svd’} |
A continuación, podemos explorar si el uso de la contracción con el modelo mejora el rendimiento.
La contracción añade una penalización al modelo que actúa como un tipo de regularizador, reduciendo la complejidad del modelo.
La regularización reduce la varianza asociada a la estimación basada en la muestra a expensas de un posible aumento del sesgo. Esta compensación de la varianza del sesgo suele estar regulada por uno o más parámetros (grado de creencia) que controlan la fuerza del sesgo hacia el conjunto «plausible» de valores de los parámetros (de la población).
– Análisis discriminante regularizado, 1989.
Esto se puede establecer a través de la «contracción«y se puede establecer un valor entre 0 y 1. Comprobaremos los valores en una cuadrícula con un espacio de 0,01.
Para utilizar la pena, se debe elegir un solucionador que apoye esta capacidad, como…eigen…o…lsqr‘. Usaremos lo último en este caso.
El ejemplo completo del ajuste del hiperparámetro de contracción se enumera a continuación.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
# Reducir la búsqueda de la cuadrícula para Ida de numpy importación arange de sklearn.conjuntos de datos importación make_classification de sklearn.model_selection importación GridSearchCV de sklearn.model_selection importación RepeatedStratifiedKFold de sklearn.análisis_discriminatorio importación LinearDiscriminantAnalysis # Definir el conjunto de datos X, y = make_classification(n_muestras=1000, n_funciones=10, n_informativo=10, n_redundante=0, estado_aleatorio=1) # Definir el modelo modelo = LinearDiscriminantAnalysis(solver=«lsqr) # Definir el método de evaluación del modelo cv = RepeatedStratifiedKFold(n_splits=10, n_repeticiones=3, estado_aleatorio=1) # Definir la cuadrícula cuadrícula = dict() cuadrícula[[«encogimiento] = arange(0, 1, 0.01) # Definir la búsqueda busca en = GridSearchCV(modelo, cuadrícula, puntuación=«exactitud, cv=cv, n_jobs=–1) # realizar la búsqueda resultados = busca en.encajar(X, y) # Resumir imprimir(Precisión media: %.3f’. % resultados.mejor_puntuación_) imprimir(Config: %s’ % resultados.best_params_) |
Al ejecutar el ejemplo se evaluará cada combinación de configuraciones utilizando una validación cruzada repetida.
Sus resultados específicos pueden variar dada la naturaleza estocástica del algoritmo de aprendizaje. Intente ejecutar el ejemplo unas cuantas veces.
En este caso, podemos ver que el uso de la contracción ofrece un ligero aumento en el rendimiento de alrededor del 89,3 por ciento a alrededor del 89,4 por ciento, con un valor de 0,02.
Precisión media: 0,894 Config: {‘shrinkage’: 0.02} |
Más lecturas
Esta sección proporciona más recursos sobre el tema si desea profundizar en él.
Tutoriales
Documentos
Libros
APIs
Artículos
Resumen
En este tutorial, descubriste el algoritmo de aprendizaje de la máquina de clasificación del Análisis Discriminante Lineal en Python.
Específicamente, aprendiste:
- El Análisis Discriminatorio Lineal es un simple algoritmo de aprendizaje de máquina lineal para la clasificación.
- Cómo encajar, evaluar y hacer predicciones con el modelo de Análisis Discriminatorio Lineal con Scikit-Learn.
- Cómo ajustar los hiperparámetros del algoritmo de Análisis Discriminatorio Lineal en un determinado conjunto de datos.
¿Tiene alguna pregunta?
Haga sus preguntas en los comentarios de abajo y haré lo posible por responder.