¿Cómo ayuda la siguiente expresión a controlar un modelo que no se ajusta demasiado (y al mismo tiempo mantenerlo simple)?

En la regresión lineal sin regularización, generalmente elegimos los parámetros del modelo [math] b_j [/ math] para minimizar la suma de los errores al cuadrado:

[matemáticas] \ min_ {b_0, b_1, b_2, \ ldots} \ sum_ {i = 0} ^ n \ left (y_i – \ left [b_0 + b_1x_ {i, 1} + b_2x_ {i, 2} + \ ldots \ right] \ right) ^ 2 [/ math]

¿Qué sucederá si intentamos ajustar un modelo cuando los valores de y son ruidosos y tenemos un número limitado de puntos de datos para entrenar? Resulta que generalmente obtenemos estimaciones de los parámetros de nuestro modelo que son demasiado grandes en magnitud. (Ha encontrado un fenómeno relacionado si alguna vez ajusta un polinomio de alto grado a datos lineales ruidosos: la curva de mejor ajuste tiende a tener coeficientes grandes que permiten que la función se “balancee” rápidamente hacia arriba y hacia abajo para pasar a través de todos los datos puntos.)

Para ver esto en acción, podemos generar algunos datos de muestra en MATLAB / Octave. Generaremos 10 puntos de datos, cada uno con nueve valores de entrada [matemática] x_ {i, 1} [/ matemática] a [matemática] x_ {i, 9} [/ matemática]. Notarás que también rellené la matriz x con unos: esto nos permitirá ajustar fácilmente la intersección en y, [math] b_0 [/ math].

rng (80085, ‘tornado’);
x = [unos (10, 1), randn (10, 9)];

También generaremos algunos parámetros aleatorios del modelo verdadero y calcularemos los valores de y, agregando algo de ruido. Observe que los parámetros del modelo verdadero están normalmente distribuidos.

b_actual = randn (10,1);
y = x * b_actual + (randn (10,1));

La regresión lineal sin regularización estima el b_j siguiente manera:

b_pred = inv (x ‘* x) * (x’) * y;
disp (sprintf (‘SSE de predicciones b_j sin regularización:% 0.3f’, sum ((b_pred-b_actual). ^ 2))); % 11.902

La regularización establece una penalización para las estimaciones de parámetros del modelo que están lejos de cero:

[matemáticas] \ min_ {b_0, b_1, b_2, \ ldots} \ sum_ {i = 0} ^ n \ left (y_i – \ left [b_0 + b_1x_ {i, 1} + b_2x_ {i, 2} + \ ldots \ right] \ right) ^ 2 + \ underbrace {C \ left (b_0 ^ 2 + b_1 ^ 2 + \ ldots \ right)} _ {\ textrm {penaliza valores de parámetros grandes}} [/ math]

Esto es apropiado si los parámetros del modelo verdadero se distribuyen normalmente, como es el caso en nuestro ejemplo. El valor C determina la importancia relativa de la penalización y se puede elegir mediante prueba y error. (Si es demasiado grande, solo obtendrá valores muy pequeños para todas sus estimaciones de parámetros. Si es demasiado pequeño, efectivamente no está realizando la regularización).

¿Cuánto mejor podemos hacer en nuestro ejemplo si utilizamos la regularización?

C = 1;
b_reg_pred = inv (x ‘* x + C * eye (10)) * (x’) * y;
disp (sprintf (‘SSE de predicciones b_j con regularización:% 0.3f’, …
sum ((b_reg_pred-b_actual). ^ 2))); % 3.436

Entonces, la regularización ha dado una marcada mejora en este caso. Puede jugar con diferentes tamaños de juego de entrenamiento y valores de C para tener una idea de cuándo la regularización se vuelve innecesaria y la importancia de elegir C correctamente.