Strojové učení – trénovat/testovat
Vyhodnoťte svůj model
Ve strojovém učení vytváříme modely pro předpovídání výsledku určitých událostí, jako v předchozí kapitole, kde jsme předpovídali emise CO2 auta, když jsme znali hmotnost a objem motoru.
K měření, zda je model dostatečně dobrý, můžeme použít metodu nazvanou Train/Test.
Co je vlak/test
Train/Test je metoda měření přesnosti vašeho modelu.
Nazývá se Train/Test, protože rozdělujete soubor dat do dvou sad: trénovací a testovací.
80 % na školení a 20 % na testování.
Model trénujete pomocí tréninkové sady.
Model otestujete pomocí testovací sady.
Trénovat model znamená vytvořit model.
Testovat model znamená testovat přesnost modelu.
Začněte souborem dat
Začněte se sadou dat, kterou chcete otestovat.
Náš soubor dat ilustruje 100 zákazníků v obchodě a jejich nákupní zvyklosti.
Příklad
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()
Výsledek:
Osa x představuje počet minut před uskutečněním nákupu.
Osa y představuje množství peněz vynaložených na nákup.
Rozdělit na vlak/test
Tréninkový soubor by měl být náhodným výběrem 80 % původních dat.
Testovací sada by měla být zbývajících 20 %.
train_x = x[:80]
train_y = y[:80]
test_x = x[80:]
test_y = y[80:]
Zobrazte tréninkovou sadu
Zobrazte stejný bodový graf s tréninkovou sadou:
Příklad
plt.scatter(train_x,
train_y)
plt.show()
Výsledek:
Vypadá to jako původní soubor dat, takže se zdá, že je to spravedlivý výběr:
Zobrazte testovací sadu
Abychom se ujistili, že testovací sada není úplně jiná, podíváme se také na testovací sadu.
Příklad
plt.scatter(test_x,
test_y)
plt.show()
Výsledek:
Testovací sada také vypadá jako původní datová sada:
Přizpůsobit soubor dat
Jak vypadá soubor dat? Podle mého názoru si myslím, že nejvhodnější by byla polynomiální regrese , takže nakreslete čáru polynomiální regrese.
K nakreslení čáry přes datové body používáme
plot()
metodu modulu matplotlib:
Příklad
Nakreslete polynomiální regresní čáru přes datové body:
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()
Výsledek:
Výsledek může podpořit můj návrh souboru dat, který vyhovuje polynomiální regresi, i když by nám to dalo nějaké divné výsledky, pokud bychom se pokusili předpovědět hodnoty mimo soubor dat. Příklad: čára ukazuje, že zákazník, který v obchodě stráví 6 minut, nakoupí v hodnotě 200. To je pravděpodobně známka nadměrného vybavení.
Ale co R-kvadrát skóre? Skóre R-squared je dobrým ukazatelem toho, jak dobře můj soubor dat odpovídá modelu.
R2
Pamatujete si R2, také známý jako R-squared?
Měří vztah mezi osou x a osou y a hodnota se pohybuje od 0 do 1, kde 0 znamená žádný vztah a 1 znamená zcela související.
Modul sklearn má metodu nazvanou r2_score()
, která nám pomůže tento vztah najít.
V tomto případě bychom rádi změřili vztah mezi minutami, kdy zákazník v obchodě zůstane, a tím, kolik peněz utratí.
Příklad
Jak dobře zapadají moje tréninková data do polynomiální regrese?
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)
Poznámka: Výsledek 0,799 ukazuje, že existuje vztah OK.
Přineste testovací sadu
Nyní jsme vytvořili model, který je v pořádku, alespoň pokud jde o tréninková data.
Nyní chceme otestovat model také s testovacími daty, abychom zjistili, zda nám dává stejný výsledek.
Příklad
Pojďme najít skóre R2 při použití testovacích dat:
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)
Poznámka: Výsledek 0,809 ukazuje, že model také vyhovuje testovací sadě a jsme si jisti, že model můžeme použít k předpovědi budoucích hodnot.
Předvídat hodnoty
Nyní, když jsme zjistili, že náš model je v pořádku, můžeme začít předpovídat nové hodnoty.
Příklad
Kolik peněz utratí kupující, když zůstane v obchodě 5 minut?
print(mymodel(5))
Příklad předpovídal, že zákazník utratí 22,88 dolarů, jak se zdá, odpovídá diagramu: