GMOT
Nieuws:
 
*
Welkom, Gast. Alsjeblieft inloggen of registreren. 19 Mei 2019, 15:22:34


Login met gebruikersnaam, wachtwoord en sessielengte


Pagina's: [1]
  Print  
Advertenties


lucb1e
Approaching infinity
********

Berichten: 7.268



Bekijk profiel WWW
« Gepost op: 25 Oktober 2015, 23:59:07 »

TL;DR: ik zou naar het "Show me the code!" en "Links" gedeelte kijken.

Prerequisites

Als je hiermee wil werken is het handig om iets van scripten te kennen. Deze post is volledig Python, maar als je PHP of C++ een beetje kent dan moet het wel lukken (met ietsie meer moeite).

Achtergrond

Op school krijgen we een nieuw vak dat gaat over machine learning, en ik hoor ook steeds meer over het onderwerp. Het was er nog nooit van gekomen om er echt iets mee te doen dus dit was een mooie kans. Beetje jammer dat de opdracht van school was "nou ga deze Udacity (MOOC) course maar doen en hier is een eindopdracht en succes", maar aan de andere kant, het zijn tenminste niet de gebruikelijke shitty slides Smiley

Dus ik dacht dat de leraren lui waren, maar ik had de cursus nog niet gezien. Ook zij weten wel van aanpakken: ze gebruiken een library genaamd scikit-learn (sklearn) en behandelen een beetje theorie achter verschillende algoritmen. Wel nuttig en handig om te weten, het geeft je een beter idee waar je naar moet kijken dan wanneer je maar wat gaat googlen op machine learning in het algemeen, maar nog altijd lekker lui.

Bij deze wil ik met GMOT ook in 10 minuten delen hoe machine learning werkt en hoe je het praktisch toe kan passen. (Lange post misschien, maar als je een beetje doorleest is het waarschijnlijk minder dan 5 minuten Wink)

Show me the code!

De TL;DR van het hele vak en de hele cursus is dus eigenlijk dit:

[Pastebin wordt geladen zodra het bericht gepost wordt]


Ik zie heel veel nuttige toepassingen om me heen, maar om er zelf iets mee te doen is een beetje zo van "als ik deze data had dan...". Ik heb echter het idee dat bij een bedrijf (wanneer je werkt of stage loopt) dat wel mogelijk is: dan doen klanten vanalles met hun software (app/website/whatever), en kun je dus wel data verzamelen en gebruiken. Of er wordt budget gemaakt om iets te verzamelen.

Ik zou jullie dus aanmoedigen om ernaar te kijken. Als ik had geweten dat het zo makkelijk was zou ik het veel eerder gedaan hebben.

Veel posts over "computers slimme dingen laten doen" gaan over neurale netwerken, iets wat erg cool klinkt en blijkbaar (in een simpele vorm) in 11 regels python past, maar wat toch nog best lastig te begrijpen is. Ik denk dat NN's (neurale netwerken) ook onder ML (machine learning) vallen, maar de ML die ik hier bedoel zijn eigenlijk de algoritmes die in scikit-learn zitten. Die doe je allemaal fitten met dezelfde datastructuur en predictions haal je op dezelfde manier eruit.

Scikit-learn installeren en gebruiken

Je kan sklearn gewoon apt-getten: apt-get install python-sklearn (in ieder geval in Debian testing/stretch). Helaas wel Python 2.7-only, dus het kan zijn dat je je programma's moet runnen met het python2.7-commando in plaats van je default python interpreter.

Een gotcha waar ik nog best naar heb zitten zoeken is naar wat het dataformaat nou precies is. In de voorbeelden zie je bijvoorbeeld dit staan:
X = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
Y = np.array([1, 1, 1, 2, 2, 2])
clf.fit(X, Y)


Daar schieten we dus niks mee op. Ik pak er even een praktisch voorbeeld bij: stel we bouwen een zelfrijdende auto die, net als ik, er ook wel van houdt om met de regels te spelen. Om nou te weten hoe hard ik zou rijden heb je context nodig: hoe hard mag ik hier? Ben ik hier ooit eerder geflitst[1]? Hoe stijl is de weg? (Omhoog zou ik geen 200km/u rijden, dat kost teveel benzine.) Wat is de kwaliteit van de weg? (Ofwel "rijden we in belgie of niet?") Deze dingen noem je allemaal features. Vervolgens kijk je naar je features en plak je er een label op, in dit geval hoe hard ik zou rijden. Je dataset ziet er dan ongeveer zo uit:

snelheidslimiet, al eerder geflitst, helling, wegkwaliteit (1=goed), mijn snelheid
100, nee, nee, 1, 128
120, nee, nee, 1, 132
100, ja, nee, 1, 101
130, nee, omlaag, 0.7, 145


Wat scikit-learn vervolgens wil hebben is dit:

X = [
  [100, 0, 0, 1],
  [120, 0, 0, 1],
  [100, 1, 0, 1],
  [130, 0, -1, 0.7]
]
Y = [128, 132, 101, 145]
clf.fit(X, Y)


En het deel van "test set" en "training set" is gewoon splitsen van dezelfde data. Sklearn heeft zelfs hier functies voor, maar toen ik dit schreef wist ik dat nog niet:
trainamount = int(math.ceil(len(X) * .80)) # Gebruik 80% voor training; 20% voor testing.
traindata = X[:trainamount]
trainsolutions = Y[:trainamount]
testdata  = X[trainamount:]
testsolutions = Y[trainamount:]


En als je fancy wil doen met een 'unsupervised learning' algoritme dan laat je fijn de Y weg.

Toen ik dit eenmaal doorhad was eigenlijk alles super simpel Tongue

Links met meer informatie

- De Udacity[2] cursus waar ik het over had is deze: https://www.udacity.com/course/intro-to-machine-learning--ud120

- Alle video's zijn hier te downloaden, dan hoef je geen Udacity account te maken: http://udadownload.lucb1e.com (Er zit ook nog een stuk van een andere cursus in die we voor school moesten doen, maar dat is veel minder dan het machine learning deel.)

- Mijn favoriete ML algoritme zijn decision trees. Documentatie met voorbeelden: http://scikit-learn.org/stable/modules/generated/sklearn.tree.DecisionTreeClassifier.html

- Datasets: https://www.kaggle.com

Voor de Udacity cursus, als je de video's download, VLC protips:

Open alle video's in een map in VLC (Ctrl+A in de map, dan openen met VLC). Dat maakt een playlist waar je makkelijk doorheen kan. Vervolgens deze sneltoetsen:

Spatie pauzeren
] 10 procentpunten sneller afspelen
[ 10 procentpunten langzamer afspelen
= op normale snelheid afspelen
Shift + pijltje Rechts/Links 3 seconden voor/achteruit spoelen
N volgende bestand
P vorige bestand
F toggle fullscreen

Ik vond het zelf altijd stom om dingen op sneller te zetten (mensen zeggen dat 1.25× net zo goed werkt voor hun), als het sneller kon dan zouden ze het toch wel sneller doen? Ik dacht dat je dan minder meekrijgt. Maar in de cursus leggen ze sommige dingen wel heel saai uit, en daar skip ik met 1.7× ook rustig langs. Met deze sneltoetsen kun je daar heel makkelijk mee spelen.



[1] Ja, hindsight bias, maar ik zei dat de auto op mij moest lijken dus dan moet die dat ook doen Smiley

[2] Ben geen docent en zeg niet "auda city" tegen Udacity. Het wordt als "joedessity" uitgesproken. 40-plussers kunnen echt geen Engels... [/ergernis]



De code die ik in Pastebin had gezet, mocht Pastebin down zijn ofzo:
Spoiler:
Code: (python)
from sklearn import tree

traindata, trainanswers, testdata, testanswers = fancyGetDataFunctie()

# clf staat voor classifier ("classificeerder," of "in-hokjesplaatser")
clf = tree.DecisionTreeClassifier()
# wat je normaal "een algoritme trainen" noemt, wordt
# hier "een algoritme fitten" genoemd... right
clf.fit(traindata, trainsolutions)

# Performance check? Accuraatheid testen? Nee, "score" is de
# functie die checkt hoe goed het nu werkt
print clf.score(testdata, testanswers)

# Doe een voorspelling
print clf.predict(testdata[0])
« Laatste verandering: 26 Oktober 2015, 00:08:40 door lucb1e » Gelogd

Goudewup
Pretty addicted
*******

Berichten: 4.529


Viva la resistance!


Bekijk profiel
« Antwoord #1 Gepost op: 26 Oktober 2015, 01:57:08 »

leuk.
Gelogd


McWolli
Approaching infinity
********

Berichten: 6.892


Obnoxious Owl


Bekijk profiel WWW
« Antwoord #2 Gepost op: 26 Oktober 2015, 02:03:05 »

Waar is Kaasje als je hem nodig hebt... Of Shaddow for that matter
Gelogd

Trying to find myself

"No, it doesn’t. Well, it sort of works—but not really."

ericlegomeer
King of the hill
******

Berichten: 1.663


http://xkcd.com/386/


Bekijk profiel
« Antwoord #3 Gepost op: 26 Oktober 2015, 09:48:56 »

Waar is Kaasje als je hem nodig hebt... Of Shaddow for that matter
Zij zullen waarschijnlijk ook denken:
leuk.
Het lijkt me juist meer een topic voor mensen die nog nooit iets met machine learning hebben gedaan c:

Luc schetst dat het heel makkelijk en eenvoudig is, wat het voor eenvoudige datasets ook zeker is. Echter, voor 'ingewikkeldere'/'real-world' datasets daarentegen zul je bijvoorbeeld ook rekening moeten houden met overfitten op je trainingsset. Je kunt een model maken welke exact het juiste antwoord geeft op iedere trainingsdata input. Zo'n model deployen op de testdata kan een grote teleurstelling geven. Die waarden zijn (voor ingewikkeldere datasets) natuurlijk nét ietsjes anders en je model zal daar volledig op kunnen breken als het verkeerde verbanden heeft zitten leren.

Aangezien je met real-world toepassingen vaak geen werkelijke testdata krijgt, maar gewoon alle data die er is, is het heel verleidelijk een exact voorspellend model te maken en dus te overfitten. Echter, zodra een bedrijf zo'n model vervolgens werkelijk gaat gebruiken, zul je merken dat alle waarden net anders zijn (doordat je bijvoorbeeld met mensen te maken hebt) en dan zijn ze niet blij met je c: Wanneer je genoeg trainingsdata hebt, kun je ervoor kiezen om cross-validation toe te passen en je trainingsdata dus op te splitsen in verschillende sets. Zo maak je je eigen trainingsdata en testdata, binnen de ontvangen data. Het nadeel is dat het model dus minder data heeft om op de trainen, maar het voordeel dat hij niet overfit. Hierin moet je natuurlijk een balans zien te vinden Wink

Een andere 'pro-tip' is om niet direct over alle data een decisiontree te gaan genereren en hopen dat dat op magische wijze geniaal is. Ofja, dat mag je wel doen, maar dan kom je er hoogstwaarschijnlijk (in ingewikkeldere situaties) achter dat het niet zo goed werkt als je had gehoopt. Je kunt een domain expert erbij halen (of het zelf worden) en de dataset pre-processen. Je kunt bijvoorbeeld analyseren welke attributen de meeste informatie bevatten en welke attributen totaal irrelevant zijn voor wat je wilt voorspellen. Ook kun je kijken of je nieuwe attributen kunt samenstellen om het model een handje te helpen, bijvoorbeeld in het voorbeeld van Luc een attribuut 'snelheidsovertreding' toevoegen als 'mijn snelheid - snelheidslimiet' of zelfs een 'snelheidsovertredingratio' als '(mijn snelheid - snelheidslimiet) / snelheidslimit'. Je kunt namelijk (als domain expert) beargumenteren dat een overtreding van 10km/h niet heel ernstig is op een weg waar je 130km/h mag (ratio 0.077), maar een overtreding van 10km/h op een weg waar je 30km/h mag (ratio 0.333) wel. Dus waarom zou je het model niet een handje helpen en hem zo'n waarde kant-en-klaar aanleveren Smiley

Zo zijn er nog veel meer mogelijkheden en pitfalls, maar dat zal allemaal vast ook worden verteld in de gelinkte video's. Ik vond alleen dat deze twee punten wel even aangestipt moesten worden hier c:
Gelogd



@-wout
Administrator
Approaching infinity
*********

Berichten: 9.429



Bekijk profiel WWW
« Antwoord #4 Gepost op: 26 Oktober 2015, 10:15:18 »

Waarom gaat het over machine learning maar is het woord Prolog nog niet in het topic voorgekomen Sad?
Gelogd

kaas1
Infinity
*********

Berichten: 19.940


LeesMij.txt


Bekijk profiel
« Antwoord #5 Gepost op: 26 Oktober 2015, 12:38:03 »

Hype. Maar welk algoritme gebruik je nou in de OP? Tongue
Gelogd


lucb1e
Approaching infinity
********

Berichten: 7.268



Bekijk profiel WWW
« Antwoord #6 Gepost op: 26 Oktober 2015, 14:05:50 »

@Eric: thanks voor de toevoeging Smiley


@@-wout: als jij denkt dat Prolog iets toe te voegen heeft, schrijf vooral een stukje erover. Ik ben voornamelijk bezig geweest met scikit-learn, wat een python module is. Op school vinden de docenten python ook erg belangrijk dus dat is waar ik me op gefocussed heb. Heb wel ooit een paar uur naar Prolog gekeken maar weet er lang niet genoeg van om iets nuttigs te doen of te snappen wanneer ik het zou willen gebruiken.


@kaas1: is dit een test om te zien of ik nou wel weet wat die library achter de schermen doet? Tongue
Ik weet dat het een decision tree bouwt met een algoritme dat ongeveer probeert splitsingen te maken op waarden die zo veel mogelijk verschil maken. Het genereert een tree zoals deze:

Hoe dat algoritme precies heet of in code precies werkt zou ik na moeten zoeken. Toch krijg ik met deze library (zelfs zonder parameter tuning) op veel datasets een hele hoge accuracy, en voor nu is dat waar het me om gaat. Misschien dat ik er later dieper in duik, maar dat moet iedereen voor zich doen en kan ik toch niet allemaal uit gaan leggen in een post als deze.
Gelogd

kaas1
Infinity
*********

Berichten: 19.940


LeesMij.txt


Bekijk profiel
« Antwoord #7 Gepost op: 26 Oktober 2015, 15:05:49 »

@kaas1: is dit een test om te zien of ik nou wel weet wat die library achter de schermen doet? Tongue
XD nee, maar wat je daadwerkelijk doet is imo boeiender dan of je mooi python kan. Ziet er wel geinig uit iig.
Gelogd



Advertenties
Pagina's: [1]
  Print  

 
Ga naar:  

Powered by SMF 1.1.21 | SMF © 2006-2011, Simple Machines | Smartphoneversie bekijken

Dilber MC Theme by HarzeM