Muestra las diferencias entre dos versiones de la página.
Ambos lados, revisión anterior Revisión previa Próxima revisión | Revisión previa | ||
clase:iabd:pia:1eval:tema04 [2024/11/13 18:43] admin [Ejercicios] |
clase:iabd:pia:1eval:tema04 [2025/02/02 18:32] (actual) admin [Personalización] |
||
---|---|---|---|
Línea 261: | Línea 261: | ||
figure.suptitle(" | figure.suptitle(" | ||
- | subfigure_a, | + | subfigures |
+ | subfigure_a=subfigures[0] | ||
+ | subfigure_b=subfigures[1] | ||
subfigure_a.suptitle(" | subfigure_a.suptitle(" | ||
Línea 841: | Línea 843: | ||
También podemos obtener el siguiente color que vamos a usar con: | También podemos obtener el siguiente color que vamos a usar con: | ||
<sxh python> | <sxh python> | ||
+ | #Versiones nuevas | ||
+ | color=axes._get_lines.get_next_color() | ||
+ | #Versiones antiguas | ||
color=next(axes._get_lines.prop_cycler)[' | color=next(axes._get_lines.prop_cycler)[' | ||
</ | </ | ||
Línea 1095: | Línea 1100: | ||
Como podemos ver hay muchos estilos relacionados con [[https:// | Como podemos ver hay muchos estilos relacionados con [[https:// | ||
+ | |||
+ | ==== Definir el propio estilo ==== | ||
+ | Normalmente queremos que todas nuestras gráficas tengan un mismo estilo , por ello es bueno crear una serie de funciones estándar que siempre usaremos. | ||
+ | |||
+ | * La primera función que usamos se llama '' | ||
+ | |||
+ | <sxh python> | ||
+ | def axes_configure_labels(axes, | ||
+ | color="# | ||
+ | facecolor="# | ||
+ | gridcolor="# | ||
+ | tickcolor="# | ||
+ | fontsize_label=13 | ||
+ | |||
+ | axes.set_xlabel(xlabel, | ||
+ | axes.set_ylabel(ylabel, | ||
+ | axes.set_title(title, | ||
+ | |||
+ | axes.set_facecolor(facecolor) | ||
+ | axes.spines[' | ||
+ | axes.spines[' | ||
+ | axes.spines[' | ||
+ | axes.spines[' | ||
+ | axes.tick_params(axis=' | ||
+ | |||
+ | axes.grid(visible=True, | ||
+ | axes.set_axisbelow(True) | ||
+ | |||
+ | handles, labels = axes.get_legend_handles_labels() | ||
+ | if labels: | ||
+ | axes.legend(fontsize=fontsize_label-2, | ||
+ | |||
+ | </ | ||
+ | |||
+ | |||
+ | * La siguiente función es '' | ||
+ | |||
+ | <sxh python> | ||
+ | def axes_configure_axis_for_metrics(axes): | ||
+ | axes.set_xlim(xmin=0, | ||
+ | axes.set_ylim(ymin=0, | ||
+ | |||
+ | axes.xaxis.set_major_locator(MultipleLocator(0.1)) | ||
+ | axes.yaxis.set_major_locator(MultipleLocator(0.1)) | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
===== Ejercicios ===== | ===== Ejercicios ===== | ||
Línea 1660: | Línea 1713: | ||
- | ==== Ejercicio 24.A ==== | + | ===== Mini-proyecto |
+ | |||
+ | ==== Paso 1 === | ||
De varios paises tenemos los siguientes datos del gatos en educación y su PIB que nos retorna la función '' | De varios paises tenemos los siguientes datos del gatos en educación y su PIB que nos retorna la función '' | ||
<sxh python> | <sxh python> | ||
def get_datos(): | def get_datos(): | ||
- | | + | |
- | | + | |
- | | + | [ 14.92688637 , |
- | | + | [ 25.3139145 |
- | | + | [ 46.63551059 , |
- | | + | [ 54.68810274 , 150.09622546], [ 57.13046193 |
- | pib=np.array([ 56.18031474, | + | [ 69.51252436 , 128.72247348], [ 69.83788756 |
- | 59.10244323, | + | [ 87.09879038 , 217.28932067], [ 89.00469759 |
- | 68.43756969, | + | [ 94.1944751 |
- | 98.93395801, | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | datos=np.column_stack((gasto_educacion, | ||
return datos | return datos | ||
</ | </ | ||
Línea 1688: | Línea 1737: | ||
{{: | {{: | ||
- | ==== Ejercicio 24.B ==== | + | ==== Paso 2 ==== |
Resulta que la ecuación correcta que rige ese modelo es una recta: | Resulta que la ecuación correcta que rige ese modelo es una recta: | ||
Línea 1696: | Línea 1745: | ||
$$ | $$ | ||
- | pib=a \cdot gatos \; en \; educacion + b | + | pib=a \cdot gastos |
$$ | $$ | ||
Línea 1708: | Línea 1757: | ||
$$ | $$ | ||
- | pib=1.6 \cdot gatos \; en \; educacion + 30 | + | pib=1.6 \cdot gastos |
$$ | $$ | ||
Línea 1715: | Línea 1764: | ||
{{: | {{: | ||
- | ==== Ejercicio 24.C ==== | + | ==== Paso 3 ==== |
Ahora usando la siguiente red neuronal: | Ahora usando la siguiente red neuronal: | ||
Línea 1729: | Línea 1778: | ||
| | ||
| | ||
- | model.fit(x, | + | |
- | return model | + | return model,history |
</ | </ | ||
- | * Entrena la red | + | * Entrena la red neuronal durante 200 épocas |
- | * Muestra el resultado sobre la gráfica anterior. | + | * Muestra el resultado |
- | * Muestra el valor de "a" | + | * Muestra el valor de $a$ y $b$ del modelo con las siguientes líneas |
<sxh python> | <sxh python> | ||
Línea 1747: | Línea 1796: | ||
+ | ==== Paso 4 ==== | ||
+ | Vuelve a entrenar ahora el modelo ahora con 27500 épocas y comprueba ahora da mejores resultados. | ||
+ | |||
+ | Para ello: | ||
+ | * Vuelve a recrear la gráfica anterior | ||
+ | * Muestra los valores de a y b | ||
+ | |||
+ | {{: | ||
+ | |||
+ | ==== Paso 5 ==== | ||
+ | Ahora vamos a calcular como de " | ||
+ | |||
+ | La formula que vamos a usar es **Mean Squared Error** (MSE) | ||
+ | |||
+ | $$ | ||
+ | loss=Perdida=error \: medio=\frac{1}{N} \sum_{i=1}^{N} |y_{true}-y_{score}|^{2}=\frac{1}{N} \sum_{i=1}^{N} |pib_{true}-pib_{predicho}|^{2} | ||
+ | $$ | ||
+ | |||
+ | Imprime el resultado | ||
+ | |||
+ | === Paso 6 === | ||
+ | Si nos fijamos cuando hemos definido la red neuronal , el método '' | ||
+ | |||
+ | <sxh python> | ||
+ | model.compile(loss=' | ||
+ | </ | ||
+ | |||
+ | Es decir que le estamos diciendo a la red neuronal que para entrenarse use el **Mean Squared Error** como función de pérdida. | ||
+ | |||
+ | Así que resulta que no hace falta que nosotros calculemos el **Mean Squared Error** porque ya lo hace keras por nosotros. | ||
+ | La forma de acceder a ese valor es la siguiente, el método '' | ||
+ | |||
+ | <sxh python> | ||
+ | history=model.fit(x, | ||
+ | </ | ||
+ | |||
+ | <sxh python> | ||
+ | loss=history.history[' | ||
+ | </ | ||
+ | |||
+ | En este caso '' | ||
+ | |||
+ | === Paso 7 === | ||
+ | Ahora muestra una gráfica con todos los valores de //loss// para que veas como va evolucionando la pérdida a medida que se va entrenando la red en cada época | ||
+ | Y muestra la última perdida | ||
+ | |||
+ | {{: | ||
+ | |||
+ | === Paso 8 === | ||
+ | Muestra en una figura las 2 gráficas anteriores | ||
+ | |||
+ | {{: | ||
+ | |||
+ | === Paso 9 === | ||
+ | Ahora vamos a crear una red neuronal muchísimo más compleja para hacer que el error sea aun menor. La red es la siguiente: | ||
+ | |||
+ | <sxh python> | ||
+ | def compile_fit(x, | ||
+ | np.random.seed(5) | ||
+ | tf.random.set_seed(5) | ||
+ | random.seed(5) | ||
+ | | ||
+ | model=Sequential() | ||
+ | model.add(Dense(1, | ||
+ | model.add(Dense(10, | ||
+ | model.add(Dense(100, | ||
+ | model.add(Dense(300, | ||
+ | model.add(Dense(600, | ||
+ | model.add(Dense(900, | ||
+ | model.add(Dense(1800, | ||
+ | model.add(Dense(900, | ||
+ | model.add(Dense(600, | ||
+ | model.add(Dense(300, | ||
+ | model.add(Dense(200, | ||
+ | model.add(Dense(100, | ||
+ | model.add(Dense(10, | ||
+ | model.add(Dense(1, | ||
+ | model.compile(loss=' | ||
+ | | ||
+ | | ||
+ | history=model.fit(x, | ||
+ | |||
+ | return model, | ||
+ | </ | ||
+ | |||
+ | Entranala durante 10000 épocas y muestra las 2 gráficas | ||
+ | |||
+ | {{: | ||
+ | |||
+ | === Paso 10 === | ||
+ | Ahora usando los siguientes datos, calcula manualmente la pérdida //loss// y comparala con la pérdida anterior | ||
+ | |||
+ | <sxh python> | ||
+ | def get_datos_validacion(): | ||
+ | datos_validacion=np.array( | ||
+ | [[ 1.22140488 , 59.35315077] , [ 2.42834632 , 3.50613409] , [ 4.27529991 , 70.39938914] , | ||
+ | [ 14.44651349 , 50.0606769 ] , [ 16.10795855 , 81.08562061] , [ 16.75024181 , 33.95365822] , | ||
+ | [ 26.80487149 , 47.1495392 ] , [ 28.81517859 , | ||
+ | [ 52.08015067 , | ||
+ | [ 60.39615207 , 97.77483743] , [ 73.52487026 , 92.30645543] , [ 76.2771471 | ||
+ | [ 84.56808303 , | ||
+ | [ 93.53406333 , | ||
+ | ) | ||
+ | return datos_validacion | ||
+ | </ | ||
+ | |||
+ | Añade a la gráfica los datos de validación | ||
+ | |||
+ | ¿Que ha ocurrido? Se llama Sobreajuste | ||
+ | |||
+ | {{: | ||
+ | |||
+ | |||
+ | === Paso 11 === | ||
+ | Estos nuevos datos se pueden incluir también en el método '' | ||
+ | |||
+ | <sxh python> | ||
+ | history=model.fit(x, | ||
+ | </ | ||
+ | |||
+ | Para acceder desde '' | ||
+ | |||
+ | <sxh python> | ||
+ | val_loss=history.history[' | ||
+ | </ | ||
+ | |||
+ | Muestra ahora una nueva figura con la perdida tanto en entrenamiento como en validación y los datos. | ||
+ | |||
+ | {{: | ||
+ | |||
+ | === Paso 12 === | ||
+ | Muestra la gráfica con los datos originales pero que el resultado de la red sea hasta 200 | ||
+ | |||
+ | {{: | ||
+ | |||
+ | |||
+ | |||
+ | === Paso 13 === | ||
+ | Ahora vamos a hacer predicciones en el modelo y comprobar si hay algún problema a lo largo del tiempo. | ||
+ | Para ello vamos a realizar 300 predicciones semanales y obtener la media y la desviación estándar de todas las predicciones de una semana. | ||
+ | Y eso lo vamos a realizar durante 600 semanas. | ||
+ | |||
+ | Para obtener las 300 predicciones semanales vamos a usar la siguiente función '' | ||
+ | <sxh python> | ||
+ | np.random.seed(8) | ||
+ | def get_gastos_educacion(semana): | ||
+ | num_predicciones_semanales=300 | ||
+ | gastos_educacion=np.random.uniform((semana/ | ||
+ | gastos_educacion=gastos_educacion[gastos_educacion> | ||
+ | |||
+ | return gastos_educacion | ||
+ | </ | ||
+ | |||
+ | Y mostraremos para cada un de las 600 semanas la media y la desviación estandard. | ||
+ | |||
+ | ¿Ves algo raro? | ||
+ | |||
+ | |||
+ | {{: | ||
+ | |||
+ | === Paso 14 === | ||
+ | Siguiendo con el DataSet de los precios de viviendas en la ciudad de Boston, vamos a mostrar las gráficas con | ||
+ | las pérdidas y la métrica del Coeficiente de determinación o R² de todas las redes neuronales que se entrenaron en el tema anterior (entrenamiento y validación) | ||
+ | |||
+ | Para poder mostrar el Coeficiente de determinación o R² deberemos modificar el método '' | ||
+ | <sxh python> | ||
+ | model.compile(loss=' | ||
+ | </ | ||
+ | |||
+ | Se usa de la siguiente forma: | ||
+ | * Obtener el R² para cada época en el entrenamiento | ||
+ | <sxh python> | ||
+ | r2_score=history.history[' | ||
+ | </ | ||
+ | |||
+ | * Obtener el R² para cada época en validación | ||
+ | <sxh python> | ||
+ | r2_score_validacion=history.history[' | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | {{: | ||
+ | |||
+ | |||
+ | <sxh python> | ||
+ | redes_neuronales=[ | ||
+ | [[20, | ||
+ | [[20, | ||
+ | [[20, | ||
+ | [[20, | ||
+ | [[20, | ||
+ | [[20, | ||
+ | [[20, | ||
+ | [[20, | ||
+ | [[20, | ||
+ | [[20, | ||
+ | [[20, | ||
+ | [[20, | ||
+ | [[20, | ||
+ | [[20, | ||
+ | [[20, | ||
+ | ] | ||
+ | |||
+ | epochs=300 | ||
+ | </ | ||
+ | |||
+ | <sxh base> | ||
+ | Nombre | ||
+ | | ||
+ | -------- | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | 10 [20, 40, 80, 40, 20, 1] 300 relu | ||
+ | 11 [20, 40, 80, 40, 20, 1] 300 selu | ||
+ | 12 [20, 40, 80, 40, 20, 1] 300 tanh | ||
+ | 13 [20, 40, 80, 160, 80, 40, 20, 1] | ||
+ | 14 [20, 40, 80, 160, 80, 40, 20, 1] | ||
+ | 15 [20, 40, 80, 160, 80, 40, 20, 1] | ||
+ | |||
+ | </ | ||
+ | |||
+ | Para cada una de las redes indica: | ||
+ | * Si tiene unas buenas métricas en la última época | ||
+ | * Si es buena o mala red , es decir si la elegirías. Explica el motivo | ||
+ | * Compara los resultados con los del tema anterior ¿Porque hay esas variaciones? | ||
+ | |||
+ | === Paso 15 === | ||
+ | Repite el ejercicio anterior pero ahora solo para 10 épocas y muestra solo la pérdida en entrenamiento y validación. | ||
+ | |||
+ | {{: | ||
+ | |||
+ | Para cada una de las redes indicas si podrías " | ||