Projekt 4 — Nákup (Shopping)
Nejnovější verze Pythonu, kterou bys měla v tomto kurzu používat, je Python 3.12.
Napiš AI, která předpoví, zda zákazník internetového obchodu dokončí nákup.
$ python shopping.py shopping.csv
Correct: 4088
Incorrect: 844
True Positive Rate: 41.02%
True Negative Rate: 90.55%
Kdy úlohu dokončit
Jak získat pomoc
- Ptej se prostřednictvím Ed!
- Ptej se v kterékoli komunitě CS50!
Východiska
Ne každý uživatel internetového obchodu něco koupí. Většina návštěvníků patrně během dané relace nákup nedokončí. Pro obchod však může být užitečné předpovídat nákupní záměr: může například zobrazit jiný obsah nebo slevovou nabídku návštěvníkovi, u něhož předpokládá, že nákup neplánuje. Jak může web nákupní záměr určit? Zde přichází strojové učení.
Tvým úkolem je vytvořit klasifikátor nejbližším sousedem. Z údajů o uživateli, například počtu navštívených stránek, návštěvy o víkendu či používaného prohlížeče, předpoví nákup. Nebude dokonale přesný: dokonalé modelování lidského chování přesahuje rozsah kurzu. Měl by však být lepší než náhodné hádání. K trénování dostaneš data přibližně 12 000 uživatelských relací internetového obchodu.
Jak změříme přesnost systému? Na testovací sadě můžeme spočítat podíl správně rozpoznaných záměrů a dostat jedno procento accuracy. To však může klamat. Pokud nákup dokončí asi 15 % uživatelů, klasifikátor, který vždy předpoví nenakoupení, bude mít 85% přesnost: chybně určí pouze 15 % nakupujících. Přestože 85 % zní dobře, takový klasifikátor není příliš užitečný.
Budeme proto měřit dvě hodnoty: citlivost, sensitivity neboli true positive rate, a specificitu, specificity neboli true negative rate. Citlivost je podíl správně rozpoznaných pozitivních případů, tedy nakupujících. Specificita je podíl správně rozpoznaných negativních případů, tedy nenakupujících. Klasifikátor „vždy ne“ by měl dokonalou specificitu 1,0, ale nulovou citlivost 0,0. Naším cílem je rozumný výsledek v obou metrikách.
Začínáme
- Stáhni dodaný kód z https://cdn.cs50.net/ai/2023/x/projects/4/shopping.zip a rozbal jej.
- Pokud ještě nemáš balíček
scikit-learn, který projekt potřebuje, nainstaluj jej příkazempip3 install scikit-learn.
Porozumění zadání
Nejprve otevři datovou sadu shopping.csv. Lze použít textový editor, ale přehlednější může být tabulkový program jako Microsoft Excel, Apple Numbers nebo Google Sheets.
Tabulka obsahuje přibližně 12 000 relací, každou na jednom řádku. Prvních šest sloupců popisuje navštívené typy stránek: Administrative, Informational a ProductRelated počítají stránky příslušného typu a odpovídající sloupce _Duration čas na nich. BounceRates, ExitRates a PageValues obsahují údaje Google Analytics o navštívené stránce. SpecialDay měří blízkost relace ke zvláštnímu dni, například Valentýnu nebo Dni matek. Month je zkratka měsíce návštěvy. OperatingSystems, Browser, Region a TrafficType jsou celá čísla s údaji o uživateli. VisitorType je Returning_Visitor pro vracející se návštěvníky a jiný řetězec pro ostatní. Weekend má podle víkendové návštěvy hodnotu TRUE nebo FALSE.
Nejdůležitější může být poslední sloupec Revenue, který určuje dokončení nákupu: TRUE při nákupu, jinak FALSE. Jeho hodnotu, tedy štítek „label“, chceme předpovídat podle ostatních sloupců, tedy podkladů „evidence“.
V shopping.py funkce main načítá CSV voláním load_data a rozděluje data na trénovací a testovací sadu. train_model natrénuje model na trénovací sadě. Ten pak předpovídá testovací data. Nakonec evaluate určí citlivost a specificitu a výsledky se vypíší do terminálu.
load_data, train_model a evaluate jsou zatím prázdné. Zde začíná tvoje práce!
Specifikace
V shopping.py dokonči load_data, train_model a evaluate.
load_data přijme název CSV souboru, otevře jej a vrátí tuple (evidence, labels). evidence bude seznam všech vstupních podkladů jednotlivých datových bodů a labels seznam všech jejich štítků.
- Na každý řádek připadá jeden podklad a jeden štítek. Délky seznamů
evidencealabelsse proto rovnají počtu řádků CSV bez hlavičky. Pořadí musí odpovídat pořadí uživatelů v tabulce:evidence[0]jsou podklady prvního uživatele alabels[0]jeho štítek. - Každý prvek seznamu
evidenceje sám seznamem délky 17, tedy počtu sloupců bez posledního sloupce štítků. - Hodnoty každého seznamu
evidencemusí dodržet pořadí sloupců tabulky. Můžeš předpokládat, že sloupceshopping.csvbudou vždy ve stejném uvedeném pořadí. - Pro klasifikátor nejbližším sousedem potřebujeme číselná data. Zajisti následující typy hodnot:
Administrative,Informational,ProductRelated,Month,OperatingSystems,Browser,Region,TrafficType,VisitorTypeaWeekendmusí být typuint.Administrative_Duration,Informational_Duration,ProductRelated_Duration,BounceRates,ExitRates,PageValuesaSpecialDaymusí být typufloat.Monthje0pro leden,1pro únor,2pro březen a tak dále až11pro prosinec.VisitorTypeje1pro vracející se návštěvníky a0pro ostatní.Weekendje1pro víkendové návštěvy, jinak0.
- Každá hodnota
labelsje celé číslo1, pokud uživatel nakoupil, jinak0. - Například první seznam podkladů má být
[0, 0.0, 0, 0.0, 1, 0.0, 0.2, 0.2, 0.0, 0.0, 1, 1, 1, 1, 1, 1, 0]a první štítek0.
train_model přijme seznam podkladů a seznam štítků a vrátí klasifikátor nejbližším sousedem z scikit-learn, konkrétně k-nearest-neighbor s k = 1, natrénovaný na těchto datech.
- Už jsme importovali
from sklearn.neighbors import KNeighborsClassifier. V této funkci použijKNeighborsClassifier.
evaluate přijme seznam labels, skutečných štítků testovacích uživatelů, a seznam predictions, předpovědí klasifikátoru, a vrátí dvě desetinné hodnoty (sensitivity, specificity).
sensitivityje desetinná hodnota od 0 do 1 vyjadřující true positive rate: podíl správně rozpoznaných skutečně pozitivních štítků.specificityje desetinná hodnota od 0 do 1 vyjadřující true negative rate: podíl správně rozpoznaných skutečně negativních štítků.- Můžeš předpokládat, že štítky jsou
1pro pozitivní výsledky, nakupující, a0pro negativní, nenakupující. - Můžeš předpokládat, že seznam skutečných štítků obsahuje alespoň jeden pozitivní a jeden negativní štítek.
V shopping.py neupravuj nic kromě funkcí určených zadáním. Můžeš přidat pomocné funkce a importy standardní knihovny Pythonu. Pokud je znáš, můžeš importovat numpy, pandas nebo cokoli z scikit-learn, ale žádné jiné moduly třetích stran. shopping.csv neupravuj.
Tipy
- Informace a příklady načítání CSV najdeš v dokumentaci CSV pro Python.
Testování
Chceš-li vyhodnotit správnost kódu, můžeš po nastavení check50 spustit následující příkaz. Není to povinné: při odevzdání podle kroků na konci zadání proběhnou stejné testy na našem serveru. V každém případě kód také sama zkompiluj a otestuj!
check50 ai50/projects/2024/x/shopping
Následujícím příkazem vyhodnotíš styl kódu pomocí style50.
style50 shopping.py
Pamatuj, že kromě standardní knihovny Pythonu nesmíš importovat žádné moduly mimo ty, které jsou zde výslovně povoleny. Jinak nebude fungovat check50 a ani submit50 nebude moci práci ohodnotit, protože používá check50. Pokud se to stane, patrně jsi importovala zakázaný modul nebo nepovoleně upravila dodaný kód. Existují nástroje, které některé projekty velmi zjednodušují, ale to zde není cílem: učíš se principům na nižší úrovni. Pokud zde jejich použití nepovolujeme, použít je nemůžeš.
Jak odevzdat
- Otevři tento odkaz, přihlas se účtem GitHub a klikni na Authorize cs50. Pak zaškrtni souhlas s přístupem učitelů k odevzdaným pracím a klikni na Join course.
- Nainstaluj Git a případně nainstaluj
submit50. - Pokud máš nainstalované
submit50, spusťsubmit50 ai50/projects/2024/x/shoppingJinak pomocí Gitu odešli práci do
https://github.com/me50/USERNAME.git, kdeUSERNAMEje tvoje jméno na GitHubu, na větevai50/projects/2024/x/shopping.
Při přímém odevzdání přes Git místo submit50 nepřikládej soubory ani složky mimo ty, které máš podle zadání upravit. Neodesílej tedy celý adresář!
Práce by měla být ohodnocena do pěti minut. Svůj postup pak můžeš sledovat na https://cs50.me/cs50ai!
Poděkování
Datovou sadu poskytli Sakar, C.O., Polat, S.O., Katircioglu, M. et al. Neural Comput & Applic (2018).