Subajuste e Sobreajuste

Beginner

This tutorial is from open-source community. Access the source code

Introdução

Este laboratório demonstra os problemas de subajuste e superajuste no aprendizado de máquina e como podemos usar regressão linear com recursos polinomiais para aproximar funções não lineares. Usaremos o scikit-learn para gerar dados, ajustar modelos e avaliar o desempenho do modelo.

Dicas da Máquina Virtual

Após o término da inicialização da máquina virtual, clique no canto superior esquerdo para mudar para a aba Notebook para acessar o Jupyter Notebook para praticar.

Às vezes, pode ser necessário aguardar alguns segundos para que o Jupyter Notebook termine de carregar. A validação das operações não pode ser automatizada devido a limitações no Jupyter Notebook.

Se você enfrentar problemas durante o aprendizado, sinta-se à vontade para perguntar ao Labby. Forneça feedback após a sessão e resolveremos prontamente o problema para você.

Importar Bibliotecas

Primeiro, importaremos as bibliotecas necessárias para este laboratório.

import numpy as np
import matplotlib.pyplot as plt
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import cross_val_score

Gerar Dados

Vamos gerar 30 amostras de uma função cosseno, com algum ruído aleatório adicionado às amostras.

def true_fun(X):
    return np.cos(1.5 * np.pi * X)

np.random.seed(0)

n_samples = 30

X = np.sort(np.random.rand(n_samples))
y = true_fun(X) + np.random.randn(n_samples) * 0.1

Visualizar Dados

Vamos plotar a função verdadeira e as amostras geradas.

plt.figure(figsize=(6, 4))
plt.plot(np.linspace(0, 1, 100), true_fun(np.linspace(0, 1, 100)), label="Função verdadeira")
plt.scatter(X, y, edgecolor="b", s=20, label="Amostras")
plt.xlabel("x")
plt.ylabel("y")
plt.legend(loc="best")
plt.show()

Ajustar Modelos com Recursos Polinomiais

Vamos ajustar modelos com recursos polinomiais de grau 1, 4 e 15, e plotar os resultados.

degrees = [1, 4, 15]

plt.figure(figsize=(14, 5))

for i in range(len(degrees)):
    ax = plt.subplot(1, len(degrees), i + 1)
    plt.setp(ax, xticks=(), yticks=())

    polynomial_features = PolynomialFeatures(degree=degrees[i], include_bias=False)
    linear_regression = LinearRegression()
    pipeline = Pipeline(
        [
            ("polynomial_features", polynomial_features),
            ("linear_regression", linear_regression),
        ]
    )
    pipeline.fit(X[:, np.newaxis], y)

    X_test = np.linspace(0, 1, 100)
    plt.plot(X_test, pipeline.predict(X_test[:, np.newaxis]), label="Modelo")
    plt.plot(X_test, true_fun(X_test), label="Função verdadeira")
    plt.scatter(X, y, edgecolor="b", s=20, label="Amostras")
    plt.xlabel("x")
    plt.ylabel("y")
    plt.xlim((0, 1))
    plt.ylim((-2, 2))
    plt.legend(loc="best")
    plt.title("Grau {}".format(degrees[i]))

plt.show()

Avaliar o Desempenho do Modelo

Vamos avaliar os modelos usando validação cruzada e calcular o erro quadrático médio (MSE) no conjunto de validação.

degrees = [1, 4, 15]

plt.figure(figsize=(14, 5))

for i in range(len(degrees)):
    ax = plt.subplot(1, len(degrees), i + 1)
    plt.setp(ax, xticks=(), yticks=())

    polynomial_features = PolynomialFeatures(degree=degrees[i], include_bias=False)
    linear_regression = LinearRegression()
    pipeline = Pipeline(
        [
            ("polynomial_features", polynomial_features),
            ("linear_regression", linear_regression),
        ]
    )
    pipeline.fit(X[:, np.newaxis], y)

    ## Avaliar os modelos usando validação cruzada
    scores = cross_val_score(
        pipeline, X[:, np.newaxis], y, scoring="neg_mean_squared_error", cv=10
    )

    X_test = np.linspace(0, 1, 100)
    plt.plot(X_test, pipeline.predict(X_test[:, np.newaxis]), label="Modelo")
    plt.plot(X_test, true_fun(X_test), label="Função verdadeira")
    plt.scatter(X, y, edgecolor="b", s=20, label="Amostras")
    plt.xlabel("x")
    plt.ylabel("y")
    plt.xlim((0, 1))
    plt.ylim((-2, 2))
    plt.legend(loc="best")
    plt.title(
        "Grau {}\nMSE = {:.2e}(+/- {:.2e})".format(
            degrees[i], -scores.mean(), scores.std()
        )
    )

plt.show()

Resumo

Este laboratório demonstrou como usar regressão linear com recursos polinomiais para aproximar funções não lineares e como avaliar o desempenho do modelo usando validação cruzada. Vimos que uma função linear não é suficiente para ajustar as amostras de treinamento e que um polinômio de grau 4 aproxima a função verdadeira quase perfeitamente. No entanto, para graus mais altos, o modelo irá superajustar os dados de treinamento e aprender o ruído dos dados de treinamento. Podemos usar validação cruzada e o erro quadrático médio (MSE) para avaliar o desempenho do modelo e evitar o superajuste.