Complementos de aprendizaje automático David Soĺıs Martín Dpto. Ciencias de la Computación e Inteligencia Artificial Ampliación de Inteligencia Artificial, 2016-2017
Índice Introducción Métricas Validación de modelos Optimización de parámetros
Introducción
Scikit learn Es una librería / framework desarrollada en Python y C++ orientada al aprendizaje automático (machine learning). Un poco de historia Inicialmente desarrollada por David Cournapeau durante el Google summer code en 2007 Later Matthieu Brucher se une al proyecto y la usa como parte de su tésis. En 2010 INRIA (Institut national de recherche en informatique et en automatique) lidera el proyecto y publica la primera release.
Scikit learn Muy bien estructurado. Otras librerías se basan en dicha estructura para que estas pueden usarse junto a sklearn. Muy bien documentado. Incluye referencias a artículos en las que se basa las implementaciones. Tiene un comunidad de desarrolladores muy activa. Posee un colección muy amplia de algoritmos. Nota: Para la lectura, escritura y manipulaciones genéricas de los conjuntos de datos usar pandas, numpy y scipy
Scikit learn - Estructura Agregación de Datos Procesado de Datos Ingeniería de Atributos Entrenamiento y evaluación Puesta en producción
Scikit learn - Estructura Algunos de los paquetes más importantes: linear model, ensemble, neighbors, neural networks: Algoritmos agrupados según su naturaleza. metrics. Con un conjunto de funciones para evaluar la calidad de nuestros modelos. Metricas en función del tipo de problema: clustering, clasificación, regresión,... model selection. Funciones orientadas a crear divisiones de los datos en entrenamiento y validación para controlar el sobreajuste.
Scikit learn - Estructura Hay dos tipos de clases principales: Las que derivan de TransformerMixin. Clases que manipulan los datos, para realizar una transformación o generar nuevos atributos. fit. Estas clases también se entrenan previamente. transform. Realizar la transformación. Recibe el conjunto de datos X y devuelve el conjunto X. fit transform. Método de ayuda que llama a los anteriores métodos secuencialmente.
Scikit learn - Ejemplo Por ejemplo, este dataset: tiene atributos codificados con texto (como el género, el status y el día de la semana) y también hay fechas. Todos los algoritmos en sklearn trabajan con datos numérico, por lo que tenemos que codificar esos tipos de datos a numérico.
Scikit learn - Ejemplo Para el caso de los atributos categoricos codificados como texto podemos usar, por ejemplo, la clase LabelEncoder: 1 from s k l e a r n. p r e p r o c e s s i n g \ 2 import L a b e l E n c o d e r 3 4 l c = L a b e l E n c o d e r ( ) 5 l c. f i t (X. Gender ) 6 7 # a cada c a t e g o r í a l e a s i g n a e l í n d i c e d e l a r r a y 8 p r i n t ( C l a s e s : %s % l c. c l a s s e s ) 9 p r i n t ( V a l o r e s o r i g i n a l e s : %s % X. Gender. v a l u e s ) 10 11 e n c o d i n g = l c. t r a n s f o r m (X. Gender ) 12 13 p r i n t ( V a l o r e s c o d i f i c a d o s : %s % e n c o d i n g ) 14 15 $ C l a s e s : [ F M ] 16 $ V a l o r e s o r i g i n a l e s : [ M F F..., F M M ] 17 $ V a l o r e s c o d i f i c a d o s : [ 1 0 0..., 0 1 1 ]
Scikit learn - Ejemplo 1... 2... 3... 4 # l c. f i t (X. Gender ) 5 # e n c o d i n g = l c. t r a n s f o r m (X. Gender ) 6 7 e n c o d i n g = l c. f i t t r a n s f o r m (X. Gender ) 8 9... 10... 11... 12 13 $ C l a s e s : [ F M ] 14 $ V a l o r e s o r i g i n a l e s : [ M F F..., F M M ] 15 $ V a l o r e s c o d i f i c a d o s : [ 1 0 0..., 0 1 1 ]
Scikit learn - Estructura Hay dos tipos de clases principales: Las que derivan de BaseEstimator. Todos los algoritmos de aprendizaje. Los métodos más importantes: fit. Para entrenar el modelo. Recibe dos parámetros X e y. X conjunto de datos en forma tabular (filas=muestras, columnas=atributos) e y es la variable respuesta (la que se quiere predecir) predict. Realiza la predicción de un modelo previamente entrenado. Solo recibe un conjunto X de muestras usados para recibir predict proba. Idem al anterior pero la respuesta se obtiene como probabilidades.
1 from s k l e a r n. l i n e a r m o d e l \ 2 import L o g i s t i c R e g r e s s i o n 3 Scikit learn - Ejemplo 4 # creamos e l modelo 5 e s t i m a t o r = L o g i s t i c R e g r e s s i o n ( ) 6 7 # a j u s t a m o s e l modelo 8 e s t i m a t o r. f i t ( X t r a i n, y ) 9 10 # obtenemos l a p r e d i c c i o n e s 11 pred = e s t i m a t o r. p r e d i c t ( X t e s t ) 12 13 p r i n t ( pred ) 14 p r i n t ( t y p e ( pred ) ) 15 16 [ 0 0 1..., 1 0 0 ] 17 <c l a s s numpy. n d a r r a y > Cuidado!, las predicciones obtenidas son un array de numpy no una lista de python.
Métricas
Métricas en scikit-learn Cuando estamos ajustando un modelo es necesario establecer una métrica para determina como de bueno es nuestro modelo. La métrica dependerá del problema: Naturaleza de este: clasificación, regresión, clustering, ranking,... Y del uso futuro que se le vaya a dar al modelo. En un modelo para determinar si un paciente debe ser operado de urgencia es muy imporante reducir el falsos positivos (sobre todo si dicha operación es de alto riesgo). En un modelo que determina que objetos hay dentro de un imagen será interesante tener una probabilidad para cada objeto. Diferentes métricas influyen en la importancia que el modelo da a los atributos. También nos ayuda a parametrizar el modelo de la manera más conveniente.
Métricas para clasificación Los problemas de clasificación son los más comunes y en lo que más métricas se han desarollado. Las más importantes: Matriz de confusión. Para determinar en que clases falla el modelo y con que clases las confunde. Precisión, recall, f1-score, soporte. Son ratios entre los grupos de (FP, FN, TP, TN) tomados por parejas. Accuracy (exactitud). Promedio de acierto. LogLoss. Evalua las probabilidades para cada categoría. Area bajo la curva (AUC). Mide la habilidad de un modelo para discriminar entre clases positivas y negativas.
Tipos de error en clasificación binaria Verdaderos positivos (TP): Aquellas muestras con clase positiva que han sido clasificadas como positivas (clasificadas correctamente) Verdaderos negativo (TN): Aquellas muestras con clase negativa que han sido clasificadas como negativas (clasificadas correctamente) Falsos positivos (FP): Aquellas muestras con clase negativa que han sido clasificadas como positiva (clasificadas incorrectamente) Falsos negativos (FN): Aquellas muestras con clase positiva que han sido clasificadas como positivas (clasificadas incorrectamente)
Tipos de error en clasificación binaria FALSO POSITIVO FALSO NEGATIVO
Accuracy Mide el porcentaje de acierto. Accuracy = Accuracy = #prediccionescorrectas #totaldemuestras TP + TN TP + TN + FP + FN = TP + TN N Es la metrica más usada para clasificación y la más usada incorrectamente. Solo útil cuando tenemos el mismo número de observaciones de ambas clases y todas las predicciones sobre las clases son igualmente de importantes. (1) (2)
Accuracy Ejemplo: Supongamos que tenemos 170504 muestras positivas y 129302 negativas. Nuestro modelo clasifica correcamente 126811 de las muestras positivas y 43693 de las muestras negativas. Accuracy = 126811 + 43693 = 0.5687 = 56.87% (3) 170504 + 129302
Accuracy 1 from s k l e a r n. m e t r i c s \ 2 import a c c u r a c y s c o r e 3 4 acc = a c c u r a c y s c o r e ( y, e s t i m a t o r. p r e d i c t (X) ) 5 p r i n t ( acc ) 6 7 $ 0. 56871443533484989 8 9 TP FP = a c c u r a c y s c o r e ( y, e s t i m a t o r. p r e d i c t (X), n o r m a l i z e=f a l s e ) 10 p r i n t ( TP FP ) 11 12 $ 170504
Accuracy Ejemplo: Supongamos que tenemos 9850 muestras negativas y 150 positivas. Nuestro modelo clasifica correcamente 9700 de las muestras negativas y 50 de las muestras positivas. Accuracy = 9700 + 50 = 0.98 = 98.0% (4) 9850 + 150
Accuracy Paradox Ejemplo: Supongamos ahora que nuestro modelo siempre da una respuesta negativa (modelo trivial): Accuracy = 9850 + 0 = 0.98.5 = 98.5% (5) 9850 + 150 Este modelo tiene una mejor medida de exactitud, sin embargo, es un modelo inútil. Por qué el accuracy general no es una buena métrica en casos de datos desbalanceados? Las clases con mayor número de muestras dominarán el resultado del cálculo de la métrica.
Matriz de confusión La matriz de confusión nos muestra más información de las clasificaciones correctas e incorrectas por clase. Con los datos del ejemplo anterior: Con la matriz de confusión podemos extraer más información del comportamiento del modelo por clase: En que clase se equivoca más? Dada una clase, en que grado se confunde con la otra clase? Que clase tiene mayor precisión?
Matriz de confusión 1 from s k l e a r n. m e t r i c s import c o n f u s i o n m a t r i x 2 m = c o n f u s i o n m a t r i x ( y, e s t i m a t o r. p r e d i c t (X) ) 3 4 p r i n t (m) 5 6 $ a r r a y ( [ [ 43693, 4 6 9 9 3 ], 7 [ 82309, 1 2 6 8 1 1 ] ] )
Matriz de confusión 1 from s k l e a r n. m e t r i c s import c o n f u s i o n m a t r i x 2 m = c o n f u s i o n m a t r i x ( y, e s t i m a t o r. p r e d i c t (X) ) 3 4 # creamos un dataframe con l a i n f o m a c i o n l a m a t r i z de 5 # c o n f u n s i ó n 6 m = pd. DataFrame ( data={ N : m.t [ 0 ], P : m.t [ 1 ], 7 i n d e x : [ N, P ] } ) 8 m = m. s e t i n d e x (m[ i n d e x ]. v a l u e s ) 9 10 d e l m[ i n d e x ] 11 12 p r i n t (m)
Log-Loss Se usa cuando la predicción obtenida es una probabilidad. Es válida tanto para clasificación binaria como multiclase (más de 2 clases). 1 N N M y ij log(p ij ) (6) i=1 i=1 donde N es el número de muestras, M el número de clases, y ij es un indicador binario de si la clase j es la clase real asociada a la muestra i y p ij es la probabilidad que asigna el modelo para la muestra i y la clase j. No solo se busca optimizar el número de aciertos, sino también la seguridad con que el modelo acierta y penalizando los fallos.
Log-Loss Para clasificación binaria se puede simplicar a: 1 N N y (i) log(p (i) ) + (1 y (i) ) log(1 p (i) ). (7) i=1 donde y i es la clase real asociada a la muestra i y p i es la probabilidad que asigna el modelo para la muestra i y la clase positiva. Cuando la predicción es perfecta esta métrica is 0 (cuanto menor mejor). Minimizar el log-loss implica maximizar el accuracy generalmente.
Log-Loss 1 from s k l e a r n. m e t r i c s import l o g l o s s 2 l l = l o g l o s s ( y, e s t i m a t o r. p r e d i c t p r o b a (X) ) 3 4 p r i n t ( l l ) 5 6 $ 1. 8222485483381812
Precision - Recall Estas métricas responden a las siguientes preguntas. De todas las muestras clasificadas como positivas, que porcentaje es correctamente clasificado? Precision = TP TP + FP (8) También llamada PPV (positive predictive value) De todas las muestras positivas, que porcentaje es correctamente clasificado? Recall = TP TP + FN (9) Muchos otros nombres: sensitivy, hit rate y TPR (true positive rate)
F-Measure Es la media armónica de precision y recall: F 1 = 2 precision recall precision + recall Se busca que esta métrica de un valor alto solo cuando la precision y el recall sean altos. (10)
Metricas de ranking Estas métricas son muy utlizadas en sitemas de ranking. Por ejemplo, el buscador de google. Un motor de búsqueda puede ser visto como un clasificador binario: dado un término de búsqueda el documento Dx es relevante para la búsqueda Las métricas anteriores pueden ser interpretadas como probabilidades en vez de como proporciones: Precision: probabilidad de que un documento devuelto en la búsqueda sea relevante. Recall: probabilidad de un documento relevante sea devuelto en la búsqueda.
Informe 1 from s k l e a r n. m e t r i c s import c l a s s i f i c a t i o n r e p o r t 2 r e p o r t = c l a s s i f i c a t i o n r e p o r t ( y, e s t i m a t o r. p r e d i c t (X) ) 3 4 p r i n t ( r e p o r t ) 5 6 $ p r e c i s i o n r e c a l l f1 s c o r e s u p p o r t 7 $ 8 $ 0 0. 3 5 0. 4 8 0. 4 0 90686 9 $ 1 0. 7 3 0. 6 1 0. 6 6 209120 10 $ 11 $ avg / t o t a l 0. 6 1 0. 5 7 0. 5 8 299806
Resumen Pred P Pred N Verd. P TP FP TPR = Verd. N FN TN FPR = TP PPV = TP + FP FP FDR = FP + TP FN FOR = FN + TN TN NPV = TN + FN TP TP + FN FP FP + TN LR+ = TPR FPR LR = FNR TNR FN FNR = TP + FN TN FNR = FP + TN DOR = LR+ LR P 0 : Positive N: Negative P 1 : Predictive R: Rate V: Value F: False T: True D: Discovery O: Odds L: Likelihood
Espacio ROC ROC (Receiver Operating Characteristic). Gráfico bidimensional en el cual representamos en el eje Y el TPR y en el eje X el FPR. Representa la relación entre beneficio (TPR) y coste (FPR). ESPACIO ROC PERFECTO MEJOR PEOR
MEJOR PEOR Espacio ROC Puntos importantes: (0,0): Representa un clasificador que nunca da como salida una respuesta positiva. Falla en todos los positivos y acierta en todos los negativos. (1,1): Representa el caso contrario. Siempre da una respuesta positiva. Acierta todos los casos positivos, pero falla en todos los negativos. (1,0): Representa a un clasificador perfecto. Acierta todos los casos positivos y los negativos. ESPACIO ROC PERFECTO
MEJOR PEOR Espacio ROC Un clasificador C1 es mejor que C2 si C1 está más cerca de (1,0) que C2. Los clasificadores cerca del eje Y pueden ser vistos como clasificadores conservativos. Solo dan una respuesta positiva cuando tienen una fuerte evidencia de ello. Los clasificadores localizados en la zona superior derecha pueden ser vistos como liberales. Necesitan una mínima evidencia para clasificar positivamente una muestra. ESPACIO ROC PERFECTO
MEJOR PEOR Espacio ROC La diagonal (x=y) representa una estrategia aleatoria. Por ejemplo: Un clasificador que clasifique como positiva la mitad de las muestras aleatoriamente se espera que clasifique correctamente el 50% de las muestras positivas por lo que estará en el punto (0.5, 0.5). Si clasifica aleatoriamente como positivas el 80% de las muestras deberá encontrarse en el punto (0.8, 0.8). ESPACIO ROC PERFECTO Un clasificador, para salir de la diagonal debe explotar algún tipo de información extraida de los datos.
MEJOR PEOR Espacio ROC Un clasificador localizado por debajo de la diagonal es peor que cualquier clasificador aleatorio ( o no?). Si negamos la respuesta del clasificador, tendremos un clasificador en la parte superior de la diagonal. ESPACIO ROC PERFECTO Un clasificador sobre la diagonal no tiene información sobre las clases. Sin embargo, un clasificador por debajo de la diagonal, si la tiene pero la está aplicando incorrectamente.
Curva ROC Algunos algoritmos dan como respuesta un valor numérico que indica el grado de seguridad de que una instancia pertenezca a una clase. Naive Bayes, Redes Neuronales, Random Forest, etc. Estos clasificadores probabilisticos pueden ser convertidos a discretos aplicando un umbral. Si aplicamos este umbral gradualemente podemos trazar un curva en el espacio ROC para un solo clasificador.
Area bajo la curva (AUC) El area bajo la curva ROC siempre va entre 0 y 1. Bajo la diagonal hay un area de 0.5, por tanto ningún clasificador debe dar un AUC inferior a 0.5. Propiedades: Es equivalente a la probibilidad de dar un mayor score a una muestra positiva que a una negativa tomadas aleatoriamente. P(score(x + ) > score(x )) (11) El coeficiente de Gini es dos veces el area entre la diagonal y la curva. Gini = (2 AUC) 1 (12)
Validación de modelos
Entrenamiento y validación En el enfoque clásico los datos se dividen en datos de entrenamiento y datos de validación y test en un ratio 7:3 aproximadamente. Entrenamos con un 70% de los datos. Validamos nuestro modelo con el 30% restante. 1 from s k l e a r n. m o d e l s e l e c t i o n i mport t r a i n t e s t s p l i t 2 3 X t r a i n, X t e s t, y t r a i n, y t e s t = \ 4 t r a i n t e s t s p l i t (X, y, t e s t s i z e =0.33) Como sabemos que el 30% de los datos que hemos reservado son representativos de la realidad? Podría existir otra subvidisión mejor? Hemos desaprovechado un 30% de los datos para entrenar.
Dilema sesgo-varianza El error que comete nuestro modelo se puede descomponer en dos tipos de errores: Error de sesgo: Es la media del error entre el valor predicho por nuestro modelo y el valor real. Para conseguir dicha media sería necesario entrenar el mismo modelo N veces con diferentes datos. Medimos la generalidad del modelo respecto a los datos. Error de varianza: La variabilidad en la predicción para una muestra concreta. Medimos la estabilidad del modelo.
Dilema sesgo-varianza Modelos muy simples: alto sesgo. Modelos muy complejos: alta varianza. Tenemos que buscar un equilibrio entre el sesgo y la varianza del modelo.
Validación cruzada Como podemos entrenar nuestro modelo con diferentes datos? Es lo que se conoce como validación cruzada: Conjunto de validación Conjunto de entrenamiento Modelo 1 Modelo 2 Modelo 3 Modelo 10 Accuracy: Acurracy final: Media(Modelo1, Modelo2,..., Modelo10) Desviación : Std(Modelo1, Modelo2,..., Modelo10) Si divido el conjunto de entranamiento en N partes. Cada una de esas partes (fold) se usará para validar y el resto para entrenar. Si creamos 10 folds, tendremos que entrenar 10 modelos. Cada modelo se entrerá con el 90% por de los datos y se validará con un 10%.
Validación cruzada La función cross val score entrenará un modelo por cada fold y calculará la validación de cada uno: 1 from s k l e a r n. m o d e l s e l e c t i o n i mport c r o s s v a l s c o r e 2 3 p r i n t ( c r o s s v a l s c o r e ( e s t i m a t o r, X, y, cv =5) ) 4 [ 0.33150734 0.08022311 0.03531764 0.05323443 0. 1 2 3 2 3 3 ] Para calcular el score cada modelo debe realizar las predicciones de su fold. A estas predicciones se les conoce como predicciones out of fold.
Validación cruzada En el ejemplo anterior pasamos el número de folds. Lo habitual es trabajar siempre con los mismo folds. Para ello scikit learn tiene varias clases, en función de la extrategia de validación cruzada para crear los folds: KFold. Crea los folds aleatoriamente. StratifiedKFold. Para casos con clases desbalanceadas (muchos más positivos que negativos). Los folds mantendrán la misma propoción de clases. LeaveOneOut. Solo se deja un muestra para validar. Creará tantos modelos como muestras haya en nuestro conjunto de datos. LeavePOut. Se dejan P muestras para validar.
Validación cruzada 1 from s k l e a r n. m o d e l s e l e c t i o n i mport c r o s s v a l s c o r e 2 from s k l e a r n. m o d e l s e l e c t i o n i mport KFold 3 4 k f = KFold ( n s p l i t s =5) 5 6 p r i n t ( c r o s s v a l s c o r e ( e s t i m a t o r, X, y, cv=k f ) ) 7 [ 0.33150734 0.08022311 0.03531764 0.05323443 0. 1 2 3 2 3 3 ]
Optimización de parámetros
Selección de modelos Los algoritmos suelen tener un conjunto de parámetros amplio. La selección de modelos consiste en determina que conjunto de parámetros es más aconsejable. En scikit learn tenemos dos clases para realizar la optimización de parámetros: RandomizedSearchCV. Entrena modelos seleccionando los parámetros de manera aleatoria. Se le especifica el rango de cada parámetro a estudiar. GridSearchCV. Se le especifica que valores de cada parámetro estudiar y genera todas las combinaciones entre parámetros posibles.
Selección de modelos 1 from s k l e a r n. m o d e l s e l e c t i o n i mport GridSearchCV 2 3 e s t i m a t o r = L o g i s t i c R e g r e s s i o n ( f i t i n t e r c e p t=true, C =10, t o l =0.001) 4 5 p a r a m e t e r s = { C : [ 1, 10, 2 0 ], t o l : [ 0. 1, 0. 0 1 ] } 6 7 c l f = GridSearchCV ( e s t i m a t o r, parameters, cv =5) 8 c l f. f i t (X, y ) 9 10 p r i n t ( c l f. g r i d s c o r e s ) 11 12 [ mean : 0. 6 9 7 5 2, s t d : 0. 0 0 0 0 0, params : { C : 1, t o l : 0. 1 }, 13 mean : 0. 6 9 7 5 2, s t d : 0. 0 0 0 0 0, params : { C : 1, t o l : 0. 0 1 }, 14 mean : 0. 6 9 7 5 2, s t d : 0. 0 0 0 0 0, params : { C : 1 0, t o l : 0. 1 }, 15 mean : 0. 6 9 7 5 2, s t d : 0. 0 0 0 0 0, params : { C : 1 0, t o l : 0. 0 1 }, 16 mean : 0. 6 9 7 5 2, s t d : 0. 0 0 0 0 0, params : { C : 2 0, t o l : 0. 1 }, 17 mean : 0. 6 9 7 5 2, s t d : 0. 0 0 0 0 0, params : { C : 2 0, t o l : 0. 0 1 } ]