Projekt v PythonuZdroj ↗

Projekt 4 — Nákup (Shopping)

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

Do 2027-06-30T23:59:00+00:00.

Jak získat pomoc

  1. Ptej se prostřednictvím Ed!
  2. 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

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ů evidence a labels se 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 a labels[0] jeho štítek.
  • Každý prvek seznamu evidence je sám seznamem délky 17, tedy počtu sloupců bez posledního sloupce štítků.
  • Hodnoty každého seznamu evidence musí dodržet pořadí sloupců tabulky. Můžeš předpokládat, že sloupce shopping.csv budou 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, VisitorType a Weekend musí být typu int.
    • Administrative_Duration, Informational_Duration, ProductRelated_Duration, BounceRates, ExitRates, PageValues a SpecialDay musí být typu float.
    • Month je 0 pro leden, 1 pro únor, 2 pro březen a tak dále až 11 pro prosinec.
    • VisitorType je 1 pro vracející se návštěvníky a 0 pro ostatní.
    • Weekend je 1 pro víkendové návštěvy, jinak 0.
  • Každá hodnota labels je celé číslo 1, pokud uživatel nakoupil, jinak 0.
  • 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ítek 0.

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žij KNeighborsClassifier.

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).

  • sensitivity je desetinná hodnota od 0 do 1 vyjadřující true positive rate: podíl správně rozpoznaných skutečně pozitivních štítků.
  • specificity je 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 1 pro pozitivní výsledky, nakupující, a 0 pro 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

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

Jak odevzdat

  1. 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.
  2. Nainstaluj Git a případně nainstaluj submit50.
  3. Pokud máš nainstalované submit50, spusť
    submit50 ai50/projects/2024/x/shopping
    

    Jinak pomocí Gitu odešli práci do https://github.com/me50/USERNAME.git, kde USERNAME je tvoje jméno na GitHubu, na větev ai50/projects/2024/x/shopping.

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).