Tag

adatbányászat Archives - Dat'n'Roll

DIY filmajánló

By | Data Science, Python | No Comments

Az elmúlt néhány évben az ajánlórendszerek egyre nagyobb teret foglalnak el az életünkben, szinte bármilyen online tevékenységet végzünk jelen vannak. Ott vannak az online kereskedelemben, a hirdetésekben és az ajánlórendszerek segítenek a filmek, zenék kiválasztásában is. Ezen rendszerek célja, hogy releváns elemeket javasoljon a felhasználónak. Data Scientist-ként is előfordulnak olyan feladatok, amelyeket ajánlórendszerek segítségével tudunk megoldani. Most a két hónapos otthon tartózkodásom alatt, nem a munkám kapcsán merült fel ez a problémakör. Miután véletlenszerűen rábukkantam egy filmes adatbázisra, úgy döntöttem építek egy egyszerű ajánlórendszert magamnak, amivel újabb filmeket javasolhatok, a már megnézett filmek értékelése alapján.

Adatbázis

Ezekben a feladatokban sokszor a megfelelő adatbázis hiánya okozza a legnagyobb problémát. Előfordul, hogy adott egy jó feladat, de sajnos nem található hozzá megfelelő mennyiségű vagy minőségű adat. Ennek oka lehet, hogy az adatok nem publikusak, vagy az adatkészlet megszerzése költségesebb, mint a projekt várható haszna. Abba a problémába is sokszor beleütközünk, hogy az adatok nem megfelelő minőségűek, hiányosak vagy nem konzisztensek. Olykor saját magunknak kell létrehozni az adatbázist, ami időigényes és költséges lehet. Szerencsére én rátaláltam egy 2013 óta épülő adatbázisra.

Az általam használt adatbázis a MovieTweetings, egy olyan adatkészlet, amely twitter felhasználók filmes értékeléseit tartalmazza. Naponta gyűjti össze az információt a Twitterről, az olyan jól strukturált tweetek alapján, amelyek tartalmazzák az „I rated #IMDb” kifejezést. Ez az adatkészlet Simon Dooms által végzett kutatás eredménye, amelyet a MovieTweetings: a Movie Rating Dataset Collected From Twitter tanulmány mutat be.

Miután az adatbázis rendelkezésre állt, először is ellenőriztem a használhatóságát. Ehhez megnéztem, hogy egy-egy filmet hányan értékeltek. A legtöbbet értékelt film a Gravity, amely 3086 szavazatot kapott. Ez lényegesen elmarad az IMDb értékelések számától. Sok olyan film is volt, ami nagyon kevés szavazattal rendelkezett, ezért leszűrtem a filmeket azokra, amelyek legalább 100 értékelést kaptak, és így 1644 film maradt az adatbázisomban. Ezután leellenőriztem, hogy hogyan viszonyulnak ezeknek a filmeknek az átlagos pontszámai egymáshoz, amit a Twitteren, illetve az IMDb-n kaptak. A következő táblázatban és ábrán jól látható, hogy érdekes módon az 1644 filmből csak 10 olyan volt, ami esetén nagyobb mint 1 az eltérés az átlagos pontszámok között, holott az IMDb-n nagyságrendekkel többen értékelik a filmeket.

filmek értékelése táblázatban

a Twitter és az IMDb filmértékelések összehasonlítása

Így jól használhatónak fogadtam el ezt az adatbázist és ezzel dolgoztam tovább. Kiszűrtem továbbá azokat a felhasználókat, akik kevesebb, mint 20 filmre adtak értékelést. Így a felhasználók száma 6883 maradt. A kezdeti tábla (twitterdataframe) a következőket tartalmazta: felhasználó (user_id), film (movie_title), értékelés (rating).

Ajánlórendszerek

Az ajánlórendszereknek három fő típusát különböztetjük meg: Az együttműködés alapú, a tartalom alapú és a hibrid módszert, amely az előző két megoldás keveréke.

Az együttműködés alapú megközelítés kizárólag a felhasználók és az elemek közötti korábbi kölcsönhatásokon alapul, új ajánlások előállítása érdekében. Ennek a módszernek a fő gondolata az, hogy a múltbeli felhasználó-elem-interakciók elegendőek a hasonló felhasználók és hasonló elemek megtalálásához és a számolt közelségek alapján a javaslatok elkészítéséhez. Az együttműködési megközelítés fő előnye, hogy nem igényel plusz információt a felhasználókról vagy az elemekről, és ezért sok helyzetben felhasználható. Sőt minél több felhasználó értékeli az elemeket, annál pontosabbak lesznek az új ajánlások.

Ellentétben az előző a módszerrel, a tartalom alapú megközelítés esetén kiegészítő információkra is szükség van a felhasználókról és az elemekről. Ilyen információ lehet az életkor, a nem vagy bármilyen más személyes adat a felhasználóról, valamint a kategória, a rendező, az időtartam vagy egyéb jellemzők a filmekről (elemekről).

Tekintve, hogy jelen helyzetben csak annyi információ áll rendelkezésre, hogy egy-egy felhasználó milyenre értékelte a filmeket, így az együttműködés alapú módszerrel dolgoztam.

Modell

Az együttműködés alapú módszer több fajtája közül a user-user megközelítéssel foglalkoztam. Annak érdekében, hogy új ajánlást nyújtson az adott felhasználónak, megpróbálja azonosítani a leginkább hasonló ízléssel rendelkező többi felhasználót. Ezt a módszert „user központúnak” nevezik, mivel a felhasználókat ábrázolja az elemekkel való interakcióik alapján, és méri a köztük lévő távolságot. Ezután kiszámol egy „hasonlóságot” az adott felhasználó és minden más felhasználó között. Ez a hasonlósági mutató közelinek tekint két felhasználót, akiknek azonos interakciói vannak ugyanazon elemekkel. Miután kiszámította a hasonlóságokat, megtalálja a felhasználóhoz legközelebbi szomszédokat, majd a szomszédok értékelései alapján ajánlja az új elemeket.

Ebben a feladatban új filmeket szerettem volna javasolni egy adott felhasználó számára. Ehhez először, minden felhasználót ábrázoltam a különféle filmekre adott értékeléseik vektoraként. A táblából (twitterdataframe) a vektorokat a pandas.DataFrame.pivot csomaggal hoztam létre, és a hiányzó értékeket kitöltöttem nullával.

felhasználók értékelése a filmekre

Ezek után megkerestem a szomszédokat a K legközelebbi szomszéd (K-nn) módszerével. Az algoritmus célja, hogy a film értékelések alapján megtalálja az adott felhasználóhoz legközelebb álló K számú legközelebbi szomszédot, azaz felhasználót. A szomszédok száma tetszőlegesen választható, figyelembe véve az alapbázis méretét és a feladat célját. Minél nagyobbra választjuk ezt a számot, annál távolabbi felhasználók is bekerülnek, így egyre kevésbé releváns elemeket fog javasolni a rendszer, viszont, ha nagyon kicsire állítjuk ezt a számot, akkor olyan filmeket is javasolhat, amit esetleg csak egy ember értékelt jóra. Itt a szomszédok számát 100-ra állítottam, hogy tényleg jó, de még releváns filmeket javasoljon a rendszer. A szomszédok kereséséhez az sklearn NearestNeighbors csomagját használtam. Alkalmaztam a modellt az adott felhasználóra, így megkaptam a legközelebbi 100 szomszédját.

Miután megtaláltam a legközelebbi szomszédokat, valamilyen módszerrel ki kellett választani a legnépszerűbb filmeket, majd azokat javasolni a felhasználónak, amiket még nem látott. A kiválasztás a céltól függ. Ki lehet választani azokat a filmeket, amiket a legtöbben 10-esre értékeltek, de lehet átlagos pontszám alapján is javaslatot adni. Én a következőképpen súlyoztam a pontszámokat: a rossz értékeléseket bűntettem, az átlagos értékeléseket figyelmen kívül hagytam, a jó értékeléseket pedig jutalmaztam. Ezután a kapott pontokat összegeztem minden filmre. Az így kialakult sorrendből az első 10 filmet javasoltam, amit a felhasználó még nem látott.

Ajánlás

Miután elkészült a modell, teszteltem a működését az általam értékelt filmeken. A következő táblázat azt a 20 filmet és pontszámot tartalmazza, ami alapján a legközelebbi szomszédokat kereste meg a rendszer.

az általam értékelt filmek

Az ajánló az alábbi filmeket javasolta nekem megnézésre:

Knives Out (2019), Avengers: Endgame (2019), Captain Phillips (2013), The Wolf of Wall Street (2013), The Shawshank Redemption (1994), Hacksaw Ridge (2016), American Hustle (2013), The Imitation Game (2014), Prisoners (2013), The Gentlemen (2019)

Mivel csak 20 filmet értékeltem előzőleg, így akadtak olyan filmek az ajánlatok között, melyeket már láttam, ennek köszönhetően tesztelni tudtam a javaslatokat. A remény rabjai (The Shawshank Redemption) és a Kódjátszma (The Imitation Game) kifejezett kedvenceim és a Phillips kapitányt is jó szívvel ajánlanám másoknak, ezért elégedett vagyok a rendszer működésével. Szerencsére azért akadt egy-két újdonság is a javaslatok között.

Felmerült problémák

A legtöbb ajánlási algoritmusban rendkívül óvatosnak kell lenni, hogy elkerüljük a népszerű termékek „gazdagabbá válását”. Más szóval, hogy rendszerünk csak népszerű elemeket javasoljon, és a felhasználók ​​csak olyan ajánlásokat kapjanak, amelyek rendkívül közel állnak azokhoz, amelyeket már kedveltek, ezáltal nincs esélyük megismerni új elemeket. Ennek elkerülésére növelhetjük a szomszédok számát, vagy az adott felhasználó értékelési listáját bővíthetjük változatosabb filmekkel.

A másik probléma, ami felmerült miután több kollégámnak is ajánlottam filmeket, hogy az egyik kollégám az 1644 filmből 1354-et látott és értékelt. Mivel az adatbázisban a következő legtöbbet értékelt felhasználó 869 filmet látott és 500-nál több filmet csak 13 felhasználó értékelt, így a szomszéd keresésnél csak egészen távoli szomszédokat talált hozzá az algoritmus. Valamint az ajánlható filmek listája nála lecsökkent 290-re, ezért nem biztos, hogy a legrelevánsabb filmeket ajánlja neki a rendszer. Ennek a problémának a megoldására az adatbázis növelése lenne a megoldás, ami költséges és időigényes lenne, de szerencsére ez ritka eset.

Megjósoljuk, hogy megjósolják – Facebook Prophet

By | Big Data News, Business, Data Science, Data Visualization | No Comments

Az elmúlt hetekben alapjaiban forgatta fel társadalmunkat és világról – különösen annak biztonságáról – alkotott képünket a Kínából indult koronavírus-járvány, és persze a globális felmelegedés témája is folyamatosan foglalkoztatja a közvéleményt.

A 21. században egyre nagyobb jelentőséggel bírnak és egyre pontosabbak a különböző prognózisok. Vajon az ezek mögött álló előrejelző algoritmusok tényleg alkalmasak arra, hogy megbízható információkkal szolgáljanak például az időjárásról, a közúti forgalom, esetleg a részvényárfolyamok alakulásáról, vagy akár a járványok terjedéséről? Erre is választ keresünk a Facebook Prophet gyakorlati bemutatásán keresztül.

Nem kérdés, hogy mindennapi életünket egyre jobban befolyásolják a különböző előrejelző algoritmusok. Elég, ha csak az időjárás-előrejelzésre, a forgalmi prognózisokra vagy a részvényárfolyamok előrejelzésére gondolunk. „Vajon milyen idő lesz holnap? Ha holnap arra indulok kocsival, vajon dugóba kerülök? Vajon most érdemes beszállni ebbe az üzletbe?” – annyira gyakorlatias kérdések ezek, hogy akár az elmúlt fél órában is hallhattuk volna valakitől, vagy akár mi magunk is feltehettük volna bármelyiket.

Még ha nem is tudatosul bennünk, számos előrejelzést „futtatunk” magunk is: korán indulunk, hogy legyen hely a munkahelyi parkolóban, hogy ne kelljen sorba állni a menzán; esetleg megpróbáljuk egy korai vagy éppen késői hazaindulással a dugót elkerülni; és így tovább. Mindez tapasztalataink alapján az esetek többségében működik is, ha pedig tévedünk, olyan nagy kockázattal jellemzően nem jár.

Amikor az adatok jóslásának következménye van

Az üzleti életben az előrejelzések ennél sokkal racionálisabban működnek, és persze nagyobb téttel is bírnak. A forgalmi adatok előrejelzése például egy rendszerüzemeltetéssel foglalkozó vállalatnál kulcsfontosságú. Még ha tudnák is úgy méretezi a rendszereiket, hogy azok az elképzelhető legnagyobb forgalmat is elbírják, nem lenne költséghatékony azt mindig a maximális kapacitáson üzemeltetni. Ehelyett inkább a korábbi minták alapján próbálják megbecsülni a várható forgalmat, és az IT-infrastruktúrát az előrejelzéshez méretezni. Szerencsére az elasztikus skálázhatóság ma már nem probléma.

Egy call centernél sem mindegy, hogy mikor hány operátor dolgozik. Az sem volt mindegy, hogy a 2000-es évek derekán a telekommunikációs vállalatok mekkorának becsülték az év végi SMS-forgalmat, hiszen köztudott volt, hogy akkortájt az rövid szöveges üzenetek nagy része karácsonyra és szilveszterre koncentrálódott.

Az előrejelzés-automatizálás előretörése minden területen törvényszerű, így ma már az interneten is számos algoritmus elérhető. Egyikre sem tekinthetünk természetesen mindent tudó varázsgömbként, de van egy-két említésre méltó közöttük. Ebben a bejegyzésben a Facebook által publikált generikus prediktív elemzési megoldást vizsgáljuk: kipróbáltuk a Mark Zuckerberg és fejlesztői csapata „prófétáját”.

A Facebook Prophet egy Python és R nyelven használható előrejelző eszköz, melyet Facebook data science csapata fejlesztette ki a Stan fejlesztőeszköz használatával. Szükséges bemenete egy timestamp típusú attribútum és egy hozzá tartozó numerikus érték. Ebből adódóan ez az eszköz azokra az esetekre hasznos,  mikor az adatnak szezonális tartalma van. Tapasztalataink alapján leginkább napi bontású, legalább egy évet tartalmazó adatok elemzésére alkalmas. Az implementációja követi az sklearn fit és predict függvények struktúráját.

A Prophet paraméterezhetősége

A Prophet erőssége a paraméterezhetőség, a lehetőség olyan információk átadására a modellnek, amelyek alapvetően az adatból nem következnek, de szeretnénk azokat figyelembe venni egy megbízhatóbb előrejelzés létrehozásakor.

  • Saturating Forecasts: minimum(floor), maximum(cap) érték meghatározása a perdiktálás keretek között tartása érdekében. Valamely konstans keretérték megadása, ami az adott előrejelzés logikája alapján szükséges lehet.
  • Trend Changepoints: az emberi ismeretekkel előre sejthető, jövőbeli trendben számíthatóan bekövetkező váltópontok számának meghatározása (n_changepoints), trend flexibilitásának beállítása (changepoint_prior_scale) vagy a váltópontok helyének meghatározása (changepoints). Ilyen lehet például a labdarúgó-világbajnokság fináléja.
  • Seasonality and Holiday Effects: szezonalitás meghatározása (add_seasonality), alapvetően heti és éves intervallumokkal számol a modell. Ünnepek meghatározása (holidays). Abban az esetben, ha szeretnénk meghatározni ilyen ünnepi dátumokat, akkor azt a múltra és jövőre vonatkozóan is meg kell tenni, különben nem veszi figyelembe a modell. A különböző ünnepek között meghatározható prioritás (prior_scale) és az ünnepi hatások csillapítása is lehetséges (holidays_prior_scale).
  • Outliers: Az outlier adatok kezelésére azt javasolják, hogy egyszerűen csak cseréljük le nem létező adatra, mert a Prophet jól kezeli a hiányzó adatokat.
  • Non-Daily Data: Abban az esetben, ha nem éves adatokra tanítjuk be a modellünket, akkor az előre jelzésre is olyan intervallumot használjunk, mint amit a tanító halmazban.

Időjárás-előrejelzés

A Prophet eszköztárának kipróbálására Budapest egy kerületének a hőmérsékleti adatait használtuk fel, mint erősen szezonális adatokat. Az adathalmazunk 1901. 01. 01-tól 2010. 12. 31-ig tartalmaz hőmérséklet adatokat napi bontásban. Az utolsó 2010-es évet vettük ki a tanító halmazból és használtuk fel az előrejelzés visszamérésére.

# Eredeti adathalmaz oszlopainak átnevezése
df = df.rename(columns={'#datum': 'ds', 'd_ta': 'y'})
data = df[['ds', 'y']]
# Dátum formátum megváltoztatása
training = data[data['ds']<'2010-01-01'] test = data[data['ds']>='2010-01-01']
# Modell létrehozásda és tanítása
m = Prophet(changepoint_prior_scale=0.5)
m.fit(training)
# Jövőbeli dátum intervallum létrehozása
future = m.make_future_dataframe(periods=365)
forecast = m.predict(future)
# Vizualizáció
plt.plot( forecast_2010['ds'], forecast_2010['yhat']
         ,forecast_2010['ds'], forecast_2010['yhat_lower']
         ,forecast_2010['ds'],forecast_2010['yhat_upper']
         ,forecast_2010['ds'],test_2010['y'] )
plt.show()

 

Időjárás 2010A fenti ábrán a 2010-es év valós időjárása piros vonallal látható. A Prophet által illesztett előrejelzés a kék vonal és a hozzá tartozó narancs és zöld színnel ábrázolt y_lower és y_upper, felső és alsó határérték.

 

Decemberre illesztett görbe:


forecast_december = forecast.tail(31)

test_december = test.tail(31)

plt.plot( forecast_december['ds'], forecast_december['yhat']

         ,forecast_december['ds'], forecast_december['yhat_lower']

         ,forecast_december['ds'],forecast_december['yhat_upper']

         ,forecast_december['ds'],test_december['y'] )

Időjárás 2010 december

Az decemberre vonatkozó előrejelzés megmutatta, hogy kisebb intervallumok kiemelése esetén sokkal nagyobb arányban esik a prediktált felső és alsó határértékeken is kívül a valós hőmérséklet. Mint láttuk, az éves előrejelzésnél lévő körülbelüli +/– 5 fokos felső és alsó határon belülre kerülnek az akkori valós hőmérsékleti adatok túlnyomó többsége.

Októberre illesztett görbe:


forecast_oct= forecast[forecast['ds']>='2010-10-01']

forecast_oct = forecast_oct[forecast_oct['ds']='2010-10-01']

test_oct = test_oct[test_oct['ds']<'2010-11-01']

plt.plot( forecast_oct['ds'], forecast_oct['yhat']

         ,forecast_oct['ds'], forecast_oct['yhat_lower']

         ,forecast_oct['ds'],forecast_oct['yhat_upper']

         ,forecast_oct['ds'],test_oct['y'] )

plt.show()

Időjárás 2010 október

Az októberi adatok vizsgálatakor látható, hogy egy hőmérsékletben kevésbé ingadozó hónap esetén meglehetőségen pontos előrejelzést kapunk a modelltől. Ebben az esetben például a prediktált és alsó határérték közé esik – kevés kivétellel – az összes valós hőmérsékleti érték.

Prophet a globális felmelegedésről

Érdekességképpen kipróbáltuk, milyen következtetést von le a jövő időjárásra vonatkozóan a Prophet. Megnéztük, milyen előrejelzést ad száz év hőmérsékletadatait figyelembe véve a 2039-es évre vonatkozóan.


future_forecast = forecast[forecast['ds']>='2039-01-01']

future_forecast.head()

future_forecast.tail()

test_2010_cut = test_2010[test_2010['ds']<='2010-12-24']

future_forecast.tail()

test_2010_cut.tail()

plt.plot( future_forecast['ds'], future_forecast['yhat']

         ,future_forecast['ds'],test_2010_cut['y'] )

plt.show()

Időjárás 2039 előrejelzés

Ebben az esetben a teljes adathalmazt felhasználtuk a tanításra  1901.01.01-től 2010.12.31-ig és a következő 30 évre illesztettünk egy görbét a Facebook Prophet segítségével. A kékkel látható a 2039-es évre prediktált görbe és sárgával az adathalmazunk utolsó 2010-es évének hőmérséklete. Alapozva az elmúlt 100 év hőmérsékleti trendjére, szinte az év minden napján jó pár fokkal magasabb hőmérséklet várható.

A Facebook Prophet alapvetően egy újabb nem-lineáris regresszióval dolgozó előrejelző eszköz, ami specifikus esetekben, leginkább a benne implementált paraméterezhetőségével tud hasznos segítséget adni.

via facebook.github.io/prophet/

 

Tekintsd meg a legfrissebb adatokkal kapcsolatos előrejelzéseinket:
https://datandroll.hu/2020/02/12/adatelemzes-trend-bizni-az-adatokban/

https://datandroll.hu/2020/01/29/2020-az-adatok-eve-lesz/

Nézz körbe a Big Data szolgáltatásaink között:

https://thebigdataplatform.hu/big-data-uzleti-megoldasok/

Ha érdekel a cégünk, csapatunk, esetleg csatlakoznál, látogass el a főoldalunkra:

https://united-consult.hu/