|
Download README.md from natisol87/PyTorch-casas-SA: direct link, hf CLI and curl.
- Browser
- Download file 4.26 kB
-
https://huggingface.co/natisol87/PyTorch-casas-SA/resolve/main/README.md
- Command line
-
hf download hf://natisol87/PyTorch-casas-SA/README.md
-
curl -L -o README.md https://huggingface.co/natisol87/PyTorch-casas-SA/resolve/main/README.md
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. | |