07.02 - DESIGN ML ALGORITHMS¶
Cómo se diseña un algoritmo ML¶
Elegir de qué parámetros depende una predicción → se define cómo es un modelo.
Definir una función que mida el error de la predicción.
Determinar qué valores de los parámetros minimizan el error de predicción.
Ejemplo¶
Los Trilotrópicos son insectos imaginarios que viven en las latitudes tropicales. Conocer su densidad de escamas es muy importante para poder saber qué insecticida aplicar. Pero es muy costoso contar las escamas.
Creemos que existe una relación entre la longitud y la densidad de escamas y queremos un modelo que prediga la densidad a partir de la longitud.
Esto es una tarea de regresión, ya que la predicción ∈R
Tenemos datos anotados (alguien contó las escamas de unos cuantos trilotrópicos) → estamos ante una tarea de aprendizaje supervisado
1. Elegimos la forma del modelo¶
Entrada
x(i): longitud del trilotrópico i
Salida esperada
y(i): densidad de escamas del trilotrópico i
**Predicción ** → decidimos que nuestro modelo tiene la siguiente forma
ˆy(i)=θ0+θ1x(i)
La siguiente es una posible combinación de θ0 y θ1 seleccionada aleatoriamente. Ejecútalo varias veces para entender el error.
## KEEPOUTPUT
t0 = np.random.random()*5+10
t1 = np.random.random()*4-3
p = d.iloc[np.random.randint(len(d))]
long = p.longitud
dens = p.densidad_escamas
print ("RANDOM t0 = %.3f, t1 = %.3f"%(t0,t1))
print ("\nlong = %.3f\ndens = %.3f"%(long, dens))
print ("\npred = %.3f (WITH RANDOM t0 t1)"%linear_prediction([t0,t1], long) )
## KEEPOUTPUT
def plot_model(t, prediction):
xr = np.linspace(np.min(d.longitud), np.max(d.longitud), 100)
plt.scatter(d.longitud, d.densidad_escamas, s=40, alpha=.2, color="blue", label="")
plt.plot(xr,prediction(t,xr), lw=2, color="black")
plt.title(" ".join([r"$\theta_%d$=%.2f"%(i, t[i]) for i in range(len(t))]));
p = d.iloc[np.random.randint(len(d))]
pred = prediction(t, p.longitud)
plt.plot([p.longitud, p.longitud], [p.densidad_escamas, pred], ls="--", color="gray", label=u"error de predicción")
plt.scatter(p.longitud, p.densidad_escamas, s=70, alpha=.5, color="red", label="random trilobite")
plt.scatter(p.longitud, pred, s=70, alpha=1., color="black", label=u"predicción")
plt.legend(loc='center left', bbox_to_anchor=(1, 0.5))
plt.xlabel(d.columns[0])
plt.ylabel(d.columns[1]);
plot_model([t0,t1], linear_prediction)

2. Definimos una medida de error¶
Para un dato cualquiera (i) $err(i)=(ˆy(i)−y(i))2=(θ0+θ1x(i)−y(i))2$
Para todo el dataset
si asumimos que
¯θ=[θ0,θ1]
x(i)=[1,x(i)]
entonces podemos escribir de manera más compacta la expresión anterior:
3. Obtenemos los parámetros que minimizan el error de predicción¶
observa cómo usamos un algoritmo genérico de optimización
fíjate que son los mismos valores que la regresión lineal clásica
## KEEPOUTPUT
from sklearn.linear_model import LinearRegression
lr = LinearRegression()
lr.fit(d.longitud.values.reshape(-1,1), d.densidad_escamas)
t0, t1 = lr.intercept_, lr.coef_
print (t0, t1)
plot_model([t0,t1], linear_prediction)
print ("error total %.2f"%(J([t0, t1], d.longitud, d.densidad_escamas, linear_prediction)))
WARN!! Black box optimization can only be used for VERY SIMPLE models¶
in ML normally you have to:
compute the partial derivatives of the parameters of the cost function
use optimizers specially designed for ML
Otra forma de modelo¶
esta vez con tres parámetros y un término cuadrático
fun: 0.5533076730536329
hess_inv: array([[ 50.71906017, -23.19602691, 2.42715945],
[-23.19602691, 11.05458208, -1.18794883],
[ 2.42715945, -1.18794883, 0.1304395 ]])
jac: array([-2.98023224e-08, 2.23517418e-08, 2.23517418e-07])
message: 'Optimization terminated successfully.'
nfev: 80
nit: 14
njev: 16
status: 0
success: True
x: array([26.75881715, -7.61054361, 0.75701901])
observa como indirectamente hacemos lo mismo con la regresión lineal de sklearn
añadiendo explícitamente una columna con la longitud al cuadrado