Uczenie maszynowe — trenuj/testuj
Oceń swój model
W uczeniu maszynowym tworzymy modele do przewidywania wyniku pewnych zdarzeń, tak jak w poprzednim rozdziale, w którym przewidywaliśmy emisję CO2 samochodu znając masę i wielkość silnika.
Aby zmierzyć, czy model jest wystarczająco dobry, możemy użyć metody zwanej Train/Test.
Co to jest pociąg/test?
Train/Test to metoda pomiaru dokładności modelu.
Nazywa się Train/Test, ponieważ dzielisz zestaw danych na dwa zestawy: zestaw uczący i zestaw testowy.
80% na szkolenie i 20% na testy.
Trenujesz model za pomocą zestawu szkoleniowego .
Testujesz model za pomocą zestawu testowego .
Trenuj model oznacza tworzenie modelu.
Testowanie modelu oznacza testowanie dokładności modelu.
Zacznij od zestawu danych
Zacznij od zestawu danych, który chcesz przetestować.
Nasz zestaw danych ilustruje 100 klientów w sklepie i ich nawyki zakupowe.
Przykład
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()
Wynik:
Oś x reprezentuje liczbę minut przed dokonaniem zakupu.
Oś y przedstawia kwotę wydaną na zakup.
Podział na pociąg/test
Zbiór uczący powinien być losowym wyborem 80% oryginalnych danych.
Zestaw testowy powinien stanowić pozostałe 20%.
train_x = x[:80]
train_y = y[:80]
test_x = x[80:]
test_y = y[80:]
Wyświetl zestaw treningowy
Wyświetl ten sam wykres punktowy z zestawem treningowym:
Przykład
plt.scatter(train_x,
train_y)
plt.show()
Wynik:
Wygląda jak oryginalny zestaw danych, więc wydaje się, że jest to uczciwy wybór:
Wyświetl zestaw testowy
Aby upewnić się, że zestaw testowy nie jest zupełnie inny, przyjrzymy się również zestawowi testowemu.
Przykład
plt.scatter(test_x,
test_y)
plt.show()
Wynik:
Zestaw testowy również wygląda jak oryginalny zestaw danych:
Dopasuj zestaw danych
Jak wygląda zestaw danych? Moim zdaniem najlepszym dopasowaniem byłaby regresja wielomianowa , więc narysujmy linię regresji wielomianowej.
Aby narysować linię przez punkty danych, używamy
plot()
metody modułu matplotlib:
Przykład
Narysuj wielomianową linię regresji przez punkty danych:
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()
Wynik:
Wynik może poprzeć moją sugestię, że zestaw danych pasuje do regresji wielomianowej, chociaż dałoby nam to dziwne wyniki, jeśli spróbujemy przewidzieć wartości poza zestawem danych. Przykład: linia wskazuje, że klient spędzający 6 minut w sklepie dokonałby zakupu o wartości 200. Jest to prawdopodobnie oznaka nadmiernego dopasowania.
Ale co z wynikiem R-kwadrat? Wynik R-kwadrat jest dobrym wskaźnikiem tego, jak dobrze mój zestaw danych pasuje do modelu.
R2
Pamiętasz R2, znany również jako R-kwadrat?
Mierzy związek między osią x a osią y, a wartość mieści się w zakresie od 0 do 1, gdzie 0 oznacza brak związku, a 1 oznacza całkowity związek.
Moduł sklearn ma wywołaną metodę r2_score()
, która pomoże nam znaleźć tę zależność.
W tym przypadku chcielibyśmy zmierzyć relację między minutami, w których klient przebywa w sklepie, a ilością wydanych pieniędzy.
Przykład
Jak dobrze moje dane treningowe pasują do regresji wielomianowej?
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)
Uwaga: Wynik 0,799 wskazuje, że istnieje relacja OK.
Przynieś zestaw testowy
Teraz stworzyliśmy model, który jest OK, przynajmniej jeśli chodzi o dane treningowe.
Teraz chcemy przetestować model również z danymi testowymi, aby sprawdzić, czy daje nam ten sam wynik.
Przykład
Znajdźmy wynik R2 korzystając z danych testowych:
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)
Uwaga: wynik 0,809 pokazuje, że model również pasuje do zestawu testowego i jesteśmy pewni, że możemy użyć modelu do przewidywania przyszłych wartości.
Przewidywanie wartości
Teraz, gdy ustaliliśmy, że nasz model jest OK, możemy zacząć przewidywać nowe wartości.
Przykład
Ile pieniędzy wyda klient kupujący, jeśli pozostanie w sklepie przez 5 minut?
print(mymodel(5))
Przykład przewidywał, że klient wyda 22,88 dolarów, co wydaje się odpowiadać wykresowi: