# Intro On va bosser sur la Big data, Python, Hadoop, Spark Objectif principal : améliorer les performances. ## Examen final - 1e partie : examen écrit (1h, relatif aux slides) - 2e partie : code (plus simple que ce qu'on a fait en TP) sur jupyter notebook (2h) # Big Data ## Réviser Big data Les données sont représentées comme un réseau : connexions entre points. On peut avoir une liste de clients, il n'y a pas de relations entre eux. Mais on peut les foutre sur un graphique et tirer de l'information, par exemple à partir de l'espace entre les points. On a donc un réseau à comprendre et dont on doit tirer de l'information. Exemple de Google PageRank : chaque node est un website, et il y a des liens entre les sites > réseau. Un site avec beaucoup de liens vers lui sera plus important qu'un avec moins. ## 1.2 - Modélisation des réseaux $$ C_T = ( V, E) $$ Où V est un jeu de noeuds et E un jeu de relations On modélise les noeuds et les relations comme sur le PDF Ça peut être dirigé ou non : dirigé on a un sens dans le réseau, c'est le cas du PageRank. On peut aussi avoir du poids sur les réseaux (graphe pondéré) Réseau est un terme technique, graph un terme pratique pour représenter la même chose On réprésente V = {a, b, c, d, e} et E = {ab, bd, bc, cd} d la distribution des degrès des noeuds. d : {1,2, 2,1,2} . d(b) = somme du poids total des relations $d^+(b) =$ nombre de relations sortantes de b (=2) $d^-(b) =$ nombre de relations entrantes vers b (=1) Composants connectés : Si on peut aller de a vers b, alors a et b appartiennent au même composant connecté. Composants fortement connectés (SCC) : depuis n'importe quel point on peut aller vers un autre. Toutes les directions existent. Entre deux SCC, un noeud/SCC vers lequel un SCC de référence se dirige est un out-compoment. À l'inverse, si il se dirige vers le SCC de référence c'est un in-component À partir des graphes on génère des matrices (voir pdf), on peut compter le nombre de connexions entre les points et tout et tout. Dans un truc non dirigé, M[a,b] = M[b,a]. Si on a une relation M(a,b) = 1, sinon 0. Dans un graph pondéré, M[a,b] = le poids de la relation. coût : n² Liste des relations : n*degré moyen (a peu égal à log(n)) Si on a pas le réseau (donc la totalité des données), on va générer un réseau artificel, similaire au réseau réel. Trois méthodes communes qu'on va aborder rapidement. On connait le nombre de noeuds (1000), pas toutes les relations. On peut étalir le réseau à partir de la probabilité d'avoir une relation entre un noeud et un autre. p.e, chaque nœud a environ 20 connexion. $$ degre_a \approx p*n = \frac{20}{1000}*1000 = 20 $$ P : probabilité $$ P(ab\ is \ an \ edge) \approx Bern(p) \\ P(degre\ of\ a) \approx Binom(p*n) \approx poisson\ law $$ Le fait que la plupart des noeuds aient un degrés proche de p*n n'est pas correct dans la réalité. Ces réseaux ne sont donc pas corrects dans la réalité, mais utiles. ### Réseaux sans échelle n : nombre de noeuds $\lambda$ : power parameter ($2 \leqslant \lambda \leqslant 3$) $$ Nb\ edge = \sum_adegre(a) \\ = \sum i*\frac{n(\lambda-1)}{\lambda^{i+1}} $$ ### Réseaux petit monde Les noeuds ne s'atteingnant pas directement, mais sont à une très faible distance les uns des autres (genre moins de 6 étapes pour aller de a vers b) ## Analyse des modèles : Google page Rank Problématique du spam de mot clef contournée grace au système de PageRank qui donne de l'importance à la page, indépendamment du nombre du mots-clefs. L'importance du site et donc la probabilité qu'on veuille aller sur celui là se calcule à partir d'une matrice. De cette matrice, on divise toutes les valeurs 1 de sorte à ce que chaque colonne fasse un total de 1. | | a | b | c | d | e | | ---- | ---- | ---- | ---- | ---- | ---- | | a | 0 | 1 | 1 | 0 | 0 | | b | 0 | 0 | 0 | 1 | 0 | | c | 1 | 1 | 0 | 0 | 0 | | d | 0 | 0 | 0 | 0 | 1 | | e | 0 | 0 | 0 | 1 | 0 | devient | | a | b | c | d | e | | ---- | ---- | ------------- | ---- | ------------- | ---- | | a | 0 | $\frac{1}{2}$ | 1 | 0 | 0 | | b | 0 | 0 | 0 | $\frac{1}{2}$ | 0 | | c | 1 | $\frac{1}{2}$ | 0 | 0 | 0 | | d | 0 | 0 | 0 | 0 | 1 | | e | 0 | 0 | 0 | $\frac{1}{2}$ | 0 | on obtient une matrice conditionnelle. Chaque ligne est 1/5, on fait la somme en fractions de la ligne et on a la matrice. La somme des éléments de la matrice donne 1. Une affaire de V ensuite. $V_0$ est la probabilité d'accéder à un point depuis n'importe quel point de départ. ## TP: Python pour Data Science Installer Anaconda Copier la database soccer et la metttre dans le dossier "python" finir TP 0 et 1 ---- *26/11/18* À faire : 1. Les Pandas notebook week1 2. Puis ls TP week 2. Pour chaque exercice : - Example = comment faire l'exo - exercice = à faire : remplir les champs - hint = résultat 3. Une fois fini : envoyer à tien-nam.le@ens-lyon.fr --- *20/12/18* ## Memory latency Pbatique en big data : le volume de données augmente. Avant on gérer ça en ajoutant juste de a mémoire (RAM). Mais maintennat on fait plutôt des clusters avec plusieurs ordis pour de l'analyse parallèle de données. Différents ordis avec différentes mémoires qui aprtagent la même data. DONC : qu'est ce qui rend le calcul lent ? Pourquoi on a besoin de plusieurs ordis ? ### CPU computation Dux grandes parties dans un ordi : - CPU - Stokage l'ordi lit A et B selon leur emplacment sur le disque, et calcule par exmple C à partir de A et B, puis inscrit C sur le disuqE. Le temps de lecture et d'écrtirue est plus long que celui de calcul. ### Memory hierarchy Le CPU contient plusieurs core avec chacun une section register. Chaque core est relié à des blocs de cache (L1, L2) et un bloc de cache global (L3). L3 st relié à la mémoire principalke (RAM) qui est reliée au disque dur. ### Questions - Performing CPU operation has the lowest latency - False - A computation just done is stocked in the register ### Trade off Cache est petit et rapide, mémoire principale grande et lente. ### Cache le CPU récupère blocs stockées en cache pour calculer. Si bloc n'est pas en cache, on vire un bloc ancien plus utile, et hop on le remplace par celui nécessité. La performance du cache vaut : $perf = \frac {cache\ hits}{cache\ miss}$ miss : recherche bloc qui n'est pas en cache Pour avoir plus de cache hits (besoin d'un bloc déjà en cache) , on garde en cache données souvent utilisées. quand on overwrite des données en cache on écrase tjrs celle la moins utilisée du cache : **temporal locality** Il copie un bloc entier (64kb), même si seuleent 10kb sont utilisés dedans, car temps pour bouger 10kb ou 64kb sont très proches. Exemples de temporal locality : on calcul à partir d'un élément W fixe et d'un élément x qui change tout le temps. si w rentre dans le cache, on le réutilise tout le temps : c'est plus rapide. Si trop grand pour cache : c'est bcp plus lent. Exmple de spacial locality : on veut calculer la somme d'opérations sur x pour x de 1 à n : chaque nouveau x est proche de ses voisins : on gagne plus de temps que si il était stocké aléatoirement. ### Questions 1 - On a pas besoin de garder A car trop grand, et juste besoin de garder sum dans la mémoire. Par contre on itère avec des valeurs qui s suivent : il est plus efficace de faire un spatial locality. (Au pire répondre "both" est acceptable) 2 - 64 bytes (the block size) 3 - la dernière réponse ### Conclusion Pourquoi est-ce important de g&rer la memory latency en big data ? clock rate semble plafonner à 3gh Les ordis plus rapides sont très chers, Il vuat mieux vaec pleins d'ordis pas chers en lcluster, chacun ayant une petit partie du calcul. Donc : **comment diviser la data** ? ## Clustering Data Combien de clusters faut-il ? Le moins possible mais avec la plus grande similitude entre les données possible par rapport à la courbe d'efficacité : quand elle commence à devenir similaire d'un cluster à l’autre, on a notre nombre idéal. Il faut essayer pour trouver le nombre idéal de clusters. ### Types de techniqus de clustering on peut tous les déclarer en même temps "flat techniques" ou bien répéter des clusters basés sur clusters prédents : "hierarchical techniques" ### K-means clustering example technique très simple étape 0 : choisir K ( genre K = 3) étape 1 : choisir 3 entiers au hasard. ils sont placés dans un sorte de graphique, et par rapport à un point (un vrai) on repère celui qui est le plus proche. étape 2 : on détermine une zone par point et tous les points de cette zone sont raccordés à ce point. Ensuite on bouge le point de référence à la position optimal : proche du plus de points possible Ensuite chaque cluster fait les calculs autour de là ou il est. L'avantage c'est que c'est simple et efficace. Par contre il faut définir la distance, et c'est très sensible aux "outlier" : points éloignés des clusters. ---- *25/01/19* # Distributed and cloud computing ## Distributed computing Les problèmes posés sont par exemple un SUM SQL sur une base contenant trop d'entrées pour être comptées une à une par le système. Ou bien en ML : la régression linéaire, ou trouver le voisin le plus proche Objectif : comment aller plus vite ? ### Hadoop Créé par Google en 2004. Ça distribue le stockage, mais aussi le calcul et a une bonne tolérance aux erreurs. Utilise le map reduce et le HDFS ### Map reduce Fonctionnement : les map sont des "escalves", qui récupère l'input d'un disque dur, font le calcul niveau 1 renvoient aux maîtres, et les reduce sont les maîtres qui font le calcul niveau 2, et renvoient le résultat sur un autre disque dur. Si par exemple on a 30 produits, on veut calculer la somme (exemple 1), on va diviser les 30 en plusieurs parties envoyées au mappers, qui vont chacun effectuer le calcul sur leur set de data. Ils renvoient ensuite tous leur résultat au même reducer qui va additionner le tout et renvoyer le résultat. Si on a $k$ mappers ça permet d'aller $k$ fois plus vite. Un autre exemple : trouver le plus proche voisin k on a deux mappers, le 1 sont les points verts et le 2 les marrons. avec un point d'entrée "query point" il faut trouver les 3 points les plus proches. le mapper 1 va envoyer les 3 points verts les plus proches et le 2 les 3 points marrons aux reducers, ce ne seront pas les mêmes. Le reducer renvoie les 3 points les plus proches parmi les 6 récupérés ### HDFS Hadoop Distributed File system. Son objectif c'est la tolérance aux pannes. On a plusieurs PC avec chacun un disque. Certains sont des mappers, d'autres des reducers. Ce sont des data nodes. On va avoir à côté un name node, à qui chaque data node envoie ses métadonnées : il garde une trace de tout ce qui se passe. si un noeud tombe, le name node le réplique ailleurs. - Si il y a un prolème de réseau, ce n'est pas résolu. - Si un data node a un problème de disque, le name node peut recover la data - Si la taille des blocs diffère ce n'st pas un problème - Si tout les data nodes ne sont pas utilisés, ce n'est pas un problème. - Si on a une panne de disque sur le name node, c'est un plus gros problème. Comment récupérer la data si un nœud tombe ? Chaque bloc de données est répliqué 3 fois et envoyé sur des nœuds aléatoires. Si un nœud tombe, il sait quels blocs sont tombés, mais il sait aussi qu'il peut les retrouver ailleurs, et le nœud qui prendra le relai récupérera les blocs depuis les nœuds qui ont une version répliquée. Si le name node tombe, tout est perdu, on le duplique donc pour que le second prenne le relai si le premier tombe. ### Avantages de Hadoop - Gratuit et open source - architecture distribuée : les données sont stockées dans plusieurs noeuds différents - tolérance au pannes (3 répliques de chaque bloc) - Viable : réparation automatique en cas de panne - Haute disponibilité - Modulable : on peut ajouter facilement de nouveaux ordis et données ### Inconvénients de Hadoop Efficace dans les algorithmes qui n'effectuent qu'un calcul dans une direction. Mais si ils utilisent la data de façon répétéé (descente de gradient, k-means, deep learning, graph algorithm (shortest path)), il se révèle inefficace. En effet, en hadoop à la sorite des reducers la data est stockée en disque et non en RAM avant d'être réutilisée pour les calculs. C'est de la redondance ! L'étape la plus coûteuse en temps est l'écriture et la lecture sur le disque, non le calcul. C'est pour ça que dans ces cas on va se pencher plutôt vers Spark. ## Spark Au lieu d'écriture la data sur le disque dur à chaque fois, il la stocke en mémoire vive. Spark créé en 2012, est opensource, et bien plus rapide que Hadoop. Mais il a deux problèmes : - La RAM, c'est cher, bien plus que la mémoire dure. - La RAM est plus efficace mais mois *stable* : moins tolérante aux pannes. si l'ordinateur tombe, la data est perdue. Le challenge est de rendre Spark tolérant aux pannes. Dupliquer la data sur les nœuds est très cher puisque la RAM est chère. Garder une trace de chaque changement est aussi cher car il y en a beaucoup. La solution : **Resilient Distributed Datasets**. Ils gardent une trace des changement sur chaque bloc (plusieurs éléments) Un exemple : la régression linéaire. En conclusion : on utilise Hadoop si le calcul se fait dans un seul sens et qu'on a peu de budget, et Spark quand le calcul est itératif et qu'on priorise la vitesse. ## Cloud computing Face au problème de la big data, deux solution, on a v la première : architecture distribuée, maintenant on va voir le cloud computing, deuxième solution. C'est un peu similaire à l'architecture distribuée, mais pas complètement. Les problématiques des entreprises sont de bien estimer les besoins, et implique de sacrées infrastructures. La solution idéale st de ne pas avoir à anticiper ces besoins et leurs couts, d'avoir de l'adaptabilité, de ne pas se préoccuper de la sécurité ... L'infra cloud apporte tout ça : les services sont accessibles à distance. Nombreux avantages et l'inconvénient de devoir trouver un fournisseur de confiance. AWS est le plus représenté ajd à 50% ### Technologies Deux technos : la virtualisation et le high broadband Internet La virtualisation permet de partager une large ressource entre plusieurs clients. ### Types Trois types de clouds : - public. Le plus populaire, B to C. Ex : Dropbox. Partagé par énormément de clients. Peu cher, pas de maintenance, haute disponibilité, extrêmement modulable. - privé. L'accès est exclusif et non partagé. - hybride. les données et apps peuvent passer du privé au public pour plus de flexibilité. ### Niveau de services cloud On en a trois : PaaS, Platform as a Service. Fournit des ressource,s des platformes, sur lesquelles les développeurs peuvent construire des applications. IaaS, Infrastructure as a Service. Fournit serveur, réseeau, stockage, et la maintenance est à charge du client. SaaS, Software as a Service. Fournit le logiciel final --- *11/03/19* # Deep learning ## Neural networks Les réseaux de neurone c'est juste du machine learning utilisant un deep neural network. Ça utilise du fully connected convolutionnal layers On traville avec des dimensions de couches (100, 200, 50...) On spécifie donc input_dim (talile) et activation qui est une fonction.I fauten retenir ReLu et Leaky ReLu. dans l'activation on voit softmax et relusoftmax if x>= 1, relu si x est au moins 1node. Keras est simple, si c'est pas suffisant on bascule sur Tensorflow, qui est plus compliqué. Pour l'instant, Keras est le mieux pour nous. Pooling c'est juste un truc pour réduire lma taille.C'est pour ça qu'on utilise les convolutional # ML pipeline on a vu que SKlearn est bien pour les petits modèles (techniques) : - linear - tree - ... Le deep learning et les réseaux de neurones sont plus orientés pour la recherche en ML On va voir aujourd'hui le gradient boosting : avec LightGBM and XGB (they are similar) La clé est de créer de nouvelles et utiles features. Sklearn : basic, simple, weak, "work not well" deep learning : best for images, sounds, videos (maybe for text) => tuning parameters and architecture Gradient boosting : utilisé en finance et autres domaines de la vie réelle. La data est tabulaire (nombre, categorical, ...). Le deep learning ne fonctionne pas bien sur ce type de données. Le tree-based gradient boosting est le meilleur pour ce type de données MAIS, le tree-based a besoin de bonne features. DONC le feature engineering est la chose la plus importante Un exmple très simple de feature engineering qu'on peut trouver dnas le TP : - combiner plusieurs features pour en obtenir une nouvelle. - modifier les features Dans titnaic, on va jouer avec le nombre de siblings et le nombre de parents enfants pour obtenir une taille de famille et obtenir une feature "alone/not alone". Aussi, on va modifier le nom pour mettre le titre (la civilité de la personne) Passer une data qualitative en quantitative. Par exemple : nom d'une ville. - On peut passer par exemple en one-hot (OO, O1, 1...) mais c'est pas élégant et y a trop de features : si y a K catégories il faudra K nouvelles features - Ou bien en fréquence d’apparition : on met le nombre de fois que la ville apparaît dans la liste (paris 5, lyon 4, grenoble 4, marseille 2...) ## Pourquoi le feature engineering ? Avant de considérer cette question, on se penche sur le tree-based learning. C'est l'arbre décisionnel, tel qu'on l'a vu avec GN. L'arbre de décision marche assez bien avec les données qualitatives. On a pas besoin de mettre les features à l'échelle. Le tree-based gradient boosting n'a pas grand chose de plus à savoir : on construit un arbre et encore et encore, et on améliore le modèle en les combinant. C'est le bagging (empaquetage) : on construit plusieurs arbres **indépendants** puis on calcule la moyenne / la majority voting. En soi, le bagging est proche du random forest la différence est que : - random forest construit les arbres sur un sous-ensmble du total des features (et un sous-ensemble des data points) - bagging construit les arbres sur la totalité des features (et tous les data points ?) Boosting est proche du bagging aussi. cla fonctionn ainsi : - On construit un arbre 1 - Puis un arbre 2 basé sur les erreurs de l'arbre 1 - Puis un 3 sur les erreurs du 2 - Etc - on obtient une moyenne pondérée (weighted average) Pour la moyenne, boosting est mieux que bagging. MAIS boosting peut être overfitté Booting et bagging peuvent être utilisés pour n'importe quelle technique (pas forcément un arbre). Par exemple linear, logistic regression... L'état de l'art du tree-based gradient boosting - Libriaries : LightGBM (2016), XGB (2015) - LightGBM est plus rapide et de façon globale, meilleure. - Les deux sont dispo sur Anacondada - Docs LightGBM : lightgbm.readthedoc.io // XGB xgboos.readthedoc.io - Usages - Simple: - no architecture - just tuning parameters - 3e choix possible : Catboost. ## Final step Étape finale : - blending - stacking On entraine sur plein de moèdles différents, et on obtient plein de prédictions différentes ( $\hat y_1, \hat y_2, ...,\hat y_t$) ### Blending C'est la prédiction finale, obtenue en faisant une moyenne pondérée : $\hat y_{final} = weigthed\ average(\hat y_1, \hat y_2, ...,\hat y_t)$ Techniques des branlots et autres flemmards ### Stacking On utilise toutes les prédictions y comme $t$ features pour entraîner un modèle final et **simple**, pour retourner une prédiction finale $\hat y_{final} = model(\hat y_1, \hat y_2, ...,\hat y_t)$ Technique la plus utilisée. Les gens utilisent toujours le stacking. # NLP and time series NLP : Natural Language Processing RNN : recurrent neural network LSTM : Long Short Term Memory GRU : Grate Recurrent Unit ## Pourquoi RNN Un phrase = une séquence de données. Un élément dépend de l'élément prcédent. Un texte est donc une phrase mais un time series aussi. - **Fully connected NN** : ne prend pas en compte la dépendance : c'st nul - **Convolutionnal NN** : capture d'une structure locale (fenêtre de convolution parmi l'ensemble)). ainsi, pour un texte, la fenêtre sera une partie de ce texte. Mais c'est insuffisant ! - Ça suppose que toutes les relations locales sont les même tout le long du texte - Ne capture jamais rien de plus grand que la taille de la fenêtre DONC pas top - **Recurrent NN** : est donc encore mieux ## Types de problèmes ### Many to one classification à partir d'une phrase ex : phrase qui donne une review Il faut en deviner la note sur 5. On met plein de node en input, on fait passer dans le NN et on en ressort une note. ### one to many génération de texte, génération de musique en entrée on a un node aléatoire, ça passe dans le NN et il en ressort plein de nodes ### many to many Language translation Là on aura plein de nodes en entrée (ex: en anglais), passage dans le NN et plein de nodes en sortie (mais en français) ## ? Y a donc une entré, le réseau, et une sortie Prenons en exemple une phrase de 9 mots : The restaurant that I went to yesterday was good En many to one , chaque mot va passer dans le NN, et sur le dernier il fait une normal classification with softmax et obtien la review. ssez proche du convolutional. La différence entre RNN et CNN et FCN, c'est que l'état précédent du NN est l'input de l'état courant. Dans les autres, il y a seulement un calcul du gradient puis une update du NN, il ne prend pas le précédent comme input. Ainsi, dans un many to many, il va prendre "the" et dire "ok c'est "le", pis passer à "restaurant" avec"le" en entrée, etc... ## Keras Layer : RNN (...) like conv2D(, Dens() ## LSTM and GRU Le problème du RNN c'est que, dans notre exemple, quand la phrase atteint une certaine longueur, il commence à oublier les parties précédentes. ça amène aux concepts de gradient vanishing et gradient exploding (mais je sais pas pourquoi) Pour voir les mots importants, il compte la fréquence d'apparition, dans le texte mais surtout en général ! Apparaître plus souvent dans un texte n'est pas forcément un signe d'impotance (ex: "the") LSTM et GRU sont assez similaires, LSTM a tendance a etre légèrement mieux de manière général. Les deux ont une ligne de mémoire (the gate) qui persiste au cours du texte pour garder en mémoire ce qui est important. Le gate est donc présent dans chaque NN à travers duquel on fout un input. ### Différences Pas hyper importantr mais toujours ça à savoir : - LSTM : 3 gates par node - GRU 2 gate par node ### Comment les utiliser ? Avec Keras, LSTM() et GRU(). Il est bon d'essayer les deux mais en général les gens préfèrent LSTM Il y a beaucoup d'informations à garder ! Par exemple en génération de texte, la grammaire : si "restaurant" est au singulier il faudrait mettre "bon" au singulier, mais l'accorder si "restaurant" est au pluriel # Bibliography Pour en savoir plus sur comment faire du feature engineering : *Feature engineering* by Alice Zheng, O'Reilly 2018