Reto 9: Regresando
Tarefa 1: Engadindo interactividade á predición do custo das casas
- Duración:
- 30 min
- Agrupamento:
- 2
Intenta engadir funcionalidade iterativa cun bucle while: True nos tres programas da actividade 2 de Regresión (Pasos 1, 2 e 3), de xeito que:
- Pregunte á persona usuaria o novo dato a predicir.
- Use o modelo para realizar a predición.
- Pregunte á persona usuaria se o modelo acertou ou non.
- Cando non acerta, pregunte e engada o dato ao conxunto de adestramento e reentrene o modelo.
- Realice a gráfica (Pasos 2 e 3) actualizada cos novos datos
- Pregunte se queremos introducir máis datos para predecir
Código Python: Prezo dunha casa por tamaño interactivo
# PROGRAMA REGRESIÓN SIMPLE
#Importar as librerías necesarias
from sklearn.linear_model import LinearRegression
# Datos de exemplo: tamaño das casas (m²) e os seus prezos (€)
tamano_casas = [[50], [80], [100], [150], [200]] # Área en m²
prezos_casas = [100000, 180000, 240000, 300000, 400000] # Prezo en euros
# Crear o modelo de regresión lineal
modelo_regresion = LinearRegression()
# Adestrar o modelo cos datos de entrada (tamaño das casas) e saída (prezos)
modelo_regresion.fit(tamano_casas, prezos_casas)
while True:
# Solicitar ao usuario o tamaño da casa
novo_tamano = float(input("Introduce o tamaño da casa en m² para predicir o prezo: "))
predicion = modelo_regresion.predict([[novo_tamano]])
print(f"O prezo predito para unha casa de {novo_tamano} m² é: {predicion[0]:.2f} €")
# # Preguntar se o modelo acertou e se non acertou, pedir prezo real, reentrenar o modelo co novo dato para "aprender"
resposta = input("¿O prezo é correcto? (si/non): ").strip().lower()
if resposta == "non":
novo_prezo = float(input("Introduce o prezo correcto: "))
# Engadir os novos datos ao conxunto
tamano_casas.append([novo_tamano])
prezos_casas.append(novo_prezo)
# Reentrenar o modelo e imprimir os novos datos de entrenamento
modelo_regresion.fit(tamano_casas, prezos_casas)
print(f"Datos de adestramento actuais: {list(zip(tamano_casas, prezos_casas))}")
continuar = input("¿Queres introducir outro dato? (si/non): ").strip().lower()
if continuar != "si":
print("Programa finalizado. Ata logo!")
break
Código Python: Prezo dunha casa por tamaño con gráfica interactivo
#PROGRAMA REGRESIÓN SIMPLE CON GRÁFICA
# Importar bibliotecas necesarias
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
# Datos de exemplo ampliados: tamaño das casas (m²) e prezos (€)
tamano_casas = np.array([[50], [80], [100], [150], [200], [250], [300]]) # Áreas ampliadas
prezos_casas = np.array([100000, 180000, 240000, 300000, 400000, 500000, 600000]) # Prezos ampliados
# Crear o modelo de regresión
modelo = LinearRegression()
# Adestrar o modelo cos datos ampliados
modelo.fit(tamano_casas, prezos_casas)
#Gráfica inicial
plt.ion()
plt.scatter(tamano_casas, prezos_casas, color='blue', label='Datos reais')
plt.plot(tamano_casas, modelo.predict(tamano_casas), color='red', label='Liña de regresión')
plt.xlabel("Tamaño da casa (m²)")
plt.ylabel("Prezo da casa (€)")
plt.title("Liña de regresión actualizada")
plt.legend()
plt.grid(True)
plt.pause(0.1)
while True:
# Solicitar ao usuario o tamaño da casa
novo_tamano = float(input("Introduce o tamaño da casa en m² para predicir o prezo: "))
predicion = modelo.predict([[novo_tamano]])
print(f"O prezo predito para unha casa de {novo_tamano} m² é: {predicion[0]:.2f} €")
# Preguntar se o modelo acertou e se non acertou, pedir prezo real, reentrenar o modelo co novo dato para "aprender" e actualizar a gráfica
resposta = input("¿O prezo é correcto? (si/non): ").strip().lower()
if resposta == "non":
novo_prezo = float(input("Introduce o prezo correcto: "))
# Engadir os novos datos ao conxunto
tamano_casas = np.append(tamano_casas, [[novo_tamano]], axis=0)
prezos_casas = np.append(prezos_casas, novo_prezo)
# Reentrenar o modelo e imprimir novos datos de entrenamento
modelo.fit(tamano_casas, prezos_casas)
#print(f"Datos de adestramento actuais: {list(zip(tamano_casas, prezos_casas))}")
# Actualizar a gráfica con novos datos
plt.ion()
plt.scatter(tamano_casas, prezos_casas, color='blue', label='Datos reais')
plt.plot(tamano_casas, modelo.predict(tamano_casas), color='red', label='Liña de regresión')
plt.xlabel("Tamaño da casa (m²)")
plt.ylabel("Prezo da casa (€)")
plt.title("Liña de regresión actualizada")
plt.legend()
plt.grid(True)
plt.pause(0.1)
#Se a resposta do modelo é correcta, nin se actualizan os datos de entreno, nin se grafica
continuar = input("¿Queres introducir outro dato? (si/non): ").strip().lower()
if continuar != "si":
print("Programa finalizado. Ata logo!")
break
Código Python: Prezo de casa por tamaño e habitacións graficado e interactivo
#PROGRAMA REGRESIÓN MULTIVARIABLE
# Importar bibliotecas necesarias
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
# Datos de exemplo: tamaño (m²), número de habitacións e prezos (€)
datos_casas = np.array([[50, 2], [80, 3], [100, 3], [150, 4], [200, 4], [250, 5], [300, 6]])
prezos_casas = np.array([100000, 180000, 240000, 300000, 400000, 500000, 600000])
# Crear o modelo de regresión
modelo = LinearRegression()
# Adestrar o modelo cos datos iniciais
modelo.fit(datos_casas, prezos_casas)
# Función para crear ou actualizar o DataFrame
def actualizar_dataframe():
global datos
datos = pd.DataFrame({
'Tamaño (m²)': datos_casas[:, 0],
'Habitacións': datos_casas[:, 1],
'Prezo (€)': prezos_casas
})
# Función para actualizar a gráfica
def actualizar_grafica():
plt.ion()
plt.figure(figsize=(10, 6), facecolor="#fffbe6") # Fondo amarelo suave
sns.scatterplot(
x='Tamaño (m²)',
y='Prezo (€)',
size='Habitacións',
hue='Habitacións',
palette='viridis',
data=datos,
sizes=(50, 300),
legend='brief'
)
plt.title('Relación entre tamaño, habitacións e prezo das casas', fontsize=14)
plt.xlabel('Tamaño da casa (m²)', fontsize=12)
plt.ylabel('Prezo da casa (€)', fontsize=12)
plt.legend(title="Habitacións", loc='upper left', bbox_to_anchor=(1, 1))
plt.grid(True)
plt.pause(0.1)
# Actualizar o DataFrame inicial
actualizar_dataframe()
# Mostrar a gráfica inicial
actualizar_grafica()
# Bucle interactivo
while True:
# Solicitar ao usuario o tamaño e o número de habitacións
novo_tamano = float(input("Introduce o tamaño da casa en m² para predicir o prezo: "))
novo_habitacions = int(input("Introduce o número de habitacións: "))
# Realizar a predición
predicion = modelo.predict([[novo_tamano, novo_habitacions]])
print(f"O prezo predito para unha casa de {novo_tamano} m² con {novo_habitacions} habitacións é: {predicion[0]:.2f} €")
# Preguntar se o modelo acertou
resposta = input("¿O prezo é correcto? (si/non): ").strip().lower()
if resposta == "non":
# Solicitar o prezo correcto
novo_prezo = float(input("Introduce o prezo correcto: "))
# Engadir os novos datos ao conxunto
datos_casas = np.append(datos_casas, [[novo_tamano, novo_habitacions]], axis=0)
prezos_casas = np.append(prezos_casas, novo_prezo)
# Reentrenar o modelo
modelo.fit(datos_casas, prezos_casas)
# Actualizar o DataFrame e a gráfica
actualizar_dataframe()
print("Gráfica actualizada cos novos datos de adestramento")
actualizar_grafica()
# Preguntar se o usuario quere continuar
continuar = input("¿Queres introducir outro dato? (si/non): ").strip().lower()
if continuar != "si":
print("Programa finalizado. Ata logo!")
break
Rúbrica de avaliación
| Criterio | Excelente (9-10) | Bo (7-8) | Aceptable (5-6) | Mellorable (3-4) | Moi mellorable (0-2) |
|---|---|---|---|---|---|
| Implementación da iteración | Engade correctamente un bucle iterativo para introducir novos datos e actualizar o modelo. | Iteración ben implementada pero con pequenas melloras posibles. | Iteración realizada pero con problemas na repetición dos pasos. | Erro ao xestionar a iteración correctamente. | Non implementa funcionalidade iterativa. |
| Predición e verificación dos resultados | Permite ao usuario revisar e avaliar as predicións do modelo con opción de corrección. | Verificación implementada pero con pequenas dificultades. | Verificación realizada pero con problemas na actualización dos datos. | Erro ao verificar ou modificar os resultados. | Non implementa ningunha verificación dos resultados. |
| Reentrenamento dinámico do modelo | O modelo engade novos datos e mellora a súa precisión ao longo do tempo. | Reentrenamento ben feito pero con melloras posibles na súa optimización. | Modelo reentrenado pero con problemas na xestión dos datos. | Erro ao reentrenar o modelo correctamente. | Non realiza o reentrenamento dinámico. |
| Actualización gráfica en tempo real | A gráfica mostra correctamente os novos datos e a liña de regresión actualizada. | Actualización visual ben feita pero con melloras posibles. | Gráfico actualizado pero con problemas de visibilidade ou escalado. | Erro na actualización do gráfico. | Non implementa a visualización gráfica dinámica. |
| Interacción co usuario | Solicita correctamente a entrada de datos, permite continuar ou rematar e dá opción de corrección. | Interacción ben xestionada pero con pequenas melloras posibles. | Interacción realizada pero con dificultades na fluidez do proceso. | Erro na comunicación dos resultados ao usuario. | Non implementa interacción co usuario. |
| Xestión de datos en tempo real | O programa actualiza e mantén correctamente o conxunto de datos, evitando duplicidades e erros. | Xestión de datos adecuada pero con posibles melloras. | Xestión de datos funcional pero con algunhas inconsistencias. | Erro na actualización dos datos. | Non implementa a xestión de datos en tempo real. |
| Actitude ante os problemas | Busca solucións e optimiza os procesos de regresión. | Resolve os problemas con esforzo e consulta documentación. | Resolve con dificultades pero sen explorar melloras. | Resígnase ante os erros sen buscar alternativas. | Non intenta resolver os problemas ou abandona o traballo. |
| Traballo colaborativo | Comunicación eficaz e traballo equilibrado en parella. | Traballo en equipo con pequenas dificultades. | Interacción mínima, traballo case independente. | Pouca colaboración, realízase gran parte do traballo de forma individual. | Non colabora coa parella nin contribúe ao traballo conxunto. |
Tarefa 2 : Urbano frente a rural
- Duración:
- 30 min
- Agrupamento:
- 2
Neste exercicio, debes ampliar o modelo de regresión do Paso 2 da actividade de aprendizaxe incorporando unha nova variable: zona (urbana ou rural). A zona urbana terá prezos máis elevados incluso para casas máis pequenas, e a zona rural terá prezos máis baixos.
Tarefa:
- Engadir a variable zona ao conxunto de datos, onde Urbana = 1 Rural = 0
- Modificar o programa para que teña en conta esta nova variable ao calcular os prezos.
- Crear unha gráfica axeitada para visualizar como afecta esta variable zona ao prezo, xunto co tamaño e o número de habitacións.
Pistas:
- Engade a nova variable como unha columna ao conxunto de datos datos_casas( como xa fixeches coas habitacións).
- Modifica o modelo de regresión para incluír esta terceira variable.
- Actualiza o DataFrame para incluir a nova variable zona.
- Usa unha gráfica 3D ou unha gráfica con cores e tamaños diferenciados para amosar a relación entre zona, prezo, tamaño e número de habitacións.
Explicación da solución:
Engadir a nova variable "zona":
- A variable "zona" foi engadida como unha terceira columna na matriz datos_casas, onde 1 representa unha zona urbana e 0 representa unha zona rural.
- Os prezos foron axustados para que as zonas urbanas sexan máis caras, incluso para casas máis pequenas.
Actualización do modelo:
- O modelo foi adestrado con tres variables: tamaño, número de habitacións e zona.
- Predición: O modelo pode predicir agora o prezo dunha casa tendo en conta se está nunha zona urbana ou rural.
Visualización:
- A gráfica foi modificada para que a cor represente a zona (usando unha paleta de cores coolwarm que diferencia entre urbana e rural).
- Os tamaños dos puntos indican o número de habitacións.
- Así podes observar claramente como a zona e outras variables afectan o prezo.
Interpretación do modelo:Os coeficientes do modelo (modelo.coef_) mostran o impacto de cada variable (tamaño, habitacións, zona) no prezo. Un valor máis alto para a variable "zona" indica que ser urbana incrementa significativamente o prezo.
Gráfica adecuada:A gráfica utilizada (dispersión de puntos con cor para a variable "zona" e tamaño para as "habitacións") é a máis axeitada para visualizar tres variables relacionadas co prezo. En combinación, ofrece unha visión clara de como estas variables afectan o prezo da casa.
Código Python: Prezo dunha casa según tamaño, habitacións e zona
# Importar bibliotecas necesarias
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
# Datos de exemplo: tamaño (m²), número de habitacións, zona (1 = urbana, 0 = rural) e prezos (€)
# A zona agora está incluída como unha terceira variable
datos_casas = np.array([
[50, 2, 1], # Casa pequena, urbana
[80, 3, 0], # Casa pequena, rural
[100, 3, 1], # Casa mediana, urbana
[150, 4, 0], # Casa mediana, rural
[200, 4, 0], # Casa grande, rural
[250, 5, 1], # Casa grande, urbana
[300, 6, 0] # Casa moi grande, rural
])
prezos_casas = np.array([150000, 160000, 270000, 280000, 350000, 550000, 400000]) # Prezos axustados a zona
# Crear o modelo de regresión
modelo = LinearRegression()
# Adestrar o modelo cos datos de entrada (tamano, habitacións, zona) e saída (prezos)
modelo.fit(datos_casas, prezos_casas)
# Predicir o prezo dunha casa de 120 m², con 3 habitacións, nunha zona urbana (zona = 1)
datos_prediccion = np.array([[120, 3, 1]]) # Tamaño, número de habitacións e zona
prezo_predito = modelo.predict(datos_prediccion)
# Mostrar o resultado da predición
print(f"O prezo dunha casa de 120 m², 3 habitacións e zona urbana será: {prezo_predito[0]:.2f} €")
# Crear un DataFrame para visualizar os datos
datos = pd.DataFrame({
'Tamaño (m²)': datos_casas[:, 0],
'Habitacións': datos_casas[:, 1],
'Zona': datos_casas[:, 2],
'Prezo (€)': prezos_casas
})
# Visualización utilizando Seaborn
# As cores representan a zona (0 = rural, 1 = urbana)
sns.set(style="whitegrid")
plt.figure(figsize=(12, 8))
ax = sns.scatterplot(
x='Tamaño (m²)',
y='Prezo (€)',
size='Habitacións',
hue='Zona', # Usar a variable "Zona" para colorear
palette='coolwarm',
data=datos,
sizes=(50, 300),
legend='full'
)
plt.title('Impacto do tamaño, habitacións e zona no prezo das casas', fontsize=16)
plt.xlabel('Tamaño da casa (m²)', fontsize=12)
plt.ylabel('Prezo da casa (€)', fontsize=12)
plt.legend(title="Zona (0=Rural, 1=Urbana)", loc='upper left')
plt.grid(True)
plt.show()
# Mostrar coeficientes do modelo para interpretar as variables
print("Coeficientes do modelo (Tamaño, Habitacións, Zona):", modelo.coef_)
print("Intersección (bias):", modelo.intercept_)
Rúbrica de avaliación
| Criterio | Excelente (9-10) | Bo (7-8) | Aceptable (5-6) | Mellorable (3-4) | Moi mellorable (0-2) |
|---|---|---|---|---|---|
| Definición correcta dos datos iniciais | Os datos de tamaño, habitacións e zona están correctamente definidos. | Os datos iniciais son axeitados pero con pequenas inconsistencias. | Datos definidos pero con valores pouco representativos. | Erro na selección dos datos. | Non define os datos iniciais correctamente. |
| Implementación da variable "zona" | Inclúe correctamente a variable "zona" e adapta os prezos en función dela. | Variable incluída pero con pequenas dificultades na interpretación. | Variable engadida pero sen impacto claro na regresión. | Erro na asignación dos valores da variable "zona". | Non implementa a variable "zona". |
| Modificación do modelo de regresión | Configura correctamente o modelo para incluír tamaño, habitacións e zona. | Modelo configurado pero con pequenas melloras posibles. | Modelo configurado pero con dificultades na xestión da terceira variable. | Erro na configuración do modelo. | Non realiza a modificación do modelo. |
| Predición de prezos baseada nas tres variables | O modelo predice correctamente prezos considerando as tres variables. | Predición realizada pero con pequenas imprecisións na interpretación. | Predición feita pero con problemas ocasionais. | Erro na clasificación dos datos. | Non realiza a predición dos prezos. |
| Visualización dos datos | A gráfica representa correctamente tamaño, habitacións e zona. | Gráfica ben feita pero con melloras posibles na diferenciación. | Gráfica realizada pero con dificultade na lectura dos datos. | Erro na visualización ou comprensión da gráfica. | Non realiza a visualización dos datos. |
| Uso correcto de cores e tamaños na gráfica | Representa a variable "zona" con cores adecuadas e habitacións con tamaños diferenciados. | Cores ben utilizadas pero con pequenas melloras posibles. | Cores diferenciadas pero con pouca claridade na interpretación. | Erro na asignación de cores ou tamaños. | Non implementa diferenciación visual na gráfica. |
| Interpretación dos coeficientes do modelo | Explica correctamente o impacto de cada variable no prezo da casa. | Interpretación axeitada pero con melloras posibles na análise. | Coeficientes analizados pero con dificultades na interpretación dos valores. | Erro na análise dos coeficientes do modelo. | Non realiza a interpretación dos coeficientes. |
| Actitude ante os problemas | Busca solucións e optimiza os procesos de regresión. | Resolve os problemas con esforzo e consulta documentación. | Resolve con dificultades pero sen explorar melloras. | Resígnase ante os erros sen buscar alternativas. | Non intenta resolver os problemas ou abandona o traballo. |
| Traballo colaborativo | Comunicación eficaz e traballo equilibrado en parella. | Traballo en equipo con pequenas dificultades. | Interacción mínima, traballo case independente. | Pouca colaboración, realízase gran parte do traballo de forma individual. | Non colabora coa parella nin contribúe ao traballo conxunto. |
Licenciado baixo a Licenza Creative Commons Atribución Compartir igual 4.0