Opdracht 2
Algemene informatie
Deze opdracht is gebaseerd op een inmiddels afgeronde
Kaggle competitie.
De opdracht dient gemaakt te worden door teams van 2 studenten.
Het verslag dient uiterlijk vrijdag 24 juni 2022 23:55 uur in pdf-formaat per e-mail te worden ingeleverd bij Ad Feelders.
Inleiding
Home Depot is een Amerikaanse keten van bouwmarkten. In 2011 telde Home Depot 2248 vestigingen in de Verenigde Staten, Canada, Mexico en China. In totaal zijn er zo'n 321,000 mensen werkzaam bij het bedrijf. Het domein homedepot.com trok vanaf 2008 minstens 120 millioen bezoekers per jaar volgens een Compete.com onderzoek. In deze opdracht proberen we de "shopping experience" van bezoekers van de Home Depot website te verbeteren door een model te ontwikkelen dat de relevantie van zoekresultaten nauwkeurig kan voorspellen. Home Depot gebruikt zoekrelevantie als een impliciete maat om vast te stellen hoe snel klanten bij de juiste produkten terechtkomen. Op dit moment wordt de impact van potentiële veranderingen van de zoekalgoritmen door mensen geëvalueerd; dit is een langdurig en subjectief proces. Door het reduceren van menselijke inbreng in de evaluatie van zoekrelevantie hoopt Home Depot dat ze de zoekalgoritmen sneller kunnen verbeteren.
De Data
De data set bevat gegevens over een aantal producten en echte queries van bezoekers van de website van Home Depot. De opdracht is om de relevantie-score te voorspellen voor de gegeven combinaties van producten en zoektermen. De "ground truth" ratings zijn verkregen door de zoekterm-product paren door meerdere mensen te laten scoren. Relevantie is een getal tussen 1 (niet relevant) en 3 (zeer relevant). Bijvoorbeeld, de query "AA battery" is zeer relevant voor een pakje AA batterijen (relevantie = 3), matig relevant voor een batterij voor een draadloze boor (relevantie = 2), en niet relevant voor een sneeuwschep (relevantie = 1). Ieder paar is door tenminste 3 personen gescoord. De verstrekte relevantie-scores zijn het gemiddelde van die individuele scores. (Merk op dat strikt genomen het middelen van ordinale scores dubieus is, maar deze voorbewerking van de data kunnen we niet meer ongedaan maken).
Je hebt de beschikking over de volgende twee tabellen:
- query_product.csv
Deze tabel bevat de volgende velden:- id: unieke identifier van query-product paar
- product_uid: unieke identifier van het product waarvan de relevantie voor de query wordt gegeven
- product_title: de naam van het product (tekst)
- search_term: de query (tekst)
- relevance: (numeriek) relevantie van product voor query; de score is het gemiddelde van tenminste 3 beoordelaars. Iedere beoordelaar geeft een score van 1 (niet relevant), 2 (relevant) of 3 (zeer relevant).
- product_descriptions.csv
Deze tabel bevat de volgende velden:- product_uid: unieke identifier van het product
- product_description: beschrijving van het product (tekst)
De tabel product_descriptions.csv bevat meer producten (ongeveer 124,000) dan er in de query-product paren voorkomen. De tabellen kunnen vanzelfsprekend gejoined (merge in R) worden op product_uid.
Analyse
Begin na het inlezen van de data met het berekenen van een aantal beschrijvende statistieken. Een aantal voorbeelden: Hoeveel unieke queries zijn er? Hoeveel unieke producten komen er voor in de query_product tabel? Wat is de verdeling van de relevantie-scores?
Bedenk features die bepalend zouden kunnen zijn voor de relevantie van een product voor een query. Aangezien het model ook moet werken voor productbeschrijvingen en zoektermen die niet in de trainingset voorkomen, is het belangrijk de features algemeen toepasbaar te maken. Een voorbeeld van een algemeen toepasbare feature:
- komen alle zoektermen voor in de productnaam? (ja=1, nee=0)
Voeg zelf extra features toe, je model moet tenminste 8 features hebben. Gebruik ook de kennis die je in deel 1 van de cursus hebt opgedaan om goede features te bedenken. Het zou kunnen helpen om, voordat je de features uitrekent, de tekstdata eerst voor te bewerken. Denk aan de gebruikelijke operaties als het verwijderen van stopwoorden, leestekens, of getallen. Je kunt ook stemming toepassen.
Tenslotte zou het ook kunnen helpen om word embeddings te gebruiken om features te construeren. Misschien bevat de naam van een product een query-term niet letterlijk, maar komt er wel een woord in voor dat sterk verwant is aan die query-term. Je kunt daarbij gebruik maken van "voorgetrainde" embeddings, of je kunt de embeddings leren op de Home Depot productbeschrijvingen.
We gaan de data met zowel regressie- als classificatiemodellen analyseren.
Regressie
Deel de data willekeurig op in een training set (50,000 query-product paren) en een test set (de overige 24,067 paren).- Schat een lineair regressiemodel, met alle features die je hebt bedacht, op de training set en rapporteer de geschatte coëfficiënten, p-waarden, etc. Rapporteer tevens de waarde van R2. Gebruik het model om de relevantie-scores te voorspellen op de test set, en rapporteer de root mean square error van die voorspellingen.
- Bepaal welke features een significante coëfficiënt hebben bij significantieniveau alfa=0.01.
- Bespreek de tekens van de geschatte coëfficiënten. Zijn alle tekens in overeenstemming met het "gezonde verstand"?
Merk op dat het gebruik van lineaire regressie niet helemaal in overeenstemming is met het ordinale karakter van de data. Ook op het gebruik van (root) mean square error als evaluatiemaat kan men het nodige aanmerken. Ondanks deze theoretische bezwaren zou het een prima bruikbaar model kunnen opleveren.
Classificatie
Analyseer de data met ordinale logistische regressie (proportional odds logistic regression) en met multinomiale (= ongeordende) logistische regressie. Selecteer alleen de rijen met een relevantiescore van exact 1, 2 of 3; de andere rijen gebruiken we niet in deze analyse. Gebruik dezelfde features als in het lineaire regressie model. Deel de data op in een train- (67%) en testset (33%). Schat de modellen op de trainset, en gebruik die modellen om de klasse-labels op de testset te voorspellen. Rapporteer de confusion matrix en het percentage correct voorspeld.
Maak ook een kruistabel die de voorspellingen van ordinale- en multinomiale logistische regressie op de testset tegen elkaar uitzet. Maak tenslotte voor beide modellen een vector die aangeeft of een rij uit de testset correct is voorspeld (1) of incorrect is voorspeld (0). Zet ook deze twee vectoren tegen elkaar uit in een kruistabel. Voer op basis van deze kruistabel een toets uit om te bepalen of het verschil in "accuracy" tussen ordinale- en multinomiale logistische regressie significant is.
Het Verslag
Ter indicatie: het verslag dient een omvang van ongeveer 10 tot 15 pagina's te hebben.
Het verslag dient de volgende elementen te bevatten:
- Een inleiding waarin de probleemstelling wordt uiteengezet. Wat is de analysevraag, en wat is de beoogde toepassing van de modellen? Hierbij mag je natuurlijk delen van de opdrachtbeschrijving hergebruiken, maar probeer zoveel mogelijk zelf te formuleren.
- Een beschrijving van de beschikbare data, inclusief eenvoudige beschrijvende statistieken. Meld ook zaken die je opvallen bij het inspecteren van de data, bijvoorbeeld zaken die op datavervuiling kunnen wijzen.
- Beschrijf eventuele voorbewerkingen die je op de tekst hebt uitgevoerd, bijvoorbeeld het verwijderen van leestekens en stopwoorden, stemming, etc.
- Beschrijf nauwkeurig welke features je hebt bedacht, en waarom je denkt dat die features voorspellende waarde zouden kunnen hebben. Als je word embeddings hebt gebruikt, geef dan duidelijk aan hoe je het model getraind hebt (op welke data, window-grootte, aantal componenten van de woord-vectoren).
- Rapporteer over de regressie- en classificatiemodellen, die je hebt getraind op de data.
Zie de omschrijving onder de kopjes "Regressie" en "Classificatie" hierboven. Hierbij maak je natuurlijk gebruik van de informatie die de R-functie (of statsmodels in Python) "summary" van een model afdrukt (schattingen van coƫfficiƫnten, p-waarden, ...).
Dump echter niet klakkeloos R-output of Python-output in je rapport! - Sluit je rapport af met een conclusie. Besteed daarbij aandacht aan de volgende vragen:
- Wat is je oordeel over de kwaliteit van de data?
- Hoe goed kunnen de geleerde modellen de relevantie voorspellen?
- Welke features bleken het belangrijkst?
- Heeft het eventuele gebruik van word embeddings de voorspellingen verbeterd?
- Vergelijk de ordinale- en multinomiale logistsiche regressiemodellen. Welk model heeft de voorkeur?
- Wat zou je nog kunnen proberen om de modellen te verbeteren?
Gereedschap
Het staat je volledig vrij de tools te gebruiken die je wilt.
Je hoeft geen code in te leveren.
We kunnen echter alleen ondersteuning bieden bij het gebruik van R of Python.
Om R op je eigen laptop te installeren kun je R hier downloaden. R Studio is een IDE voor R, en is van harte aanbevolen. Voor RStudio, kijk hier.
Overzicht van nuttige R-packages voor deze opdracht:
- tau: eenvoudige tekstmanipulatie, bijvoorbeeld de functie "textcnt" voor het tellen van woorden in tekst.
- tm: text mining, bevat functies voor het aanleggen van een tekstcorpus en het uitvoeren van bewerkingen op dat corpus. Bevat ook een functie voor het maken van een document-term matrix uit een tekstcorpus, met verschillende wegingsfactoren voor de termen (bijvoorbeeld tf.idf).
- text2vec: trainen en toepassen van GloVe word embeddings.
- MASS: bevat de functie "polr" voor proportional odds logistic regression (=ordinale logistische regressie).
- nnet: bevat de functie "multinom" voor multinomiale logistische regressie.
Overzicht van nuttige Python packages voor deze opdracht:
- numpy, pandas: datamanipulatie algemeen.
- statsmodels: lineaire regressie (OLS), multinomiale logistische regressie (MNLogit), ordinale logistische regressie (OrderedModel met distr = 'logit')
- scikit-learn: bevat nuttige functies voor feature extractie uit tekst. Zie de documentatie.
- NLTK, Gensim, SpaCy: natuurlijke taal verwerking.
We bieden geen cursus programmeren in R of Python aan. We gaan er van uit dat informatica-studenten zich de taal zelf kunnen
aanleren. Op het web is ruimschoots voldoende informatie over R en Python te vinden.