#!/usr/bin/python3 # -*- coding: utf-8 -*- """ Perceptrón para estimar precio de viviendas. Una capa oculta con 5 procesadores con activación tangente hiperbólica. """ import httpimport with httpimport.remote_repo('https://personales.unican.es/crespoj/redes/redespytorch.zip'): import lectura import lecturaurl import preproceso import particion import tipored import ajuste import registro import random import analizar from torch.nn.utils import prune import torch import error from torch import nn import activaciones import inicializacion import math import copy from matplotlib import pyplot import statistics #Cargamos los datos, todos datos=lecturaurl.leelistas('practica1/casas.trn.txt') numentradas=len(datos[0])-1 varnoms=['criminalidad','residencial','industrial','rio','polucion','habitaciones','casas-viejas','distancia-trabajo', 'autovias','impuestos','ratio-aula','negr@s','pobreza','precio'] #Histogramas frel,vals=lectura.grafica(varnoms,datos,False) #Preproceso a distribución normal media 0 varianza 1 datot=preproceso.rango1(datos) # mínimo a 0..., máximo a 1... """O puede ser mediavar(media nula y varianza unidad), medianavar :llevarlo a mediana 0, intercuartil 1; robusto si tienes abundantes valores extremos unifor: ecualizar """ #Partición para bootstrap #gener,tep,tsp=particion.generazarremuest(datot,0.85) # Fracción total de ajuste y validación #Partición para validación cruzada #gener=iter(particion.genervalcruz(datot,numpruebas)) # Cuantas rondas de validación cruzada #Crear una red red=tipored.perceptron(numentradas,[5],1,nn.Tanh,nn.Identity) #).cuda(device) #Coger una red #red=registro.cogered("granreddelnorte.torch") print(red) #Ajuste print('\nAjuste') errorps=[] erroras=[] diferror=[] errmin=1000 for _ in range(3): # ¿Cuántos ajustes? (validación cruzada, ...) #Si cogemos una partición enteramente al azar sin reemplazo tea,tsa,tev,tsv,tep,tsp=particion.azaryestrat(datot,0.5,0.7,0.15) #Bootstrap #teav,tsav=next(iter(gener)) #Validación cruzada #tep,tsp,teav,tsav=next(gener) #Bootstrap o validación cruzada #tea,tsa,tev,tsv,_,_=particion.torchazar(teav.detach(),tsav.detach(),0.8,0.2) # Del total ajuste+validación, cuánto a cada cosa inicializacion.reinicia(red,inicializacion.inibase) # O 'inio', 'inixn', 'inixu' err,red,erraj=ajuste.ajustar(red,tea.requires_grad_(),tsa,tev,tsv,tep,tsp,kaj=0.01,error=nn.MSELoss(), # o L1Loss (error medio en valor absoluto) # SmoothL1Loss cuadrático en errores bajos y lineal en altos # error.ErrorPropio('satura') logaritmo del error medio cuadrático # error.ErorPropio('maximo') máximo valor absoluto de error # error.ErorPropio('medabs') mediana de los valores absolutos de los errores # error.ErorPropio('d2') verosimilitud de distribución gamma algo=torch.optim.LBFGS, # SGD, Rprop, RMSprop, Adam, Adagrad', ASGD control='paso', # 'ajuste' 'validacion' numiter=100,funpaso=lambda paso: 0.99 if paso<20 else 0.95, # Si ajuste o validación, factor multiplicativo: 0.9 muestraerror=math.sqrt) # Si es el MSE, para que te lo presente en unidades de objetivo errorps.append(err.item()) erroras.append(erraj) diferror.append(err.item()-erraj) if err.item()1: pyplot.hist(errorps) pyplot.show() #Si quieres un ajuste final limitado por valor de error, sin validación # finaj=statistics.mean(erroras) # o median o lo que quieras # inicializacion.reinicia(inicializacion.inibase) # U otro # tea,tsa=lectura.septorch(datot) # red,erraj=ajuste.ajustar(red,tea.requires_grad_(),tsa,None,None,None,None,kaj=0.01,error=nn.L1Loss,algo=torch.optim.SGD,control='ajuste', # numiter=100,funpaso=0.95,muestraerror=math.abs,limerr=finaj) # print('Estimación de error de generalizacion',erraj+statistics.mean(diferror)) #Si guardas la red #registro.guardared(red,"supered.torch") tepor=registro.residuos(tep,tsp,red,True) # O False si no quieres los gráficos input("Análisis globales") #Analizar la red analizar.analisis(red,tep,tsp,False) #Para ver casos concretos #registro.sacarejemplos(tep,tsp,tepor,varnoms,frel,vals,red)