Treinar os Modelos e Calcular o Erro Quadrático Médio Esperado
Vamos iterar sobre os estimadores, treiná-los nos múltiplos conjuntos de treinamento e calcular o erro quadrático médio esperado, decompondo-o em termos de viés, variância e ruído. Também plotaremos as previsões dos modelos e a decomposição viés-variância.
plt.figure(figsize=(10, 8))
## Iterar sobre os estimadores para comparação
for n, (name, estimator) in enumerate(estimators):
## Calcular as previsões
y_predict = np.zeros((n_test, n_repeat))
for i in range(n_repeat):
estimator.fit(X_train[i], y_train[i])
y_predict[:, i] = estimator.predict(X_test)
## Decomposição do erro quadrático médio em viés^2 + Variância + Ruído
y_error = np.zeros(n_test)
for i in range(n_repeat):
for j in range(n_repeat):
y_error += (y_test[:, j] - y_predict[:, i]) ** 2
y_error /= n_repeat * n_repeat
y_noise = np.var(y_test, axis=1)
y_bias = (f(X_test) - np.mean(y_predict, axis=1)) ** 2
y_var = np.var(y_predict, axis=1)
print(
"{0}: {1:.4f} (erro) = {2:.4f} (viés^2) "
" + {3:.4f} (var) + {4:.4f} (ruído)".format(
name, np.mean(y_error), np.mean(y_bias), np.mean(y_var), np.mean(y_noise)
)
)
## Plotar figuras
plt.subplot(2, n_estimators, n + 1)
plt.plot(X_test, f(X_test), "b", label="$f(x)$")
plt.plot(X_train[0], y_train[0], ".b", label="LS ~ $y = f(x)+ruído$")
for i in range(n_repeat):
if i == 0:
plt.plot(X_test, y_predict[:, i], "r", label=r"$\^y(x)$")
else:
plt.plot(X_test, y_predict[:, i], "r", alpha=0.05)
plt.plot(X_test, np.mean(y_predict, axis=1), "c", label=r"$\mathbb{E}_{LS} \^y(x)$")
plt.xlim([-5, 5])
plt.title(name)
if n == n_estimators - 1:
plt.legend(loc=(1.1, 0.5))
plt.subplot(2, n_estimators, n_estimators + n + 1)
plt.plot(X_test, y_error, "r", label="$erro(x)$")
plt.plot(X_test, y_bias, "b", label="$viés^2(x)$"),
plt.plot(X_test, y_var, "g", label="$variância(x)$"),
plt.plot(X_test, y_noise, "c", label="$ruído(x)$")
plt.xlim([-5, 5])
plt.ylim([0, 0.1])
if n == n_estimators - 1:
plt.legend(loc=(1.1, 0.5))
plt.subplots_adjust(right=0.75)
plt.show()