In [ ]:
#Configuracion para recargar módulos y librerías cada vez
%reload_ext autoreload
%autoreload 2
%matplotlib inline
from mat281_code.lab import *
from IPython.core.display import HTML
HTML(open("style/mat281.css", "r").read())
alumno_1 = ("Sebastian Flores", "2004001-7")
alumno_2 = ("Maria Jose Vargas", "2004007-8")
HTML(greetings(alumno_1, alumno_2))
Los datos Abalone Dataset corresponden a medidas físicas de abulones u orejas marinas (abalones), una especie de caracoles marinos comestibles. Este set de datos fue descrito por Sam Waugh para su tesis de doctorado, en la cual utilizó los datos para ilustrar el comportamiento de algoritmos de clasificación. Desde entonces, se ha utilizado para verificar algoritmos de clasificación y regresión.
La base de datos contiene mediciones a 4177 abalones, donde las mediciones posibles son sexo ($S$), largo ($L$), diametro $D$, altura $H$, peso entero $W_1$, peso sin concha $W_2$, peso de visceras $W_3$, peso de concha $W_4$ y el número de anillos $N$.
Buscaremos predecir el número de anillos, utilizando las otras variables.
Los modelos propuestos son los siguientes:
Si $S=male$: $$ \log(A) = \theta_0^M + \theta_1^M W_2 + \theta_2^M W_4 + \theta_3^M \log( L D H ) $$ Si $S=female$ $$ \log(A) = \theta_0^F + \theta_1^F W_2 + \theta_2^F W_4 + \theta_3^F \log( L D H ) $$ Si $S=indefined$ $$ \log(A) = \theta_0^I + \theta_1^I W_2 + \theta_2^I W_4 + \theta_3^I \log( L D H ) $$
Descargue el archivo a analizar desde el siguiente link: http://archive.ics.uci.edu/ml/machine-learning-databases/abalone/abalone.data
Guarde el archivo en la carpeta Lab03/data/ con el nombre abalone.data.txt
In [ ]:
%%bash
head data/abalone.data.txt
In [ ]:
import numpy as np
# Cargando los datos
data = []
fh = open("data/abalone.data.txt","r")
# Estructura de datos:
# 'sex','length','diameter','height','weight.whole','weight.shucked','weight.viscera','weight.shell','rings'
# Ejemplo de linea
conversion_sexo = {"M":+1, "I":0, "F":-1}
for line in fh:
abalone = line.split(",")
abalone[0] = conversion_sexo[abalone[0]]
data.append([float(x) for x in abalone])
fh.close()
# Convertir lista a array
data = np.array(data)
# Limpiando datos erroneos (todos los valores excepto sexo deben ser estricamente positivos)
mask = np.all(data[:,1:]>0, axis=1)
data = data[mask]
# Imprimir datos (opcional)
#print data[:10]
In [ ]:
from matplotlib import pyplot as plt
def plot(data, i, j):
label = ['Sexo',
'Largo',
'Diametro',
'Altura',
'Peso Entero',
'Peso Desconchado',
'Peso Viscera',
'Peso Concha',
'Numero Anillos']
M_mask = data[:,0] == +1
I_mask = data[:,0] == 0
F_mask = data[:,0] == -1
plt.figure(figsize=(16,8))
plt.plot(data[:,i][M_mask], data[:,j][M_mask], "og", label="M")
plt.plot(data[:,i][F_mask], data[:,j][F_mask], "sr", label="F")
plt.plot(data[:,i][I_mask], data[:,j][I_mask], "<b", label="I")
plt.xlabel(label[i])
plt.ylabel(label[j])
plt.legend()
plt.show()
In [ ]:
"""
Sandbox: Cambie los parámetros para obtener distintos gráficos
Indices:
0:'Sexo',
1:'Largo',
2:'Diametro',
3:'Altura',
4:'Peso Entero',
5:'Peso Desconchado',
6:'Peso Viscera',
7:'Peso Concha',
8:'Numero Anillos'
"""
plot(data, 1, 8)
In [ ]:
# 'sex','length','diameter','height','weight.whole','weight.shucked','weight.viscera','weight.shell','rings'
# Entrenando el modelo A
def train_model_A(data):
y = np.log(data[:,-1])
X = data.copy()
X[:,0] = 1.0
X[:,1:4] = np.log(X[:,1:4])
coeffs = np.linalg.lstsq(X, y)[0]
return coeffs
# Testeando el modelo A
def test_model_A(data, coeffs):
X = data.copy()
X[:,0] = 1.0
X[:,1:4] = np.log(X[:,1:4])
ln_anillos = np.dot(X, coeffs)
return np.exp(ln_anillos)
# Obtener valores y prediccion
coeffs_A = train_model_A(data)
y_pred = test_model_A(data, coeffs_A)
# Mostrar graficamente
y_data = data[:,-1]
plt.figure(figsize=(16,8))
plt.plot(y_data, y_pred, "x")
plt.plot(y_data, y_data, "k-")
plt.show()
In [ ]:
# 'sex','length','diameter','height','weight.whole','weight.shucked','weight.viscera','weight.shell','rings'
# Entrenando el modelo B
def train_model_B(data):
y = np.log(data[:,-1])
X = np.ones([data.shape[0],6])
X[:,0] = 1.0
X[:,1:5] = data[:,4:8]
X[:,5] = np.log(data[:,1]*data[:,2]*data[:,3])
coeffs = np.linalg.lstsq(X, y)[0]
return coeffs
# Testeando el modelo B
def test_model_B(data, coeffs):
X = np.ones([data.shape[0],6])
X[:,0] = 1.0
X[:,1:5] = data[:,4:8]
X[:,5] = np.log(data[:,1]*data[:,2]*data[:,3])
ln_anillos = np.dot(X, coeffs)
return np.round(np.exp(ln_anillos))
# Obtener valores y prediccion
coeffs_B = train_model_B(data)
y_pred = test_model_B(data, coeffs_B)
# Mostrar graficamente
plt.figure(figsize=(16,8))
plt.plot(y_data, y_pred, "x")
plt.plot(y_data, y_data, "k-")
plt.show()
Si $S=male$: $$ \log(A) = \theta_0^M + \theta_1^M W_2 + \theta_2^M W_4 + \theta_3^M \log( L D H ) $$ Si $S=female$ $$ \log(A) = \theta_0^F + \theta_1^F W_2 + \theta_2^F W_4 + \theta_3^F \log( L D H ) $$ Si $S=indefined$ $$ \log(A) = \theta_0^I + \theta_1^I W_2 + \theta_2^I W_4 + \theta_3^I \log( L D H ) $$
In [ ]:
# 'sex','length','diameter','height','weight.whole','weight.shucked','weight.viscera','weight.shell','rings'
# Entrenando el modelo C
def train_model_C(data):
mask_I = data[:,0] == 0
mask_M = data[:,0] == +1
mask_F = data[:,0] == -1
y = np.log(data[:,-1])
X = np.ones([data.shape[0], 4])
X[:,0] = 1.0
X[:,1] = data[:,5]
X[:,2] = data[:,7]
X[:,3] = np.log(data[:,1]*data[:,2]*data[:,3])
coeffs_I = np.linalg.lstsq(X[mask_I], y[mask_I])[0]
coeffs_M = np.linalg.lstsq(X[mask_M], y[mask_M])[0]
coeffs_F = np.linalg.lstsq(X[mask_F], y[mask_F])[0]
return (coeffs_I, coeffs_M, coeffs_F)
# Testeando el modelo C
def test_model_C(data, coeffs):
mask_I = data[:,0] == 0
mask_M = data[:,0] == +1
mask_F = data[:,0] == -1
y = np.log(data[:,-1])
X = np.ones([data.shape[0], 4])
X[:,0] = 1.0
X[:,1] = data[:,5]
X[:,2] = data[:,7]
X[:,3] = np.log(data[:,1]*data[:,2]*data[:,3])
# Fill up the solution
ln_anillos = np.zeros(data[:,0].shape)
ln_anillos[mask_I] = np.dot(X[mask_I], coeffs[0])
ln_anillos[mask_M] = np.dot(X[mask_M], coeffs[1])
ln_anillos[mask_F] = np.dot(X[mask_F], coeffs[-1])
return np.round(np.exp(ln_anillos))
# Obtener valores y prediccion
coeffs_C = train_model_C(data)
y_pred = test_model_C(data, coeffs_C)
# Mostrar graficamente
plt.figure(figsize=(16,8))
plt.plot(y_data, y_pred, "x")
plt.plot(y_data, y_data, "k-")
plt.show()
In [ ]:
# Realice aqui su grafico
plt.figure(figsize=(16,8))
plt.plot()
plt.show()
Utilice Holdout Set o Cross Validation para obtener una estimación razonable del error predictivo de los modelos A, B y C. Justifique la decisión realizada. No se entrega la implementación numérica de los métodos, pero puede basarse en los códigos provistos en clases:
In [ ]:
# Implemente aquí su algoritmo para obtener el error predictivo de los métodos
# FIX ME
# FIX ME
# FIX ME
# FIX ME
# FIX ME