IA1 Lab05

LABORATORIO NRO 05 1 APRENDIZAJE (MACHINE LEARNING) En grupos de 2 personas desarrolla los siguientes ejercicios: REG

Views 531 Downloads 7 File size 2MB

Report DMCA / Copyright

DOWNLOAD FILE

Recommend stories

Citation preview

LABORATORIO NRO 05 1

APRENDIZAJE (MACHINE LEARNING)

En grupos de 2 personas desarrolla los siguientes ejercicios:

REGRESION LINEAL 1. Implementar la regresión lineal y ver cómo es que funciona con datos. Se necesitará bajar el código inicial (starter code) y desempaquetar su contenido al directorio donde se desee completar el ejercicio. Si es necesario, usar el comando cd en Octave para cambiar al directorio antes de empezar los ejercicios. Además se puede encontrar instrucciones de instalación de Octave en la página Octave Installation. Archivos incluidos en este ejercicio: Ex1.m – script en Octave que ayuda a dar pasos a través del ejercicio. Ex1_multi.m – script en Octave para las partes finales del ejercicio. Ex1data1.txt – Conjunto de datos para regresión lineal con una variable. Ex1data2.txt – Conjunto de datos para regresión lineal con múltiples variables. *warmUpExercise.m – ejemplo simple de funciones en Octave. *plotData.m – función para displayar el conjunto de datos. *computeCost.m – función para calcular el costo de regresión lineal. *gradientDescentMulti.m – algoritmo gradient descent para múltiples variables. +computeCostMulti.m – función de costo para múltiples variables. +gradientDescentMulti.m – gradient descent para múltiples variables. +FeatureNormalize.m – Función para normalizar características. +normalEqn.m – Función para calcular ecuaciones normales. * indica archivos que necesitas completar + indica archivos con ejercicios extras. A través de este ejercicio, usarás los scripts ex1.m y ex1_multi.m. Estos scripts configuran el conjunto de datos para los problemas y hacen llamadas a funciones que tu escribirás. No necesitas modificar ninguno de ellos. Solo requieres modificar las funciones en los otros archivos, siguiendo estas instrucciones. Para este ejercicios de programación solo requieres completar la primera parte del ejercicio de implementar regresión lineal con una variable. La segunda parte del ejercicio, la cual podrás completar para una nota extra, cubre regresión lineal con múltiples variables. Los ejercicios usan Octave, un lenguaje de programación de alto nivel para computaciones numéricas. Puedes referirte a la página de ayuda para la instalación del mismo. (https://class.coursera.org/ml/wiki/view?page=OctaveInstallation)

1

Escuela Prof. De Ingeniería de Sistemas – UNSA- M.Sc. Carlo Corrales En la línea de comandos de Octave, escribe help seguido del nombre de la función, para ver la ayuda del mismo. Por ejemplo help plot nos dará información para ploteo. Además hay un manual de Octave aquí (Octave documentation pages ). A) Función simple en Octave La primera parte de ex1.m da ejercicio a la sintaxis de Octave. En el archivo warmUpExercise.m encontrarás la cabecera de la función en Octave. Modifícala para retornar una matriz identidad 5x5 llenando el siguiente código: A = eye(5); Luego ejecuta ex1.m (asumiendo que estás en el correcto directorio, escribe ex1 en el prompt de Octave) y deberías ver una salida similar a esta:

Ahora ex1.m esperará hasta que presiones una tecla, y luego correrá el código para la siguiente parte de la tarea. Si deseas salir, escribe ctrl-c. B) Regresión lineal con una variable En esta parte del ejercicio, implementarás regresión lineal con una variable para predecir ganancias de un camión de comidas. Supón que estás en un restaurante y estás considerando diferentes ciudades para aperturar un nuevo local. La cadena tiene ya camiones de comida en varias ciudades y tienes datos de ganancias y población para esas ciudades. Te gustaría usar esos datos para ayudarte a seleccionar cual ciudad se debería expandir a continuación. El archivo ex1data1.txt contiene el conjunto de datos para nuestro problema de regresión lineal. La primer columna es la población de una ciudad y la segunda es la ganancia de un camión de comida en esa ciudad. Un valor negativo para la ganancia indica una pérdida. El script ex1.m ha sido programado para cargar los datos. B.1 Graficando los datos Antes de empezar cualquier tarea, es usual entender los datos visualizándolos. Para este conjunto de datos puedes usar un Plot scatter para visualizarlos ya que solo hay 2

2

LABORATORIO NRO 05 3 propiedades (ganancia y población). En ex1.m el conjunto de datos es cargado en las variables X e y: data = load(‘ex1data1.txt’); X = data(:, 1); y = data(:, 2); m = length(y); A continuación, el script llama a la función plotData para crear un scatter plot de los datos. Tu trabajo es completar plotData.m para dibujar el plot; modifica el archivo y llena el siguiente código: plot(x,y,’rx’,’MarkerSize’, 10); ylabel(‘Ganancia en $10000s’); xlabel(‘Población de la ciudad en 10000s’); Ahora, cuando continuas ejecutando ex1.m nuestro resultado final deberá ser como la figura 1, con las mismas x rojas y etiquetas en los ejes.

B.2 Gradient Descent En esta parte, encajarás los parámetros de la regresión lineal ϑ a nuestro conjunto de datos usando gradient descent. - Actualizando las ecuaciones: El objetivo de la regresión lineal es minimizar la función de costo:

3

Escuela Prof. De Ingeniería de Sistemas – UNSA- M.Sc. Carlo Corrales

donde la hipótesis h (x) es dada por el modelo lineal: ϑ

recordando que los parámetros de tu modelo son los valores ϑj. Estos son los valores que ajustarás para minimizar el costo J(ϑ). Una manera de hacerlo es usar el algoritmo batch gradient descent. En este algoritmo cada iteración realiza las modificaciones:

Con cada paso del algoritmo gradient descent, tus parámetros ϑj se acercan a los valores óptimos que producirán el costo mínimo J(ϑ). Nota de implementación: Almacenamos cada ejemplo como una fila en la matriz X en Octave. Para tomar en cuenta el término interceptado ϑ0, añadimos una columna inicial adicional a X y le damos el valor de 1 a todos. Esto nos permite tratar ϑ0 como simplemente otra característica. - Implementación En ex1.m tenemos configurado ya los datos para regresión lineal. En las siguientes líneas adicionaremos otra dimensión a nuestros datos para acomodar el término interceptado ϑ0. Además inicializamos los parámetros a 0 y el ratio de aprendizaje alpha a 0.01. X = [ones(m, 1) data(:,1)]; theta = zeros(2,1); iterations = 1500; alpha = 0.01; - Calculando la función de Costo J(ϑ) A medida que usas gradient descent para aprender a minimizar la función de costo J(ϑ), es usual monitorizar la convergencia calculando el costo. En esta parte implementaremos una función para calcular J(ϑ) así se puede chequear la convergencia de tu implementación de gradient descent. La siguiente tarea es completar el código en el archivo computeCost.m el cual es una función que calcula J(ϑ). A medida que vas haciendo esto, recuerda que las variables X e y

4

LABORATORIO NRO 05 5 no tienen valores escalares, sino matrices cuyas columnas representan los ejemplos del conjunto de entrenamiento. Una vez que has completado la función, el siguiente paso en ex1.m correrá la función de costo una vez usando ϑ inicializado en ceros, e imprimiendo los costos. Deberías ver un costo de 32.07. - Gradient descent A continuación implementarás gradient descent en el archivo gradientDescent.m. La estructura cíclica ya ha sido escrita, así que solo será necesario modificar los valores de ϑ dentro de cada iteración. A medida que programas, asegúrate de entender que estas tratando de optimizar y qué se está modificando. Recuerda que el costo J(ϑ) es parametrizado por el vector ϑ, no por X ni y. Esto es, minimizamos el valor de J(ϑ) cambiando los valores del vector ϑ, no cambiando X ni y. Una buena manera de verificar que gradient descent está trabajando correctamente es ver los valores de J(ϑ) y chequear que está decrementando con cada paso. El código de inicio para gradientDescent.m llama a computeCost en cada iteración e imprime su costo. Asumiendo que has implementado gradient descent y computeCost correctamente, el valor de J(ϑ) nunca debe incrementarse, y debería converger a un valor al final del algoritmo. Luego de haber terminado, ex1.m usará los parámetros finales para plotear la línea de encaje. El resultado debería verse como la Figura 2.

Los valores finales para ϑ serán usados para hacer predicciones en ganancias en las áreas de 35000 y 70000 personas. Note la manera que la línea continua en ex1.m usa multiplicación de matrices, en vez de sumas explícitas o ciclos, para calcular predicciones. Este es un ejemplo de vectorización de código en Octave.

5

Escuela Prof. De Ingeniería de Sistemas – UNSA- M.Sc. Carlo Corrales predict1 = [1, 3.5] * theta; predict2 = [1, 7] * theta; B.3 Depuración: Aquí hay algunas cosas que mantener en mente cuando implementas gradient descent: - Los índices de arreglos en Octave empiezan desde uno, no de cero. Si estás colocando ϑ0 y ϑ1 en un vector llamado theta, los valores serán theta(1) y theta(2). - Si encuentras muchos errores en tiempo de ejecución, revisa las operaciones de matrices para asegurarte que estás añadiendo y multiplicando matrices en dimensiones compatibles. Imprimir las dimensiones de las variables con el comando size te ayudará a depurar tu programa. - Por defecto, Octave interpreta operadores matemáticos como operaciones en matrices. Este es una fuente común de errores de incompatibilidad de tamaños. Si no quieres multiplicación de matrices, necesitas agregar un punto en tu notación para especificarlo en Octave. Por ejemplo, A*B multiplica matrices, mientras A.*B hace una operación de multiplicación elemento a elemento. B.4 Visualizando J(ϑ) Para entender mejor la función de costo J(ϑ), dibujaras el costo sobre un plano cartesiano 2d de valores ϑ0 y ϑ1 . No necesitaras codificar nada nuevo aquí, pero deberás entender cómo está creando las imágenes el código que acabas de escribir. El siguiente paso de ex1.m hay un código programado para calcular J(ϑ) sobre una grilla de valores usando la función computeCost que has escrito.

Luego de que estas líneas son ejecutadas, tendrás un arreglo 2D de valores J(ϑ). El script ex1.m usará estos valores para producir una superficie y un contorno de J(ϑ) usando los comandos surf y contour. Los ploteos deberán verse algo así como la Figura 3:

6

LABORATORIO NRO 05 7

El propósito de estos gráficos es mostrar cómo J(ϑ) varia con los cambios en ϑ0 y ϑ1. La función de costo J(ϑ) tiene una forma de bowl y un mínimo global. Es más fácil verlo en el ploteo de contorno que el la superficie 3D. Este mínimo es el punto óptimo para ϑ0 y ϑ1, y en cada paso del algoritmo gradient descent éste se mueve más cerca de este punto.

Créditos Extra

7

Escuela Prof. De Ingeniería de Sistemas – UNSA- M.Sc. Carlo Corrales

8

LABORATORIO NRO 05 9

9

Escuela Prof. De Ingeniería de Sistemas – UNSA- M.Sc. Carlo Corrales

10

1 LABORATORIO NRO 05 1

11

Escuela Prof. De Ingeniería de Sistemas – UNSA- M.Sc. Carlo Corrales

12

1 LABORATORIO NRO 05 3

REGRESION LOGISTICA 2. Implementar la Regresión Logística y aplicarla a 2 conjuntos de datos. Antes de iniciar se necesitará bajar el starter code y desempaquetarlo en el directorio donde queremos completar el ejercicio. Si es necesario, usar el comando cd de Octave para cambiar este directorio antes de iniciar el ejercicio. Archivos incluidos en este ejercicio: Ex2.m – script en Octave que ayuda a dar pasos a través del ejercicio. Ex2_reg.m – script en Octave para las partes finales del ejercicio. Ex2data1.txt – Conjunto de datos de entrenamiento para la primera mitad del ejercicio. Ex2data2.txt – Conjunto de datos de entrenamiento para la segunda mitad del ejercicio. mapFeature.m – Función para generar características polinomiales. plotDecisionBoundary.m – Función para plotear los límites de decisión del clasificador. *plotData.m – función para displayar el conjunto de datos de clasificación 2D. *sigmoid.m – función sigmoideo *costFunction.m – función de costo para regresión logística *predict.m – función de predicciónn de regresión logística *costFunctionReg.m – Costo de Regresión logística regularizada A través de este ejercicio, usarás los scripts ex2.m y ex2_reg.m. Estos scripts establecen el conjunto de datos para los problemas y hacen llamadas a funciones que escribiremos. No necesitamos modificar ninguna de ellas. Solo se requiere modificar las funciones en los otros archivos, siguiendo las instrucciones en esta descripción. Los ejercicios en este curso usan Octave, el lenguaje de programación para computaciones numéricas. A) Regresión logística En esta parte del ejercicio, construirás un modelo de regresión logística para predecir si un estudiante es admitido o no a una universidad. Suponga que eres un administrador de un departamento universitario y quieres determinar el chance de admisión de cada postulante basado en sus resultados de 2 exámenes. Cuentas con los datos históricos de previos postulantes que puedes usar como conjunto de entrenamiento para regresión logística. Por cada ejemplo de entrenamiento se tiene las notas de 2 exámenes y la decisión de admisión. El trabajo es construir un modelo de clasificación que estime la probabilidad de admisión del postulante basado en las notas de los 2 exámenes. Estos datos se encuentran en ex2.m. Desde allí se te guiará durante el ejercicio.

13

Escuela Prof. De Ingeniería de Sistemas – UNSA- M.Sc. Carlo Corrales B) Visualizar los datos Antes de empezar a implementar cualquier algoritmo de aprendizaje, es bueno visualizar los datos si es posible. En la primera parte de ex2.m el código cargará los datos y los visualizará en un plot 2D llamando a la función plotData. Completarás el código en plotData para que visualice una figura como la Figura 1, donde los ejes son las notas de los 2 exámenes y los ejemplos positivos y negativos son visualizados con diferentes marcas:

Para ayudarte a familiarizar con los ploteos, se ha dejado el archivo plotData.m vacío así se debe intentar implementarlo. Sin embargo, este es un ejercicio opcional. Además se provee una implementación debajo, así que se puede copiar o referirse a ella. Si se escoge copiar este ejemplo, asegúrese de haber aprendido que hace cada comando, consultando la documentación de Octave.

14

1 LABORATORIO NRO 05 5 C) Implementación C.1 Ejercicio de calentamiento: Función sigmoide Antes de empezar con la función de costo actual, recuerde que la hipótesis de regresión logística está definida así:

donde la función g es la función sigmoideo. Esta función está definida así:

El primer paso es implementar esta función en sigmoid.m así podrá ser llamada por el resto de tu programa. Cuando hayas terminado, intenta probar unos cuantos valores llamando a sigmoid(x) en la línea de comandos de Octave. Para valores positivos grandes de x, el sigmoideo debe ser cercano a 0. Evaluar sigmoid(0) debe dar exactamente 0.5. Tu código debe trabajar con vectores y matrices. Para una matriz, tu función debe mostrar la función sigmoideo en cada elemento. C.2 Función de costo y gradiente Ahora deberás implementar la función de costo y la gradiente para regresión logística. Completa el código en costFunction.m para retornar el costo y el gradiente. Recuerda que la función de costo en regresión logística es:

y la gradiente del costo es un vector de la misma longitud que ϑ donde el j-ésimo elemento (para j=0,1,…,n) está definido como sigue:

Nota que mientras este gradiente parece idéntico al gradiente de regresión lineal, la fórmula es diferente pues la regresión logística y la lineal tienen diferentes definiciones de h (x). Una vez que hayas terminado, ex2.m llamará a costFunction usando los parámetros de ϑ. Deberás ver que el costo es más o menos 0.693. ϑ

15

Escuela Prof. De Ingeniería de Sistemas – UNSA- M.Sc. Carlo Corrales

C.3 Parámetros de aprendizaje usando fminunc

-

En la tarea previa, hallaste los parámetros óptimos del modelo de regresión lineal, al implementar gradient descent. Escribiste la función de costo y calculaste su gradiente, luego seguiste los pasos de gradient descent. Ahora, en vez de tomar los pasos de gradient descent, usarás la función de Octave llamada fminunc. La función fminunc de Octave es un solucionador de optimización que encuentra el mínimo de una función sin restricciones. Para la regresión logística, tu deseas optimizar la función de costo J(ϑ) con los parámetros ϑ. Concretamente, usarás fminunc para hallar los mejores parámetros ϑ para la función de costo de regresión logística, dado un conjunto de datos fijo ( de valores para X e y). Pasarás los siguientes argumentos a fminunc: Los valores iniciales de los parámetros que tratamos de optimizar. Una función que, dado un conjunto de entrenamiento y un particular ϑ, calcula el costo de la regresión logística y su gradiente con respecto a ϑ para el conjunto de datos (X,y). En ex2.m tenemos el código escrito para llamar a fminunc con los argumentos correctos.

En este código, primero hemos definido las opciones a ser usadas por fminunc. Específicamente establecemos GradObj en on, lo que significa que nuestra función retorna ambos el costo y el gradiente. Esto permite a fminunc usar el gradiente cuando se minimiza la función. Además establecemos MaxIter en 400 para que fminunc se ejecute como máximo 400 pasos antes de terminar. Para especificar la función actual que estamos minimizando, usamos @(t)(costFunction(t,X,y)) para especificar las funciones. Esto crea una función con argumento t, la cual llama a costFunction. Esto nos permite envolver costFunction para usarlo con fminunc. Si hemos completado fminunc correctamente, fminunc convergerá en los parámetros correctos de optimización y retornará los valores finales del costo y ϑ. Note que al usar fminunc no hay que escribir ciclos, o establecer rangos de aprendizaje como se hizo para gradient descent. Esto es todo para fminunc: solo se necesita proveer una función que calcule el costo y el gradiente. Una vez que fminunc completa, ex2.m llamará a tu función costFunction usando los parámetros opcionales de ϑ. Se debería ver el costo más o menos 0.203. El valor final de ϑ será usado para plotear el límite de decisión en los datos de entrenamiento, resultando una figura similar a la Figura 2:

16

1 LABORATORIO NRO 05 7

Además animamos a que se vea en el código en plotDecisionBoundary.m para ver cómo se plotea tal límite usando los valores ϑ. C.4 Evaluando la regresión logística Luego de aprender los parámetros, puedes usar el modelo para predecir si un postulante en especial será admitido o no. Para un estudiante con nota en el examen1 igual a 45 y nota en examen2 de 85, deberías esperar ver una probabilidad de admisión de 0.776. Otra forma de evaluar la calidad de los parámetros que hemos encontrado es ver cuan bien el modelo aprendido predice en nuestro conjunto de entrenamiento. En esta parte, tu trabajo es completar el código en predict.m. La función predict producirá un 1 o un 0 dado un conjunto de datos y un vector de parámetros aprendidos. Luego de que completes el código en predict.m, el script ex2.m procederá a reportar la exactitud del entrenamiento de tu clasificador calculando el porcentaje de ejemplos que se obtuvo correctamente.

17

Escuela Prof. De Ingeniería de Sistemas – UNSA- M.Sc. Carlo Corrales 3. REGRESION LOGISTICA REGULARIZADA En esta parte de los ejercicios, implementarás regresión logística regularizada para predecir si los microchips de una planta de fabricación pasa la prueba de calidad (AQ). Durante la QA, cada microchip pasa varios test para asegurarse que su funcionamiento es correcto. Suponga que eres un administrador de producción de la fábrica y tienes los resultados de algunos microchips en 2 diferentes test. Con estos resultados, te gustaría determinar si los microchips deben ser aceptados o rechazados. Para ayudarte a la decisión, tienes un conjunto de datos de resultados de test de microchips pasados, con los cuales puedes construir un modelo de regresión logístico. Usarás otro scripts, ex2_reg.m para completar esta porción del ejercicio. A. Visualizando los datos Similar a las partes previas, plotData es usado para generar una figura como la Figura 3, donde los ejes son los 2 test scores, y los ejemplos positivos (y=1, aceptado) y negativos ( y=0, rechazado) son mostrados con diferentes marcas:

La figura 3 muestra que nuestro conjunto de datos no puede ser separado por una línea recta en los ejemplos positivos y negativos. Por tanto, una aplicación de regresión

18

1 LABORATORIO NRO 05 9 logística no mostrará buenos resultados con este conjunto de datos ya que regresión logística solo es capaz de hallar un límite de decisión lineal. B. Mapeo de Características Una forma de encajar los datos mejor es crear más características de cada dato puntual. En la función entregada mapFeature.m mapearemos las características en todos los términos polinomiales de x1 y x2 hasta la potencia de 6.

Como resultado de este mapeo, nuestro vector de 2 características (las notas en los 2 test de QA) han sido transformadas a un vector de 28 dim. Un clasificador de regresión logística entrenado en estas características de alta dimensión, tendrá una mayor límite de decisión compleja y aparecerá no lineal cuando se le dibuje en un ploteo 2D. Mientras que el mapeo de características nos permite construir un clasificador más expresivo, es además más susceptible a overfitting. En la siguiente parte del ejercicio, tendrás que implementar regresión logística regularizada para encajar los datos y además ver cómo la regularización puede ayudar a combatir el problema de overfitting (sobreentrenamiento)

19

Escuela Prof. De Ingeniería de Sistemas – UNSA- M.Sc. Carlo Corrales C. Función de costo y gradiente Ahora implementarás código para calcular la función de costo y gradiente para regresión logística regularizada. Completa el código en costFunctionReg.m para retornar el costo y el gradient. Recuerda que la función de costo regularizada en regresión logística es:

Note que no se debe regularizar el parámetro ϑ0. En Octave, recuerda que los índices se inician en 1, así no deberás regularizar el parámetro theta(1) en el código. El gradiente de la función de costo es un vector donde el elemento j-esimo es definido como sigue:

Una vez que has terminado, ex2_reg.m llamará a la función costFunctionReg usando el valor inicial de ϑ (inicializado en todos ceros). Deberías ver que el costo es más o menos 0.693. C.1 Parámetros aprendidos usando fminunc Similar a las partes previas, usarás la función fminunc para aprender los parámetros óptimos ϑ. Si has completado el costo y el gradiente para regresión logística regularizada (costFunctionReg.m) correctamente, serás capaz de avanzar a la siguiente parte de ex2_reg.m para aprender los parámetros ϑ usando fminunc. D. Ploteando los límites de decisión Para ayudarte a visualizar el modelo aprendido por este clasificador, hemos proveído la función plotDecisionBoundary.m la cual plotea el límite de decisión que separa los ejemplos positivos de los negativos. En plotDecisionBoundary.m, hemos dibujado el límite de decisión no lineal al calcular las predicciones del clasificador en una grilla del espacio y luego hemos dibujado un ploteo de contorno donde las predicciones cambiar de y=0 a y=1. Luego de aprender los parámetros ϑ, el siguiente paso en ex_reg.m ploteará un límite de decisiones igual a la Figura 4:

20

2 LABORATORIO NRO 05 1

Ejercicios Opcionales

21

Escuela Prof. De Ingeniería de Sistemas – UNSA- M.Sc. Carlo Corrales

22

2 LABORATORIO NRO 05 3

PROBLEMAS EN OCTAVE 1. Problema 1

2. Problema 2

23

Escuela Prof. De Ingeniería de Sistemas – UNSA- M.Sc. Carlo Corrales 3. Problema 3

4. Problema 4

24

2 LABORATORIO NRO 05 5

5. Problema 5

25