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/14 18:45] admin |
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 1725: | Línea 1778: | ||
| | ||
| | ||
- | model.fit(x, | + | |
- | return model | + | return model,history |
</ | </ | ||
Línea 1744: | Línea 1797: | ||
==== Paso 4 ==== | ==== Paso 4 ==== | ||
- | Vuelve a entrenar ahora el modelo ahora con 27500 épocas y si ahora da mejores resultados. | + | Vuelve a entrenar ahora el modelo ahora con 27500 épocas y comprueba |
Para ello: | Para ello: | ||
Línea 1751: | Línea 1804: | ||
{{: | {{: | ||
+ | |||
+ | ==== 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 " | ||
+ | |||
+ |