Magamról

Saját fotó
Főiskolai, majd egyetemi diplomamunkáimtól kezdve világ életemben, adatok, adatbázisok, adattárházak (leginkább Oracle) környékén mozogtam. Mostanság adattárházasként, adatbányászként élem napjaimat.

2013. május 20., hétfő

Data Science MapReduce-feladatok


Ígérem nem lesz rendszer a napi két blogposzt. :)

És hogy necsak, a vakvilágba, l'art pour l'art beszéljünk a Data Science-be bimbózó, sőt szárbaszőkő vidámságokról, a Python és Sql után könnyen adódik a MapReduce szépségeiben való elmerülés.

Arra nem vállalkoznék, hogy számszerűsítsem a 2004-es Google ernyője alól kikerült algoritmus jelentőségét, de hogy a világ egyik legjobb mókája vele dolgozni az biztos (és bizton mondhatom evvel nem vagyok egyedül). Hozzá talán egyedül az SQL-t tudnám hasonlítani, az bír ennyire élvezetes lenni még talán (leszámítva és ide nem értve az SQL-nyelvjárások nyűgjeinek kerülgetését).

Magyar anyag nincs oly sok fenn a neten, ez az alábbi frissebb és nagyon szimpatikus (25 diás prezentáció)
CAP, mapreduce, Hadoop

A feladatok Bill Howe(University Washington) feladataiból egy válogatás, ahogy egyébként a múltkori Pythonos és SQL feladatok is tőle származtak eredendően.

1.feladat: http://jsmapreduce.com/

Ez egy kiváló eszköz, hogy  nulla overheaddel, maximális élvezettel gyakoroljuk a MapReduce-t. Fizetni sem kell az Amazonas-nak egy centet sem, az csak egy további opció, ha addiktívvá váltunk az eszköz hatására. :)

Először is - minő meglepetés - telepíteni kell hozzá vagy egy Mozilla Firefox, vagy egy Google Chrome böngészőt, merthogy Internet Explorer alatt nem megy. Én nem fogadnék rá nagy pénzben, hogy valaha is elérhető lesz IE alatt is, azaz erre nem érdemes várni... :)

Másodszor kell regisztrálni, ha valaki például a Pythonos menüpontokat a maguk teljességében akarja élvezni. Első gondolkodtató kérdés: vajon a honlap miért sújtja regisztrációs átokkal a Python-t? ;)

Harmadszor, használati utasítás gyanánt, meg lehet nézni - egy szerintem borzalmas minőségű - közel 15 perces - természetesen angol nyelvű - videót a vonatkozó cucchoz. Én ezt ugrottam pár perc után, annyira elviselhetetlennek találtam, különben is eléggé intuitív az egész eszköz, nem kell hozzá semmilyen videó, szvsz.
Introduction to JSMapreduce

És akkor a feladat:
Módosítsuk a pókeranalízist (Sample 2 vagy Sample 4), hogy például a valóságban nemlétező négyes sorokat (4cardstraights) is kalkulálja. Azaz a figurákból (A,2,3,4,5,6,7,8,9,T,J,Q,K,A) tetszőleges négy egymás mellett legyen, bármilyen szín(treff,káró,kőr,pikk) eloszlással. Erősséget tekintve a 4-es sor nyilván gyengébb az 5-ös sornál, és persze kerülni kell, hogy a teljes sor "straight" beleszámolódjon bármelyik 4-es sorba.

Bónusz-kérdések:
- Melyik verziónak érdemes nekiesni? Javascript-esnek, vagy Python-osnak?
- Megfordítva: miért sokkal lassabb a Pythonos? Ennyivel lassabb kód futna esetében?

2.feladat: Klasszikus HelloWorld-jellegű szószámlálás  MapReduce-ban (teljes megoldással):

Feladat: számoljuk meg Python programmal, mely szavak hányszor szerepelnek a szövegekben!

Íme book.json file részlete, doc_id-text párokkal.
["milton-paradise.txt", "Book I Of Man ' s first disobedience"]
["edgeworth-parents.txt", "Near the ruins of the castle of Rossmore"]
["austen-emma.txt", "Emma Woodhouse , handsome , clever , and rich"]
["chesterton-ball.txt", "The flying ship of Professor Lucifer sang through the skies like"]
["bible-kjv.txt", "The Old Testament of the King James Bible The First Book of Moses"]
["shakespeare-caesar.txt", "Enter Flauius , Murellus , and certaine Commoners ouer the Stage"]
["melville-moby_dick.txt", "The pale Usher -- threadbare in coat , heart , body , and brain"]

Fog kelleni egy - feladatosztályt érintően nem változó - MapReduce.py, osztály-definicióval, ha szimulálni akarjuk a MapReduce működését egyszerű eszközökkel (megírandó programjaink mellé).
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
import json

class MapReduce:
    def __init__(self):
        self.intermediate = {}
        self.result = []

    def emit_intermediate(self, key, value):
        self.intermediate.setdefault(key, [])
        self.intermediate[key].append(value)

    def emit(self, value):
        self.result.append(value)

    def execute(self, data, mapper, reducer):
        for line in data:
            record = json.loads(line)
            mapper(record)

        for key in self.intermediate:
            reducer(key, self.intermediate[key])

        #jenc = json.JSONEncoder(encoding='latin-1')
        jenc = json.JSONEncoder()
        for item in self.result:
            print(jenc.encode(item))
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

Illetve kell egy wordcount.py, ami a feladatot megoldja:
Futtatás: python wordcount.py books.json
 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
import MapReduce
import sys

mr = MapReduce.MapReduce()

def mapper(record):
    key = record[0]
    value = record[1]
    words = value.split()
    for w in words:
      mr.emit_intermediate(w, 1)

def reducer(key, list_of_values):
    total = 0
    for v in list_of_values:
      total += v

    mr.emit((key, total))

if __name__ == '__main__':
  inputdata = open(sys.argv[1])
  mr.execute(inputdata, mapper, reducer)
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

3.feladat: Adott továbbra is a book.json bemeneti file.
Módosítsuk az előbbi szószámláló progit (inverted_index.py), úgy, hogy minden szó mellé listában irassuk ki mely (doc_id-val azonosított) szövegekben fordul elő az adott szó.
Kimeneti minta:
["all", ["milton-paradise.txt", "blake-poems.txt", "melville-moby_dick.txt"]]

4. feladat: Adott egy records.json bemeneti file, alábbi mintával.
Ez tartalmazza a rendeléseket, és a rendelések tételeit.
A második oszlop (mindkét rekordtípusnál) az order_id, utána még teszőlegesen sok attribútum lehet.
Írjuk át MapReduce-ra az alábbi SQL-lekérdezés: join.py
SELECT *
FROM Orders, LineItem
WHERE Orders.order_id = LineItem.order_id
["Orders", "1", "36901"...]
["LineItem", "1", "155190"...]

5.feladat: Adott egy friends.json bemeneti file, alábbi mintával.
Mindenki nyilatkozott kit tekint barátjának. Ebből következik, hogy a barátság nem kommutatív. Ha "A" barátjának érzi "B"-t, abból nem következik, hogy "B" barátja "A"-nak. Listázzuk ki MapReduce-szal az asszimmetrikus barátságokat: asymmetric_friendships.py
["Myriel", "Geborand"]
["Myriel", "Champtercier"]

6.feladat: Adott egy dna.json, génszekvencia-id illetve génszekvencia-string párokkal.
MapReduce segítségével töröljük minden génszekvenciából az utolsó 10 karaktert, majd deduplikáljuk az összes génszekvenciát (minden csonka génszekvenciából egy maradjon a kimenetre): unique_trims.py

7.feladat Adott egy matrix.json bemeneti-file, alábbi mintával.
Két ritka mátrix (a,b) valós, nem-nulla elemeit tartalmazza (sor,oszlop,érték)
MapReduce segítségével számoljuk ki a szorzat mátrixot: multiply.py
["a", 0, 0, 63]
["b", 0, 0, 61]

Mi a különbség a Data Miner("adatbányász") és a Data Scientist("adattudós") között?


v1.5 (utolsó módosítás: 2015.05.14

Létezik a címbeli kérdésre egzakt válasz? Kötve hiszem, de az biztos, hogy én nem tudom.
Mindenesetre blogposztot írni lehet róla azért, főleg ha egyre többet bukkan fel ez a "Data Science"-cucc, lépten-nyomon. ;)
Magam annyira régen végeztem az ELTE programtervező matematikusi szakán, hogy nemhogy a "Data Scientist", de még a "Data Miner" sem hangzott el a képzés alatt (1987-ben kezdtem az egyetemet)

Három megközelítés:

(1)
Egy amerikai eredetű slide egyike ez volt:
 - What are the abstractions of data science?
- “Data Jujitsu” + “Data Wrangling” + “Data Munging” = Translation: “We have no idea what this is all about”
Big Data Curricula at the UW eScience

Az én saját értelmezésem szerint:

Data Jujitsu: Az amikor nem a feladatot nyers konkréten azonnal felmerült formájában oldjuk meg, hanem találunk a feladatnak egy másik megfogalmazását, ami nagyjából ugyanazt az outputot adja, ami nekünk kell, csak sokkal kevesebb erőfeszítéssel. Röviden feladat-átfogalmazás. Az adatbányászatot leginkább ennek részének érzem.

Data Wrangling Általános véve olyan data-prepocessing adattranszformációs lépése egy iteratív folyamaton belül, ami a jobb felhasználást/modellezést segíti elő. Adattisztítás éppúgy része, mint a data mining feature extraction.

Data Munging Általános véve zajos adatok tisztábbá tétele, mind rekord, mind mező szinten. Jobb/tisztább inputon való modellezés esélyesebben ad értékesebb outputot.

(2)
Egy másik slide-on ez a Venn-diagram volt, három gombóccal:


(3)
Egy harmadik slide-on meg ez:
Empirical + Theoretical + Computational

Azt gondolom ezek mind érdekes észrevételek, de csak kapargatják a felszínt a kérdésünk megválaszolásának kísérletéhez.

Anno az én eredeti megközelítésem az volt, hogy az adatbányászatnak négy aspektusa van:
- Matematikai (statisztikával, mátrixokkal, mesterséges interlligenciával, etc.)
- Mérnöki/Műszaki (operációkutatással, kombinatorikus optimalizálással, tanuló algoritmusokkal, nagy tömegű értékes és értéktelen adatokkal etc)
- Informatikai (adatbázisokkal, korszerű programozási nyelvekkel, üzleti intelligenciával, etc)
- Közgazdászi (üzleti kommunkikációval, adatvizualizálással, tálalással, eladással, projekt-/pályázat-nyeréssel, üzleti aspektusokkal, (mikró-/makró-)ökonomiával, ökonometriával, stb.)

Ahogy jelenleg én ezt a kérdést látom - ebben a gyorsan változó világban - a Data Scientist felülről kompatibilisnek "van szánva" az adatbányásznak. A Data Scientist tudáskészletének valós részhalmazává válik az adatbányász tudáskészlete. Nem lesz olyan "skill", ami csak az adatbányászé lenne, a Data Scientisté nem, kérdés, hogy mi a helyzet a fordítottjával.

A tévedés jogának fenntartásával azt vélelmezem, hogy egy adatbányásznak nem feltétlen kell tudnia a párhuzamos programozást tudnia. Főleg Magyarországon (az ehhez szükséges "big data" datasetek hiányában például). Következésképpen a Hadoop és az infrastruktúrája, akárcsak a 2004-es MapReduce algoritmus részletei bőven hidegen hagyhatja az adatbányászt, tudhat dolgozni nélkülük.

Hasonlóan az adatbányásznak elég lehet a black-box cuccok alkalmazása (pl.: neurális háló), nem kell neki feltétlen megértenie a black box működését - maximum magyaráznia :). A Data Scientist meg esélyesen válhat addiktivvá, hogy a black box mélyére ásson, hogy kifehérítse azt. Tágabb kontextusban pedig az is lehet egy vízió, hogy egyre több Data Scientist számára válik egyre inkább napi gyakorlattá a kutatás - implementálás - (angol) szakmai cikk/tanulmány publikálás, ami (legalábbis itthon Magyarországon) eddig jellemzően az egyetemi/akadémiai szféra sajátja volt.

Ugyanígy egy adatbányásztól - jelenleg semmiképpen - nem elvárás (idő és komplexitás rendben) például (az alap Java-n felül) a Python, Ruby, Clojure, Scala, Haskell, Erlang programozási nyelvek effektív használata. Azt jelenleg nem tudom, hogy a Data Scientisttől én elvárnám-e, illetve a jövőben elvárás lesz-e, de sejtés szinten azt vélelmezem, hogy el kéne várni. Ahogy az egyetemen is sok száraz matekot tanultunk, amit aztán ugyan közvetlenül nem használtunk ki a való életben, de persze másképp azért kamatozott az, hogy ilyesmikkel is "vívtunk" (absztrahálás, látókör-bővülés, agyműködés-serkentés, stb.)

Vagy éppen adatperzisztenciánál elég lehet text-állományok, vagy relációs adattáblák olvasása, írása, miközben evvel párhuzamosan az eddig megszokott szemléletekkel gyökeresen szakító NoSql- vag gráf-adatbázisok világa is egyre inkább forrong napjainkban. A bonyolultabb struktúrálatlan adatokról már nem is beszélve....

Végül az is lehet egy vízválasztó szempont, hogy míg az adatbányász Amazon S3-ig is elmenően tudhat önjáró lenni, addig a Data Scientist-re esetleg még további csoportmunka és/vagy folyamatvezérlésből adódó követelmények is várnak

Ahogy én érzékelem az elmúlt nagyjából 10 (magyarországi) év alapján: az adatbányász, eddig bőven megélt, ha a fent vázolt négy aspektusból legalább az egyikben erős volt, egy Data Scientist-től lehet, hogy elvárás lesz egyformán erősnek lennie mind a négyben, hogy egyre mélyebben értse az egyes aspektusokat egy egyre szélesebben vett interdiszciplináris tudományágban.

A végére maradt a legizgalmasabb aspektus. Van-e különbség Data Miner és Data Scientist között, ha nevezetesen ugyanazt a személyt takarja mindkettő :)

Azt gondolom igen és perdöntő különbség lehet. Még pedig a domain vonatkozásában.

A domain-függetlenség világa az adatbányászversenyek világa, ahol egyetlen pillanatban kell a legjobbat produkálni, az adatok mögött lévő tartalom firtatása nélkül.

Az üzleti világban
- Nem elég egyetlen pillanatban gondolkodni, hiszen ez az éhenhalás útja lenne (a prediktálási stabilitásról már nem is beszélve).
- Nagyon kell tudni érteni az adatok mögötti világhoz.
- Olyan kérdéseket kell tudni megfogalmazni, kicsikarni, ami tízből kilencszer nem jut eszébe az embernek, sőt még a megrendelőnek/szakértőnek sem.
- Úgy kell tálalni (vizualizálni, prezentálni, etc.), hogy ne aludjanak el rajta a hallgatók.
- Olyan üzleti vitákat kell megvívni, ahol nincs jogorvoslati út, nincs bíróság, hogy igazságot tegyen.

Az én nagy kérdésem a jövőt illetően, hogy az egyre komplexebbé váló Data Scientist hogyan fog tudni érdemben kommunikálni a rajta kívül eső világgal.

Update-1: Ahogy olvasom vissza a blogposztot felmerült bennem a kérdés, mennyiben helyes angol "Data Scientist"-et írni a magyar "adatbányász"-szal párbaállítva.  De nem egységesítek. Talán ez is mutatja, hogy míg az "adatbányász" egyre közkeletűbb(en érthető) fogalom, addig a Data Scientist még úgy újabb, hogy magyar megfelelője nem igazán alakult ki.

Update-2: Találtam egy érdekes ábrát. Annyira nem nagy merészség az adatbányászatot a BI részeként tekinteni. Ha ez jogos, akkor máris érdekes kérdés, hogy a BI hogyan viszonyul a Data Science-hez.

Steve Miller: Data Science - Part 2 (2011-05-03)


2013. május 12., vasárnap

Data Science-s SQL és Python gondolkodtató feladatok


1.
Kollégáim meg hajdanvolt szép emlékű SQL-levlistások körében tudott dolog volt, hogy mindig szerettem és gyűjtöttem a frappáns (demó, állásinterjús) SQL-feladatokat, amiknek ismérvei:
- Könnyű és rövid legyen elmondani
- Ne legyen benne félreértési lehetőség (egyértelműség mindenek elött)
- Rövid ám elegáns legyen a megoldás
- Annyira azért ne legyen triviális.
- stb.

Sikerült beleszaladnom egy nagyon szép SQL-feladatba.

- Adott két - egyszerűség kedvéért - 10.000 x 10.000 négyzetes, ritka, nem-negatív mátrix.
Mivel ritkák a mátrixok így csak a nullától különböző elemeket tároljuk (sor,oszlop,érték)

- Írjunk egy - akár Sqlite-ban is futni tudó - SQL-t, amelyik tetszőleges általunk választott elemét megadja a szorzat-mátrixnak.


2. És egy komplementer nem-SQL (hanem Python-) feladat is, ha az előbbi túl gyorsan meglenne :)

- Szedjük le a Twitter forgalmának (egy részét)!

- Ignoráljuk a nem angol nyelvű üzeneteket!

- Ignoráljuk az USÁ-n kívül feladott üzeneteket!

- Rendeljük hozzá az üzenetek szavaihoz egy-egy érzelmi koefficienst (szótár alapján)

- Kreáljunk a szótárban nem létező egyéb szavakra - lehetőség szerint minél intelligensebben - érzelmi koefficienst (ha a szöveg környezetben inkább pozitív szavak vannak, akkor nagyobbat, ha inkább negatívak, akkor kisebbet)

- Határozzuk meg , hogy a Twitter-üzeneteket melyik USA-államban adták fel (ugye a mobiltelefon meghatároz egy geolokációs kódot, abból kell valahogy kitalálni az USA-államot).

- Mindezt azért, hogy végül megmondhassuk, hogy melyik a legboldogabb USA-állam, a lekapott Twitter-adatforgalom pillanatában (vagyis, ahol összesítés után a legtöbb pozitív érzelmű twitter-üzenetet adták fel és egyúttal legkevesebb negatívat)