Tema 2: Introducción a scikit-learn José Luis Ruiz Reina Departamento de Ciencias de la Computación e Inteligencia Artificial Universidad de Sevilla Razonamiento asistido por computador, 2017-18
Ejemplo: predicción de precios de pisos Predecir el precio de un piso en función de sus características (número de habitaciones, distancia al centro, renta per cápita del barrio,... ) Datos: 0.00632 18.00 2.310 0 0.5380 6.5750 65.20 4.0900 1 296.0 15.30 396.90 4.98 0.02731 0.00 7.070 0 0.4690 6.4210 78.90 4.9671 2 242.0 17.80 396.90 9.14 0.02729 0.00 7.070 0 0.4690 7.1850 61.10 4.9671 2 242.0 17.80 392.83 4.03 0.03237 0.00 2.180 0 0.4580 6.9980 45.80 6.0622 3 222.0 18.70 394.63 2.94 0.06905 0.00 2.180 0 0.4580 7.1470 54.20 6.0622 3 222.0 18.70 396.90 5.33 0.02985 0.00 2.180 0 0.4580 6.4300 58.70 6.0622 3 222.0 18.70 394.12 5.21 0.08829 12.50 7.870 0 0.5240 6.0120 66.60 5.5605 5 311.0 15.20 395.60 12.43 0.14455 12.50 7.870 0 0.5240 6.1720 96.10 5.9505 5 311.0 15.20 396.90 19.15 0.21124 12.50 7.870 0 0.5240 5.6310 100.00 6.0821 5 311.0 15.20 386.63 29.93............
Ejemplo: clasificación de la flor de iris Hay tres géneros de la planta de iris (setosa, virgínica y versicolor); se pretende poder clasificarla en función de medidas (anchura y longitud) de su sépalo y pétalo Datos: 5.1 3.5 1.4 0.2 Iris-setosa 4.9 3.0 1.4 0.2 Iris-setosa 4.7 3.2 1.3 0.2 Iris-setosa...... 7.0 3.2 4.7 1.4 Iris-versicolor 6.4 3.2 4.5 1.5 Iris-versicolor 6.9 3.1 4.9 1.5 Iris-versicolor...... 6.3 3.3 6.0 2.5 Iris-virginica 5.8 2.7 5.1 1.9 Iris-virginica 7.1 3.0 5.9 2.1 Iris-virginica......
Aprendizaje de modelos El objetivo general del Aprendizaje Automático es poder automatizar la toma de decisiones construyendo un modelo general que se aprende a partir de un conjunto de datos Usalmente por modelo entendemos un modelo matemático, que puede ser implementado en un ordenador Supervisado: en los ejemplos conocemos la entrada y la salida Clasificación de correo spam Identificar un código postal a partir de dígitos escritos a mano Detectar actividades fraudulentas con trahetas de crédito Determinar si un tumor es maligno, a partir de una imagen médica No supervisado: sólo conocemos la entrada Identificar temáticas en un conjunto de textos Agrupar clientes por preferencias Detectar accesos irregulares a un sitio web
Conjunto de datos Los datos con los que trataremos una estructura vectorial (valores de atributos), y un valor de clasificación (clase) Importante: supondremos que todos los atributos son numéricos Esto no es ninguna limitación en la práctica (los atributos no numéricos se pueden codificar numéricamente) En scikit-learn, los datos se almacenan en arrays de numpy Ejemplos de datos: Vector de píxeles en una imagen médica o en una imagen de un escrito a mano Representación vectorial de un texto Vector de características de un correo electrónico
Aprendizaje y ajuste de parámetros El aprendizaje de un modelo suele consistir en una búsqueda de un modelo de entre todos los modelos de una familia. Por ejemplo: Árboles de decisión Pesos en un clasificador lineal Probabilidades de una red bayesiana Hay que buscar un modelo que se ajuste bien al conjunto de entrenamiento pero que no se ajuste demasiado, y sea capaz de generalizar Huir del sobreajuste Sin caer en el infraajuste
Aprendizaje y ajuste de parámetros Un método de aprendizaje de un modelo suele tener una serie de hiper-parámetros (o parámetros, por simplificar) que influyen en el proceso de búsqueda y en el grado de generalización delque se dispone. En un proceso de aprendizaje es importante el algoritmo y los modelos que se usen, pero también lo es el encontrar los parámetros adecuados Ajuste de (hiper-)parámetros Para decidir entre un modelo u otro hay que tener una manera de medirlos (evaluación) Conjuntos de prueba Métricas
Scikit-Learn Biblioteca con diversas herramientas para machine learning y análisis de datos: http://scikit-learn.org/stable/ Librería python para aprendizaje automático Dependencias con otras librerías: NumPy, SciPy, matplotlib Proporciona: Ejemplos de trabajo Herramientas de tratamiento de datos Modelos de aprendizaje automático Herramientas de evaluación de modelos
Ejemplo de datos en scikit-learn: Iris Base de datos sobre flores Iris Setosa, Iris Versicolor, Iris Virginica ampliamente utilizado como caso de estudio en técnicas de clasificación en aprendizaje automático 50 instancias de cada tipo de flor 4 características: longitud y ancho del sépalo; y longitud y ancho del pétalo
Iris: carga de datos Disponible como conjunto de datos en scikit-learn: librería datasets from sklearn.datasets import load_iris iris = load_iris() Campos proporcionados: data: Array de datos. Cada componente es un array con las características de una instancia feature_names: Identificación de cada característica target: Valores de clasificación para cada instancia de datos target_names: Identificación de cada valor de clasificación DESCR: Descripción del conjunto de datos
Iris: Recogida de datos Ejemplos >>> iris.feature_names [ sepal length (cm), sepal width (cm), petal length (cm), petal width (cm) ] >>> iris.data.shape (150,4) >>> iris.data[0] array([ 5.1, 3.5, 1.4, 0.2]) >>> iris.target_names array([ setosa, versicolor, virginica ], dtype= <U10 ) >>> iris.target.shape (150,) >>> iris.target[0] 0 Cargamos los datos X_iris, y_iris = iris.data, iris.target X_names, y_names = iris.feature_names, iris.target_names
Iris: Visualización de los datos Dificultad para visualizar todos los datos: 150 instancias, 4 características Librería python de gráficos de tipo matemático: matplotlib http://matplotlib.org/ Representación gráfica de los datos con respecto a un par de características from matplotlib import pyplot as plt plt.clf() for tipo,marca,color in zip(range(len(y_names)),"sod","rgb"): plt.scatter(x_iris[:,0][y_iris == tipo], X_iris[:,1][y_iris == tipo], marker=marca,c=color) plt.xlabel("longitud de sépalo") plt.ylabel("anchura de sépalo") plt.show() Selección de filas o columnas: X_iris[:,0], X_iris[:30,1:3] Selección de los elementos de un array que cumplen una propiedad:
Iris: Visualización de los datos
Iris: Visualización de los datos Representación gráfica de los datos con respecto a un par de características def representacion_grafica(datos,caracteristicas, objetivo,clases,c1,c2): for tipo,marca,color in zip(range(len(clases)),"sod","rgb"): plt.scatter(datos[objetivo == tipo,c1], datos[objetivo == tipo,c2], marker=marca,c=color) plt.xlabel(caracteristicas[c1]) plt.ylabel(caracteristicas[c2]) plt.legend(clases) plt.show() representacion_grafica(iris.data,x_names,y_iris,y_names,0,1)
Iris: Visualización de los datos
Conjuntos de entrenamiento, validación y prueba Dividir el conjunto de datos Conjunto de entrenamiento: Conjunto de datos que se utilizará para aprender un modelo Conjunto de validación: Conjunto de datos que se utilizará para ajustar los (hiper-)parámetros del modelo Conjunto de prueba: Conjunto de datos que se utilizará para evaluar el rendimiento del modelo finalmente obtenido Hay veces que no nos podemos permitir el lujo de no usar todos los datos para el entrenamiento Validación cruzada
Conjuntos de entrenamiento y prueba Separación de datos en scikit-learn: librería cross_validation from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = \ train_test_split(x_iris,y_iris,test_size = 0.25)
Normalización de las características La diferencia de escala entre las características puede dar más importancia a algunas de ellas frente a otras En nuestro caso la longitud tiene una escala mayor que la anchura La normalización de las características unifica la escala, de forma que no influya en la relevancia de las características en la clasificación Normalización de los datos en scikit-learn: librería preprocessing Los parámetros del normalizador se ajustan a partir del conjunto de datos de entrada Ejemplo: normalizador estándar que ajusta una muestra de datos para que la media sea cero y la desviación uno
Normalización de las características Normalización de los datos en scikit-learn: librería preprocessing El método fit ajusta los parámetros del normalizador a partir de un conjunto de datos El método transform modifica un conjunto de datos con respecto al normalizador, una vez que sus parámetros han sido ajustados from sklearn.preprocessing import StandardScaler normalizador = StandardScaler().fit(X_train) Xn_train = normalizador.transform(x_train)
Normalización de las características Normalización de los datos en scikit-learn: librería preprocessing Los parámetros ajustados se almacenan como valores de atributos del normalizador: mean_, std_ >>> normalizador.mean_ array([ 5.85267857, 3.04107143]) >>> normalizador.std_ array([ 0.86797793, 0.41951366]) El conjunto de datos resultado tiene media cero y desviación uno >>> np.mean(xn_train) -9.8334039323942442e-16 >>> np.std(xn_train) 1.0
Normalización de las características Resultado tras la normalización
Primer ejemplo de clasificador en scikit_learn: knn Clasificación directamente a partir de los ejemplos (aprendizaje basado en instancias) Idea: obtener la clasificación de un nuevo ejemplo a a partir de las categorías de los ejemplos más cercanos. Debemos manejar, por tanto, una noción de distancia entre ejemplos. En la mayoría de los casos la distancia usada es la euclídea. Pero se podría usar otra noción de distancia Ejemplo de aplicación: clasificación de documentos
El algoritmo k-nn El algoritmo k-nn (de k nearest neighbors ): Dado un conjunto de entrenamiento (vectores numéricos con una categoría asignada) y un ejemplo nuevo Devolver la categoría mayoritaria en los k ejemplos del conjunto de entrenamiento más cercanos al ejemplo que se quiere clasificar
Distancias para k-nn Posibles distancias usadas para definir la cercanía : n Euclídea: d 2 (x, y) = i=1 (x i y i ) 2 Manhattan: d 1 (x, y) = n i=1 x i y i En general, Minkowski: d p (x, y) = ( n i=1 (x i y i ) p ) 1/p La euclídea se usa cuando cada dimensión mide propiedades similares y la Mahattan en caso contrario; Normalización: cuando no todas las dimensiones son del mismo orden de magnitud, se suelen normalizan las componentes
Algunas observaciones sobre k-nn Elección de k: Usualmente, basándonos en algún conocimiento específico sobre el problema de clasificación También como resultado de pruebas en conjuntos más pequeños (conjuntos de validación) Si la clasificación es binaria, preferiblemente impar, para intentar evitar empates (k =5, por ejemplo) Variante en knn: cada ejemplo de la vecindad no cuenta de la misma manera Por ejemplo, puede ser inversamente proporcional a la distancia al que se quiere clasificar
Clasificador knn en scikit-learn Clase KNeighborsClassifier: >>> from sklearn.neighbors import KNeighborsClassifier >>> knn=kneighborsclassifier(n_neighbors=7) Método fit: >>> knn.fit(xn_train,y_train) Método predict: >>> Xn_test = normalizador.transform(x_test) >>> knn.predict(xn_test) array([2, 2, 0, 1, 2, 2, 2, 2, 2, 2, 0, 1, 2, 2, 1, 1, 1, 0, 0, 2, 1, 2, 2,2, 2, 2, 2, 1, 1, 2, 1, 0, 0, 1, 1, 0, 0, 2]) Método score: >>> knn.score(xn_test,y_test) 0.92105263157894735
Clasificador knn en scikit-learn Todos los clasificadores en scikit-learn tienen implementados los métodos fit, predict y score (entre otros) fit: ajustar el modelo a un conjunto de datos dado (entrenamiento, aprendizaje) predict: usar el modelo ajustado para predecir la clase de nuevas instancias score: porcentaje de aciertos sobre un conjunto de prueba del que se conoce su clasificación Además, los clasificadores tienen una serie de (hiper)-parámetros que se proporcionan al constructr de la clase. Por ejemplo, algunos parámetros de knn en scikit-learn: Número de vecinos k Distancia usada Peso de cada vecino
Uso de cuadernos Jupyter notebooks Entorno interactivo, que permite integrar: Ejecución de código (no solo python) Texto Gráficos Herramienta muy usada para análisis de datos Ver demo en clase...
Bibliografía Andreas C. Müller y Sarah Guido Introduction to Machine Learning with Python (O Really, 2017) Capítulos 1 y 2.