I Decision Tree o Alberi Decisionali sono uno strumento di apprendimento supervisionato, essi risolvono principalmente tematiche di classificazione o regressione. Sono molto facili da interpretare e da applicare, non basandosi su un modello lineare sono capaci di apprendere anche associazioni non lineari. Funzionano sia su dati numerici che categorici.

I Decision Tree si categorizzano rispetto alla variabile in output come:

  • Categorical Decision Tree
  • Continuous Decision Tree

Nella figura seguente si vede un esempio di Decision Tree sul dataset di Iris.

  • Il nodo principale si chiama Root Node o Radice
  • Quando un nodo porta a una divisione in rami nei sottonodi l’operazione si chiama Splitting
  • Quando un nodo si divide in più sottonodi senza arrivare a quello finale, i sottonodi si chiamano Decision Node o Nodo di decisione
  • Una intera sezione dell’albero si chiama Branch o Ramo

Vantaggi dei Decision Tree

  • Sono facili da capire: Siccome essi offrono una rappresentazione grafica molto facile da interpretare, i Decision Tree sono anche interpretabili dalla gente non propria del campo informatico.
  • Utili nell’analisi del dataset: Siccome sono un algoritmo molto veloce e semplice da applicare, è utile applicarlo per vedere le relazioni fra le variabili

Svantaggi dei Decision Tree

  • Sono proni all’overfitting: È il problema più frequente con i Decision Tree, il metodo migliore per risolverlo è settare dei vincoli o fare Pruning dei rami

Divisione in rami

Il criterio secondo il quale l’algoritmo divide in più rami i vari nodi dell’albero è critico per la precisione deloritmo. Esso poi è differente nel caso si scelga un ambito di regressione o un ambito di classificazione. In base ai criteri disponibili abbiamo i seguenti approcci:

  • Gini Index (o indice Gini): L’indice Gini dice calcola se gli elementi considerati fanno parte della stessa popolazione. Se la popolazione è pura essi devono essere della stessa classe e la probabilità associata a questo evento è 1 (cioè non contiene elementi di classe diverse)
  • Chi-Square (o Chi quadrato): L’algoritmo Chi Square si preoccupa di trovare una significanza statistica fra i sotto nodi e il nodo padre. Questa la misuriamo sommando il quadrato delle differenze standardizzate fra i valori osservati e i valori che ci aspettiamo
  • Information Gain: L’algoritmo Information Gain si basa sul principio di entropia di un insieme di dati, e usa questo per calcolare la divisione in rami.
  • Riduzione della varianza: Questo algoritmo utilizza la formula della varianza per decidere il migliore modo per dividere i rami, minore è la varianza maggiore è la probabilità che quell’attributo venga usato per dividere i rami

Overfitting

Il problema principale dei Decision Tree è dovuto all’overfitting. Essi arriveranno a fare tante osservazioni, fino ad arrivare a fare una foglia per ogni osservazione e raggiungere quindi il 100% di precisione. Per ridurre questo problema ci sono i seguenti approcci:

  • Si settano dei vincoli sul numero massimo di foglie o sul numero massimo di nodi finali o sul numero massimo di attributi su cui creare nuove foglie. Allo stesso modo anche sul numero minimo di foglie e sul numero minimo di elementi su cui creare nuove foglie
  • Si fa il Pruning dei rami, cioè si eliminano i rami possibili, attraverso un approccio greedy. Nella pratica si sceglie la strada che attualmente sembra la migliore e si prosegue con quella finchè non se ne trovano di migliori

Quando usiamo un Decision Tree?

Dovremmo usare un Decision Tree quando c’è una relazione complessa fra i vari attributi che è difficile da spiegare, in questo modo l’approccio non lineare del Decision Tree batte l’approccio lineare della Regressione Lineare ad Esempio. Inoltre un Decision Tree è molto utile se dobbiamo spiegare come si effettua una classificazione ai non addetti ai lavori.


Nel prossimo articolo includerò degli esempi in Python con la libreria Scikit per mostrare una implementazione dei Decision Tree su un dataset di Regioni città e Attrazioni.

Il Gradient Descent o Discesa del Gradiente è uno dei più popolari algoritmi di ottimizzazione.

La discesa del gradiente è un algoritmo molto usato nelle reti neurali in quanto è alla base dell’algoritmo di backpropagation, attualmente sono tantissime le librerie che implementano questo algoritmo.

L’idea del Gradiente Descent è quello di minimizzare una funzione obiettivo  J(θ) formata da N parametri  θ, aggiornando il valore dei parametri in base alla differenza con il gradiente negativo di  J(θ) rispetto al parametro considerato. L’aggiornamento del parametro viene aggiornato poi passo passo, secondo un dato valore η, chiamato learning rate.

In parole povere, scendiamo una funzioneJ(θ) passo passo, finchè questa non ci porta verso un valore di massimo o di minimo e noi ci fermiamo a questo.

I modi con cui questo algoritmo si può eseguire sono:

  • Batch Gradient Descent
  • Stochastic Gradient Descent
  • Mini Batch Gradient Descent

Batch Gradient Descent

La Batch Gradient Descent (BGD), o Discesa del Gradiente a Batch, computa la discesa del gradiente per la funzione costo su tutto il Training set:

Dove θ è la funzione costo per l’intero Training set. Con questo metodo dobbiamo calcolare la discesa del gradiente una sola volta, siccome usiamo tutto il nostro Training Set, tuttavia essa può essere molto lenta se il dataset è grande e impossibile da fare se il dataset non entra in memoria.

 

Stochastic Gradient Descent

Lo Stochastic Gradient Descent (SGD), o Discesa del Gradiente Stocastica, computa la discesa del gradiente per ogni elemento del Training set e aggiorna il suo valore volta per volta.

A differenza del Batch Gradient Descent, cioè la discesa del gradiente utilizzando una quantità di dati molto alta, questa tecnica utilizza un solo valore per volta:

Dove θ è la funzione costo per l’intero Training set.

 

Mini Batch Gradient Descent

La Mini Batch Gradiente Descente (MBGD), o Discesa del Gradiente a MiniBatch, è una via di mezzo fra la SGD e la BGD in quanto effettua degli aggiornamenti ai parametri della funzione con dei minibatch, e non con l’intero dataset o con valori singoli, e in questo modo porta a una più veloce convergenza .

 

Questi algoritmi per trovare l’ottimo delle funzioni sono disponibili nella libreria Python Scikit, nel prossimo articolo implementerò un classificatore che utilizza il metodo SGD per classificare delle cifre scritte a mano.

Mining of Massive Datasets è un libro scritto da Jure LeskovecAnand RajaramanJeff Ullman basato sul corso di studi tenuto a Stanford riguardante il Data Mining.

Ogni lezione è poi corredata sul web da dei video presenti su Youtube che spiegano le tematiche dei capitoli, la qualità del corso è molto alta e sono facili da seguire.

Capitoli del libro

Il libro è diviso nei seguenti Capitoli:

  • Data Mining: Il capitolo è una introduzione al libro, parla degli aspetti dei Big Data, del perchè si fa data mining, delle sfide e dei problemi.
  • Map-Reduce and the new Software Stack: Questo capitolo parla di Map-Reduce, del perchè è stato inventato questo approccio, quanto si riesce ad essere più performanti, del perchè è stato inventato in Google e dei problemi che va a risolvere. Si parla inoltre dei sistemi Opensource che implementano MapReduce fra cui Hadoop.
  • Finding Similar Items: Questo capitolo parla di come misurare i dati, cioè di come decidere delle distanze fra i dati e permettere di capire quanto due dati generici possano essere uguali. Tratta delle distanze classiche fra numeri e stringhe e dell’hashing per trovare i dati similin.
  • Mining Data Streams: Questo capitolo tratta degli Stream e come fare Sampling, contare elementi distinti, applicare il Bloom Filter, stimare i Momenti, stimare il numero di elementi in una finestra temporale.
  • Link Analysis: Questo capitolo parla di PageRank, dell’implementazione e il modello su cui si basa, il rischio di avere attacchi spam che possano deviare il risultato di PageRank delle pagine e i metodi per evitare questo tipo di attacchi.
  • Frequent Itemsets: Questo capitolo parla degli insiemi di oggetti frequenti e delle regole di associazione, spiega inoltre l’algoritmo A-Priori e l’algoritmo PCY con ulteriori spunti.
  • Clustering: Questo capitolo tratta il clustering, sia gerarchico che non, esplorando gli algoritmi KMeans, BFR, Cure
  • Advertising on the Web: Questo capitolo tratta del problema della pubblicità sul web, cioè come fare linking fra annunci e oggetti e migliore offerta sulla pubblicità in quel momento.
  • Recommendation Systems: Questo capitolo parla dei sistemi di raccomandazione esponendo quale è il problema della raccomandazione e come si tenta di risolverlo tramite un approccio semantico basato sui tag o tramite un approccio sulle relazioni fra gli oggetti basato sull’algebra lineare
  • Mining Social Network Graphs: Questo capitolo parla delle connessioni nei social network e nelle community applicando algoritmi e rappresentazioni.
  • Dimensionality Reduction: Questo capitolo parla della riduzione delle dimensioni in un dataset e di come applicare la decomposizione SVD e la decomposizione CUR al nostro dataset.
  • Large-Scale Machine Learning: Questo capitolo spiega i concetti di Training Set, Test Set, allenamento in batch o online, e algoritmi classici di machine learning come il Perceptron, le reti neurali e il Nearest-Neighbor

Perchè dovrei leggerlo?

Questo libro esplora le basi del data mining e del machine learning, fornendo le nozioni per argomento via via più complessi. E’ di per sé un libro teorico universitario, non si troverà codice, ma solo pseudo codice e ottime spiegazioni. Il libro inoltre non si perde in teoria inutile, ma va dritto al punto fornendo però il contesto adatto. Ogni algoritmo trattato nel libro può essere poi trovato implementato facilmente online da altri programmatori.

Link

Il corso video si può trovare su youtube:
https://www.youtube.com/channel/UC_Oao2FYkLAUlUVkBfze4jg/videos 

Il libro e le slide invece sono disponibili gratuitamente qui nella versione 2:
http://www.mmds.org/

Nel caso vogliate acquistare invece il libro è possibile comprarlo su amazon al link:

Mining of Massive Datasets

La Filter Bubble (o camera di Eco) di Facebook è la bolla di informazioni che gli algoritmi usati da Facebook decidono di farci vedere. Gli algoritmi di Facebook si basano sull’idea che noi utenti dobbiamo rimanere ingaggiati dalle informazioni basate sui nostri gusti mostrandoci post di pagine e amici, ma il risultato è diverso, vedremo informazioni basate sì sui nostri gusti, sui nostri amici e sulle pagine che seguiamo, ma ignorando le cose e le idee che non fanno parte della nostra sfera.
Inoltre non sapendo come funziona perfettamente l’algoritmo di Facebook per mostrare i contenuti, ma conoscendo quello che i tecnici decidono di dirci possiamo sapere in base a cosa è organizzato in modo approssimativo.

Questa immagine mostra come Facebook decide di farci vedere i post nel News Feed sotto forma di equazione.

La è l’interesse che ha l’utente corrente per il creatore del post.
La P è la performance del post con gli altri utenti
La C è le performance dei post passati dell’utente rispetto gli altri utenti.
La T è il tipo di post che l’utente corrente preferisce
La R è quanto sia nuovo il post.

Unendo questi fattori riusciamo a capire approsimativamente come viene formata la Filter Bubble in cui ci troviamo. Il problema poi aumenta quando pensiamo che non siamo il 100% del nostro tempo su Facebook, ma solo in alcuni momenti della giornata, in cui quindi escono solamente alcuni tipi di argomenti anzichè nuovi e opposti ai nostri gusti.

In tutto questo Facebook tratta le pagine in modo non uguale. Le pagine Facebook vogliono ingaggiare nuovi utenti, tuttavia esse non verranno tratte tutte allo stesso modo, l’utente vede le “Top Stories” di Facebook, cosicchè se una pagina vuole mostrare i propri post sopra gli altri è obbligata a pagare in pubblicità e da tutto questo Facebook ne trae profitto.

Il progetto https://facebook.tracking.exposed si propone di studiare questo fenomeno e di collezionare i dati della propria timeline di Facebook tramite una estensione, di salvarli e analizzarli dopo in locale.
La visione del progetto è di aumentare la trasparenza dietro gli algoritmi di personalizzazione cosicché gli utenti possano avere piu’ coscienza rispetto le proprie scelte e ha come obiettivo di aiutare i ricercatori a capire come gli attuali meccanismi di filtro funzionino e come gli algoritmi di personalizzazione debbano essere modificati per evitare effetti sociali pericolosi.

fbe

L’estensione del progetto è la sonda che viene installata nel nostro browser e invia i dati al backend del sito. L’estensione prende solo i dati pubblici e non i dati privati, il backend fa parsing dei dati ed essi ci vengono mostrati poi a noi in formato csv o in formato metadato estratto.

Un esempio del dato estratto è questo:

Schermata del 2017-09-13 20-25-10

Questi dati e metadati sono disponibili sia come API sia come CSV sia consultabili via interfaccia Web. Il progetto è completamente opensource e disponibile su github.

I nostri dati quindi possono essere estratti ed elaborati localmente per la nostra ricerca o per il nostro divertimento. Ho installato l’estensione su Chrome e ho seguito il semplice tutorial per attivarla, ho aspettato quindi qualche giorno per raccogliere i dati.
Ho scaricato il file CSV della mia Timeline di Facebook nei giorni scorsi e l’ho analizzato per vedere quanti amici hanno messo il partecipo a un evento ed è stato mostrato sulla mia Timeline di Facebook.

Quello che voglio dimostrare è che il mio grafico potrebbe dimostrare che durante la settimana, in prossimità del weekend il numero di notizie relative a gente che partecipa a eventi aumenta.

Non resta altro che collezionare altri dati e cercare di capire se questa ipotesi è vera.

In questo articolo spiegherò come creare degli oggetti Clusterizzati in Python usando la libreria SciPy.
SciPy mette a disposizione per noi un sacco di metodi per il Clustering, noi utilizzeremo quelli che abbiamo visto nell’articolo precedente.

Il seguente file IPython fa vedere perfettamente la procedura con un metodo di collegamento fra i cluster di tipo singolo basato sulla distanza euclidea.

Il file ha i commenti che indicano ogni singola operazione avvenuta.

In questo articolo esporrò lo pseudo codice dell’algoritmo A-Priori e una versione funzionante in Go.

L’algoritmo A-Priori si può riassumere nel seguente modo:

Ammettiamo di avere questo Dataset

Transazioni Cestino
1 {“Mela”,”Lampone”,”Ananas”}
2 {“Mela”,”Kiwi”,”Ananas”}
3 {“Lampone”,”Ananas”}
4 {“Banana”,”Kiwi”,”Ananas”}
5 {“Kiwi”}
6 {“Mela”,”Kiwi”}

Primo passaggio di Apriori

Creiamo un insieme contenente tutti i nostri elementi singoli presi dal Dataset e creiamo una mappa contenete la frequenza dei nostri oggetti

Set = {“Mela”,”Kiwi”,”Ananas”,”Lampone”,”Banana”}
Frequency Set = {“Mela”: 3, “Kiwi”,4 “Ananas”: 4, “Lampone”: 1, “Banana”: 1}

Ammettiamo di avere settato un valore di supporto parti a 0.2, eliminiamo ora tutti gli elementi che nel Frequency Set non hanno supporto pari a 0.2. Otteniamo quindi:

Set = {“Mela”,”Kiwi”,”Ananas”,”Lampone”}
Frequency Set = {“Mela”: 3, “Kiwi”,4 “Ananas”: 4}

Secondo passaggio di A-Priori

Creiamo i nuovi insieme di candidati dal Set precedente a 2 a 2, cioè
Set = {“Mela-Kiwi”,”Mela-Ananas”,”Kiwi-Ananas”}

Questo è il nostro nuovo set di candidati che sottoporremo alla regola del supporto.

Terzo passaggio di A-Priori

Verifichiamo se il set di candidati ha nuovi elementi frequenti:
Set = {“Mela-Kiwi”,”Mela-Ananas”,”Kiwi-Ananas”}
Frequency Set = {“Mela-Kiwi”: 2 ,”Mela-Ananas”: 2,”Kiwi-Ananas”:2}

Quarto passaggio di A-Priori

Creiamo i nuovi set di candidati dal Set precedente a 3 a 3, cioè
Set = {“Mela-Kiwi-Ananas”}

Quinto passaggio di A-Priori:

Set = {“Mela-Kiwi-Ananas”}
Frequency Set = {“Mela-Kiwi-Ananas”: 1}

L’insieme di elementi piu’ frequente generato da A-Priori è “Mela-Kiwi-Ananas”, e ogni sotto insieme generato da questo è a sua volta il più frequente.

Si deduce da questo processo quindi il seguente algoritmo:

Il pattern con cui ci muoviamo è quindi questo:
Schermata del 2017-08-22 19-28-54

Prima filtriamo i dati e poi costruiamo i dati successivi finchè non otteniamo il nostro risultato finale.

Ho scritto un codice in Go che ci permette di applicare A-Priori come specificato dal nostro algoritmo.

Limitazioni di A-Priori

  • È molto esoso dal punto di vista della computazione. Seppure riducendo il numero di candidati da considerare, il numero di questi è sempre molto grande quando il numero di elementi nei cestini della gente è alto o quando il valore limite di supporto è basso.
  • Associazioni False. Riducendo il valore limite di supporto per notare alcuni tipi di associazioni, può succede che ci siano delle associazioni non giuste e quindi false. Per ridurre questo problema occorre filtrare prima il Dataset o verificare il valore di supporto e confidenza in un Test Set separato.

Conclusioni

A-Priori si dimostra essere un algoritmo molto interessate per studiare le associazioni all’interno di un Dataset con transazioni. Nonostante abbia delle limitazioni ci sono stati degli algoritmi che lo hanno migliorato come ad esempio l’algoritmo PCY o l’algoritmo Multistage.

L’algoritmo A-Priori ha un semplice obiettivo, trovare oggetti comprati assieme dentro dei carrelli, cioè trovare le regole di associazione degli elementi all’interno di un insieme di dati.

Il nome A-Priori deriva da come l’algoritmo opera, cioè senza avere nessuna conoscenza effettiva dei dati, ma lavorando sull’intuizione delle associazioni fra gli elementi.

Quando un cliente compra in un supermercato ha di solito una lista delle cose che vuole comprare. Ogni cliente ha bisogni diversi, dalla casalinga al lavoratore single, ma dietro questi clienti ci sono pattern di oggetti comprati spesso assieme. Scoprire questi pattern è molto utile in quanto permette di fare promozioni questi oggetti quando sono comprati assieme.

Un problema che tratta le regole di associazione di elementi si basa su un Dataset formato in questo modo:

Transazioni Cestino
1 {“Mela”,”Lampone”,”Ananas”}
2 {“Mela”,”Kiwi”,”Ananas”}
3 {“Lampone”,”Ananas”}
4 {“Banana”,”Kiwi”,”Ananas”}
5 {“Kiwi”}
6 {“Mela”,”Kiwi”}

Abbiamo cioè delle transazioni con carrelli di frutta comprati assieme, dobbiamo trovare quindi quando un elemento è stato comprato assieme ad un altro.
L’algoritmo utilizza un approccio bottom-up, parte cioè dai singoli elementi per arrivare poi a creare insiemi di oggetti.

L’effettività dell’algoritmo A-Priori si basa sul fatto che l’insieme degli oggetti  frequenti derivato dall’insieme di tutti gli oggetti è monotono.

Per monotono si intende questo:

Se per il nostro Dataset, l’insieme di elementi {“A”,”B”,”C”} è il più frequente (cioè l’insieme di elementi che compare più spesso), allora i sottoinsiemi di questo (cioè {“A”,”B”},{“B”,”C”},{“A”,”C”},{“A”},{“B”},{“C”}) saranno a loro volta fra i più frequenti.

Trovando cioè la transizione più lunga più frequente, sappiamo automaticamente che tutti i sottoinsieme derivati da questa sono frequenti!

Un altro vantaggio dell’algoritmo A-Priori è che riduce la memoria necessaria a individuare gli insiemi di oggetti associati. Senza l’algoritmo A-Priori dovremmo enumerare tutti i gli insiemi possibili di oggetti a 2 a 2, a 3 a 3, a 4 a 4 e trovare poi i più frequenti nel nostro Dataset.

Le regole associative dei nostri dati si basano sugli attributi che legano i valori delle transazioni. Le regole associative sono nella forma A=>B,  che si legge come: Le transazioni in cui compare A compare anche B.

Le regole associative sono soddisfatte quando superano due valori statistici: Il supporto e la confidenza.

Per supporto intendo la percentuale di transazioni che contengono sia A che B sul totale. Per confidenza invece intendo la percentuale percentuale di transazioni che contengono sia A che B sul numero di transazioni che contengono A.

Nel nostro caso precedente se prendiamo il dataset della frutta troviamo che:

Supporto(Mela,Kiwi) = 2/6
Confidenza(Mela,Kiwi) = 2/2

Abbiamo cosi’ notato che la confidenza che Mela e Kiwi siano comprate assieme è molto alta mentre il numero valore di supporto è basso.

Formalmente quindi l’algoritmo A-Priori si basa sull’estrarre regole di associazione in un dato Dataset con un supporto superiore al minimo stabilito e/o una confidenza superiore alla minima stabilita.

Le regole che soddisfano questi dati sono dette Regole di associazione forte.

Nel prossimo articolo illustrerò lo pseudo codice e il codice per l’algoritmo A-Priori che utilizza come metrica il supporto.