Aprendizado de Máquina - Treinamento/Teste

Avaliar o modelo

Na aprendizado de máquina, criamos modelos para prever resultados de某些 eventos, como no capítulo anterior, quando prevemos a emissão de dióxido de carbono de um carro ao saber o peso e a capacidade do motor.

Para medir se o modelo é suficientemente bom, podemos usar um método chamado treinamento/teste.

O que é treinamento/teste

Treinamento/teste é um método para medir a precisão do modelo.

Chama-se treinamento/teste porque dividimos o conjunto de dados em dois grupos: conjunto de treinamento e conjunto de teste.

80% para treinamento, 20% para teste.

Você pode usar o conjunto de treinamento para treinar o modelo.

Você pode usar o conjunto de teste para testar o modelo.

Treinar o modelo significa criar o modelo.

Testar o modelo significa testar a precisão do modelo.

Comece com o conjunto de dados.

Comece com o conjunto de dados a ser testado.

Nosso conjunto de dados mostra 100 clientes em uma loja e seus hábitos de compra.

Exemplo

import numpy
import matplotlib.pyplot as plt
numpy.random.seed(2)
x = numpy.random.normal(3, 1, 100)
y = numpy.random.normal(150, 40, 100) / x
plt.scatter(x, y)
plt.show()

Resultados:

O eixo x representa o número de minutos antes da compra.

O eixo y representa a quantidade gasta na compra.


Executar Exemplo

Dividir treinamento/teste

O conjunto de treinamento deve ser uma escolha aleatória de 80% dos dados originais.

O conjunto de teste deve ser 20% dos restantes.

train_x = x[:80]
train_y = y[:80]
test_x = x[80:]
test_y = y[80:]

Exibir o conjunto de treinamento

Exibir o gráfico de dispersão igual ao conjunto de treinamento:

Exemplo

plt.scatter(train_x, train_y)
plt.show()

Resultados:

Ele parece o conjunto de dados original, então parece ser uma escolha razoável:


Executar Exemplo

Exibir o conjunto de teste

Para garantir que o conjunto de teste não seja completamente diferente, também vamos olhar para o conjunto de teste.

Exemplo

plt.scatter(test_x, test_y)
plt.show()

Resultados:

O conjunto de teste também parece o conjunto de dados original:


Executar Exemplo

Ajustar o conjunto de dados

Como é o conjunto de dados? Acho que a melhor adaptação é a regressão polinomial, então vamos desenhar uma linha de regressão polinomial.

Para desenhar uma linha através dos pontos de dados, usamos o módulo matplotlib plott() Método:

Exemplo

Desenhar a linha de regressão polinomial que passa pelos pontos de dados:

import numpy
import matplotlib.pyplot as plt
numpy.random.seed(2)
x = numpy.random.normal(3, 1, 100)
y = numpy.random.normal(150, 40, 100) / x
train_x = x[:80]
train_y = y[:80]
test_x = x[80:]
test_y = y[80:]
mymodel = numpy.poly1d(numpy.polyfit(train_x, train_y, 4))
myline = numpy.linspace(0, 6, 100)
plt.scatter(train_x, train_y)
plt.plot(myline, mymodel(myline))
plt.show()

Resultados:


Executar Exemplo

Este resultado pode apoiar nossa sugestão de ajuste polinomial ao conjunto de dados, mesmo que tentarmos prever valores fora do conjunto de dados, possamos obter alguns resultados estranhos. Por exemplo: esta linha indica que um cliente passou 6 minutos comprando na loja, completando uma compra de 200. Isso pode ser um sinal de sobreajuste.

Mas o que é o score de R-squared? O R-squared score indica bem o grau de ajuste do meu conjunto de dados ao modelo.

R2

Lembras da R2, também conhecida como R quadrado (R-squared)?

que mede a relação entre o eixo x e o eixo y, com valores entre 0 e 1, onde 0 representa a ausência de relação e 1 representa uma relação completa.

O módulo sklearn tem um nome rs_score() da seguinte maneira, que nos ajudará a encontrar essa relação.

Aqui, vamos medir a relação entre o tempo que os clientes passam na loja e o quanto eles gastam.

Exemplo

Como é a aderência de nossos dados de treinamento no regressão polinomial?

import numpy
from sklearn.metrics import r2_score
numpy.random.seed(2)
x = numpy.random.normal(3, 1, 100)
y = numpy.random.normal(150, 40, 100) / x
train_x = x[:80]
train_y = y[:80]
test_x = x[80:]
test_y = y[80:]
mymodel = numpy.poly1d(numpy.polyfit(train_x, train_y, 4))
r2 = r2_score(train_y, mymodel(train_x))
print(r2)

Executar Exemplo

Notas:O resultado 0.799 mostra uma boa relação.

Introdução do conjunto de teste

Agora, pelo menos em termos de dados de treinamento, já temos um modelo bastante bom.

Então, usaremos dados de teste para testar o modelo, para verificar se ele gera resultados idênticos.

Exemplo

Vamos determinar a fração R2 ao usar os dados de teste:}

import numpy
from sklearn.metrics import r2_score
numpy.random.seed(2)
x = numpy.random.normal(3, 1, 100)
y = numpy.random.normal(150, 40, 100) / x
train_x = x[:80]
train_y = y[:80]
test_x = x[80:]
test_y = y[80:]
mymodel = numpy.poly1d(numpy.polyfit(train_x, train_y, 4))
r2 = r2_score(test_y, mymodel(test_x))
print(r2)

Executar Exemplo

Notas:O resultado 0,809 indica que o modelo também é adequado para o conjunto de teste, e estamos confiantes de que podemos usar o modelo para prever valores futuros.

Valor de Previsão

Agora que já confirmamos que nosso modelo é bom, podemos começar a prever novos valores.

Exemplo

Se o cliente que comprou ficou 5 minutos na loja, quanto ele/gente vai gastar?

print(mymodel(5))

Executar Exemplo

Este exemplo prevê que o cliente gastou 22,88 dólares, o que parece correspondente ao gráfico: