PyTorch-casas-SA / README.md
natisol87's picture
Upload 8 files
d2e67f5 verified
|
Raw History Blame Contribute Delete
4.26 kB
---
language:
- es
library_name: pytorch
pipeline_tag: tabular-regression
tags:
- machine-learning
- regression
- linear-regression
- safetensors
- educational-example
license: mit
---
# Regresión lineal con PyTorch: precio de una casa
## Descripción del modelo
Este modelo es un ejemplo pedagógico del Seminario de Actualización (IFTS N.º 18). Muestra cómo se entrena una regresión lineal con el ciclo explícito de PyTorch y cómo se publican los pesos en formato **safetensors**.
Predice el precio de una casa, en miles de US$, a partir de su superficie y de si tiene balcón y ascensor. Resuelve el mismo problema que el ejemplo de scikit-learn.
## Objetivo
Predecir una variable numérica continua: el precio estimado de una casa.
## Datos de entrenamiento
- **Dataset:** sintético, generado en `train.py`. Es el mismo de la Clase 10, con la misma semilla, y no son casas reales.
- **Cantidad de registros:** 200. Se usan 160 para entrenar y 40 para evaluar.
- **Variables de entrada (X):** `m2` (de 35 a 120), `balcon` (0 o 1), `ascensor` (0 o 1).
- **Variable objetivo (y):** `precio`, en miles de US$.
- **Preprocesamiento:** las entradas se normalizan restando la media y dividiendo por el desvío, ambos calculados con los datos de entrenamiento. Esos valores están en `config.json`.
## Entrenamiento
- **Tipo de aprendizaje:** supervisado.
- **Problema:** regresión.
- **Arquitectura:** una capa `torch.nn.Linear(3, 1)`, es decir, tres pesos y un bias. Está definida en `modelo.py`.
- **Función de pérdida:** error cuadrático medio (`MSELoss`).
- **Optimizador:** descenso por gradiente (`SGD`), con tasa de aprendizaje 0,1.
- **Épocas:** 500. La pérdida se estabiliza antes de la época 100.
- **Biblioteca:** PyTorch.
**Parámetros aprendidos.** Son los que guarda `model.safetensors`:
| Parámetro | Valor |
|---|---|
| `lineal.weight` | [35,157 · 4,351 · 5,992] |
| `lineal.bias` | 147,769 |
**Por qué los pesos no se parecen a los de scikit-learn.** Están en la escala de las entradas **normalizadas**. Si se divide cada peso por el desvío de su variable, se vuelve a la escala original. Por ejemplo, 35,157 / 23,398 ≈ 1,503 para `m2`, que es el mismo peso que encontró scikit-learn.
## Evaluación
Se evaluó sobre 40 casas que el modelo no vio durante el entrenamiento.
| Métrica | Resultado |
|---|---|
| MAE | 3,08 miles de US$ |
| R² | 0,989 |
## Archivos
| Archivo | Qué es |
|---|---|
| `model.safetensors` | **solo los pesos** (`state_dict`) |
| `config.json` | las entradas, la salida y la normalización que hay que aplicar antes de predecir |
| `modelo.py` | la clase del modelo: PyTorch no la guarda en el archivo de pesos |
| `train.py` | el código que lo entrenó |
| `predict.py` | cómo cargarlo y usarlo |
| `requirements.txt` | las dependencias |
| `README.md` | esta Model Card |
## Cómo utilizar el modelo
```python
import json
import numpy as np
import torch
from safetensors.torch import load_file
from modelo import RegresionLineal
config = json.load(open("config.json"))
media = np.array(config["normalizacion"]["media"], dtype="float32")
desvio = np.array(config["normalizacion"]["desvio"], dtype="float32")
modelo = RegresionLineal(n_entradas=3) # 1. el modelo vacío
modelo.load_state_dict(load_file("model.safetensors")) # 2. se le cargan los pesos
modelo.eval()
casa = np.array([[80, 1, 0]], dtype="float32")
with torch.no_grad():
print(modelo(torch.tensor((casa - media) / desvio))) # tensor([[148.5]])
```
## Limitaciones
- Tiene fines exclusivamente educativos. Los datos son sintéticos y no representan precios reales.
- Solo conoce casas de 35 a 120 m².
- **Si se olvida la normalización, las predicciones dan cualquier cosa.** Los pesos solos no alcanzan: hace falta `config.json`.
- Para cargar los pesos hace falta la misma arquitectura (`modelo.py`). Si cambia la clase, `load_state_dict` falla.
- A diferencia de pickle o joblib, **safetensors no ejecuta código al cargarse**: solo contiene números.
## Autoría
Modelo desarrollado con fines educativos para el IFTS N.º 18. Docente: Cynthia M. Villagra.