The document summarizes Joel Lord's presentation on machine learning given at the Web à Québec conference on April 4, 2017. The presentation covered topics including artificial intelligence vs machine learning, big data and deep learning, basic machine learning algorithms like naive Bayes classification and sentiment analysis, and genetic algorithms. Live code demos were included to illustrate naive Bayes classification and sentiment analysis.
4. @joel__lord
#WAQ17
Agenda
• Intelligence articifielle vs Apprentissage automatisé
• Big Data et apprentissage profond
• Les algo de base
• Naïve Bayes Classifier
• Sentiment Analysis
• Genetic Algorithm
• Le tout parsemé de démos
7. @joel__lord
#WAQ17
L'intelligence artificielle (IA) est
l'intelligence fournie par les machines. En
informatique, le domaine de la recherche
sur l'IA se définit comme l'étude des
«agents intelligents»: tout dispositif qui
perçoit son environnement et prend des
mesures qui maximisent ses chances de
succès à un but.
22. Big Data et apprentissage
profond
ENCORE UN PEU DE THÉORIE
23. @joel__lord
#WAQ17
Big Data
QU’EST-CE QUE C’EST?
• Croissance
exponentielle des
données digitales
• Trop complexe à traiter
de façon traditionnelle
• Principalement utilisée
pour de la prédiction
ou analyse des
comportements des
utilisateurs
24. @joel__lord
#WAQ17
Apprentissage profonD (Deep learning)
QU’EST-CE QUE C’EST
• Utilise des réseaux neuronaux pour traiter les données
• Idéal pour des classsificateurs complexes
• Un moyen de traiter le big data
27. @joel__lord
#WAQ17
Apprentissage supervisé
QU’EST-CE QUE C’EST
• Requiert une rétroaction
• Débute avec aucune connaissance et augmente sa compréhension
• Inutile lorsque les données sont de mauvaise qualité
• Cas pratiques
• Classification
28. @joel__lord
#WAQ17
Apprentissage non-supervisé
CONTRAIRE DE SUPERVISÉ?
• Besoin d’aucun feedback
• Pratique lorsqu’il n’y a pas de bonne ou mauvais réponse
• Aide à trouver des patterns ou structures de données
• Cas pratiques
• “Vous pourriez aussi être intéressé par…”
• Grouper des clients selon leur comportement
30. @joel__lord
#WAQ17
Classification naïve bayésienne
DÉFINITION
• Algorithme supervisé
• Un simple moyen de classifier et identifier l’information
var classifier = new Classifier();
classifier.classify("J'adore le Javascript", POSITIVE);
classifier.classify('WebStorm est génial', POSITIVE);
classifier.classify('Non, Javascript est mauvais', NEGATIVE);
classifier.classify("Je n'aime pas le brocoli", NEGATIVE);
console.log(classifier.categorize("Javascript est génial"));
// "positive"
console.log(classifier.categorize("J'aime WebStorm"));
// undefined
32. @joel__lord
#WAQ17
Classification naïve bayésienne
DÉFINITION DE LA STRUCTURE
var Classifier = function() {
this.dictionaries = {};
};
Classifier.prototype.classify = function(text, group) {
};
Classifier.prototype.categorize = function(text) {
};
33. @joel__lord
#WAQ17
Classification naïve bayésienne
CRÉATION DE LA CLASSIFICATION
Classifier.prototype.classify = function(text, group) {
var words = text.split(" ");
this.dictionaries[group] ? "" : this.dictionaries[group] = {};
var self = this;
words.map((w) => {
if (self.dictionaries[group][w]) {
self.dictionaries[group][w]++;
} else {
self.dictionaries[group][w] = 1;
}
});
};
34. @joel__lord
#WAQ17
Classification naïve bayésienne
ET LE RESTE…
Classifier.prototype.categorize = function(text) {
var self = this;
var probabilities = {};
var groups = [];
var finals = {};
//Find the groups
for (var k in this.dictionaries) {groups.push(k);}
var sums = {};
var probs = {};
//Loop through the groups to calculate the sums of found text
for (var j = 0; j < groups.length; j++) {
if (!sums[text]) sums[text] = 0;
if (!this.dictionaries[groups[j]][text]) this.dictionaries[groups[j]][text] = 0;
sums[text] += this.dictionaries[groups[j]][text];
probs[groups[j]] = (this.dictionaries[groups[j]][text]) ? this.dictionaries[groups[j]][text] : 0;
}
// Perform calculations
for (var j = 0; j < groups.length; j++) {
(!probabilities[text]) ? probabilities[text] = {} : "";
(!probs[groups[j]]) ? probabilities[text][groups[j]] = 0 : probabilities[text][groups[j]] =
probs[groups[j]]/sums[text];
}
//Average out the probabilities
for (var j = 0; j < groups.length; j++) {
if (!finals[groups[j]]) finals[groups[j]] = [];
finals[groups[j]].push(probabilities[text][groups[j]]);
}
for (var i = 0; i < groups.length; i++) {
finals[groups[i]] = average(finals[groups[i]]);
}
//Find the largest probability
var highestGroup = "";
var highestValue = 0;
for (var group in finals) {
if (finals[group] > highestValue) {
highestGroup = group;
highestValue = finals[group];
}
}
return highestGroup;
};
37. @joel__lord
#WAQ17
Classification naïve bayésienne
CATÉGORISATION
Classifier.prototype.categorize = function(text) {
…
//Loop through the groups to calculate the sums of found text
for (var j = 0; j < groups.length; j++) {
if (!sums[text]) sums[text] = 0;
if (!this.dictionaries[groups[j]][text]) this.dictionaries[groups[j]][text]
= 0;
sums[text] += this.dictionaries[groups[j]][text];
probs[groups[j]] = (this.dictionaries[groups[j]][text]) ?
this.dictionaries[groups[j]][text] : 0;
}};
41. @joel__lord
#WAQ17
Classification naïve bayésienne
SOMMAIRE
Classifier.prototype.categorize = function(text) {
var self = this;
var probabilities = {};
var groups = [];
var finals = {};
//Find the groups
for (var k in this.dictionaries) {groups.push(k);}
var sums = {};
var probs = {};
//Loop through the groups to calculate the sums of found text
for (var j = 0; j < groups.length; j++) {
if (!sums[text]) sums[text] = 0;
if (!this.dictionaries[groups[j]][text]) this.dictionaries[groups[j]][text] = 0;
sums[text] += this.dictionaries[groups[j]][text];
probs[groups[j]] = (this.dictionaries[groups[j]][text]) ? this.dictionaries[groups[j]][text] : 0;
}
// Perform calculations
for (var j = 0; j < groups.length; j++) {
(!probabilities[text]) ? probabilities[text] = {} : "";
(!probs[groups[j]]) ? probabilities[text][groups[j]] = 0 : probabilities[text][groups[j]] =
probs[groups[j]]/sums[text];
}
//Average out the probabilities
for (var j = 0; j < groups.length; j++) {
if (!finals[groups[j]]) finals[groups[j]] = [];
finals[groups[j]].push(probabilities[text][groups[j]]);
}
for (var i = 0; i < groups.length; i++) {
finals[groups[i]] = average(finals[groups[i]]);
}
//Find the largest probability
var highestGroup = "";
var highestValue = 0;
for (var group in finals) {
if (finals[group] > highestValue) {
highestGroup = group;
highestValue = finals[group];
}
}
return highestGroup;
};
48. @joel__lord
#WAQ17
Analyse de sentiments
EXEMPLE DE CODE
var twit = require("twit");
var sentiment = require("sentiment");
var keyword = "#waq17";
var t = new twit(require("./credentials"));
var stream1 = t.stream("statuses/filter", {track: keyword});
stream1.on("tweet", function (tweet) {
var score = sentiment(tweet.text);
console.log("--- n New Tweetn" + tweet.text + "n" + (score > 0 ?
"Positive" : "Negative"));
});
51. @joel__lord
#WAQ17
Algorithmes génétiques
COMMENT ÇA FONCTIONNE
• On crée une population d’individus aléatoires
• On garde les plus proches de la solution
• On garde des individus aléatoires
• On introduit des mutations aléatores
• On crée aléatoirement des “enfants”
• On arrive magiquement à une solution!
52. @joel__lord
#WAQ17
Algorithmes génétiques
COMMENT ÇA FONCTIONNE
• On crée une population d’individus aléatoires
• On garde les plus proches de la solution
• On garde des individus aléatoires
• On introduit des mutations aléatores
• On crée aléatoirement des “enfants”
• On arrive magiquement à une solution!
54. @joel__lord
#WAQ17
Algorithmes génétiques
EXEMPLE DE CODE
var population = [];
const TARGET = 200;
const MIN = 0;
const MAX = TARGET - 1;
const IND_COUNT = 4;
const POP_SIZE = 100;
const CLOSE_ENOUGH = 0.001;
var RETAIN = 0.02;
var RANDOM_SELECTION = 0.05;
var MUTATION_PROBABILITY = 0.01;
55. @joel__lord
#WAQ17
Algorithmes génétiques
EXEMPLE DE CODE
//Declare Consts
function randomInt(min, max) {
return Math.round(random(min, max));
}
function random(min, max) {
if (max == undefined) { max = min; min = 0; }
if (max == undefined) { max = 100; }
return (Math.random()*(max-min)) + min;
}
56. @joel__lord
#WAQ17
Algorithmes génétiques
EXEMPLE DE CODE
//Declare Consts
function randomInt(min, max) {…}
function random(min, max) {…}
function fitness(individual) {
sum = individual.reduce((a,b) => a + b, 0);
return Math.abs(TARGET - sum);
}
function sortByFitness(population) {
population.sort((a, b) => {
var fitA = fitness(a); var fitB = fitness(b);
return fitA > fitB ? 1 : -1;
});
return population;
}
57. @joel__lord
#WAQ17
Algorithmes génétiques
EXEMPLE DE CODE
//Declare Consts
function randomInt(min, max) {…}
function random(min, max) {…}
function fitness(individual) {…}
function sortByFitness(population) {…}
function randomIndividual() {
var individual = [];
for (var i = 0; i < IND_COUNT; i++) {
individual.push(random(MIN, MAX));
}
return individual;
}
function randomPopulation(size) {
var population = [];
for (var i = 0; i < size; i++) {
population.push(randomIndividual());
}
return population;
}
58. @joel__lord
#WAQ17
Algorithmes génétiques
EXEMPLE DE CODE
//Declare Consts
function randomInt(min, max) {…}
function random(min, max) {…}
function fitness(individual) {…}
function sortByFitness(population) {…}
function randomIndividual() {…}
function randomPopulation(size) {…}
function mutate(population) {
for (var i=0; i < population.length; i++) {
if (MUTATION_PROBABILITY > Math.random()) {
var index = randomInt(population[i].length);
population[i][index] = random(MIN, MAX);
}
}
return population;
}
59. @joel__lord
#WAQ17
Algorithmes génétiques
EXEMPLE DE CODE
//Declare Consts
function randomInt(min, max) {…}
function random(min, max) {…}
function fitness(individual) {…}
function sortByFitness(population) {…}
function randomIndividual() {…}
function randomPopulation(size) {…}
function mutate(population) {…}
function reproduce(father, mother) {
var half = father.length / 2;
var child = [];
child = child.concat(father.slice(0, half), mother.slice(half,
mother.length));
return child;
}
60. @joel__lord
#WAQ17
Algorithmes génétiques
EXEMPLE DE CODE
//Declare Consts
function randomInt(min, max) {…}
function random(min, max) {…}
function fitness(individual) {…}
function sortByFitness(population) {…}
function randomIndividual() {…}
function randomPopulation(size) {…}
function mutate(population) {…}
function reproduce(father, mother) {…}
function evolve(population) {
var parents = [];
//Keep the best solutions
parents=sortByFitness(population).slice(0,Math.round(POP_SIZE*RETAIN));
//Randomly add new elements
for (var i = parents.length; i < POP_SIZE - parents.length; i++) {
if (RANDOM_SELECTION > Math.random()) {
parents.push(randomIndividual());
}
}
}
61. @joel__lord
#WAQ17
Algorithmes génétiques
EXEMPLE DE CODE
//Declare Consts
function randomInt(min, max) {…}
function random(min, max) {…}
function fitness(individual) {…}
function sortByFitness(population) {…}
function randomIndividual() {…}
function randomPopulation(size) {…}
function mutate(population) {…}
function reproduce(father, mother) {…}
function evolve(population) {
//Random Stuff
parents = mutate(parents);
var rndMax = parents.length - 1;
while (parents.length < POP_SIZE) {
var father = randomInt(rndMax);
var mother = randomInt(rndMax);
if (father != mother) {
father = parents[father]; mother = parents[mother];
parents.push(reproduce(father, mother));
}
}
return parents;
62. @joel__lord
#WAQ17
Algorithmes génétiques
EXEMPLE DE CODE
//Declare Consts
function randomInt(min, max) {…}
function random(min, max) {…}
function fitness(individual) {…}
function sortByFitness(population) {…}
function randomIndividual() {…}
function randomPopulation(size) {…}
function mutate(population) {…}
function reproduce(father, mother) {…}
function evolve(population) {…}
function findSolution() {
var population = randomPopulation(POP_SIZE);
var generation = 0;
while (fitness(population[0]) > CLOSE_ENOUGH) {
generation++;
population = evolve(population);
}
return {solution: population[0], generations: generation};
}
var sol = findSolution();
63. @joel__lord
#WAQ17
Algorithmes génétiques
EXEMPLE DE CODE
var population = [];
const TARGET = 200;
const MIN = 0;
const MAX = TARGET - 1;
const IND_COUNT = 4;
const POP_SIZE = 100;
const CLOSE_ENOUGH = 0.001;
var RETAIN = 0.02;
var RANDOM_SELECTION = 0.05;
var MUTATION_PROBABILITY = 0.01;
function randomInt(min, max) {
return Math.round(random(min, max));
}
function random(min, max) {
if (max == undefined) { max = min; min = 0; }
if (max == undefined) { max = 100; }
return (Math.random()*(max-min)) + min;
}
function fitness(individual) {
sum = individual.reduce((a,b) => a + b, 0);
return Math.abs(TARGET - sum);
}
function sortByFitness(population) {
population.sort((a, b) => {
var fitA = fitness(a); var fitB = fitness(b);
return fitA > fitB ? 1 : -1;
});
return population;
}
function randomIndividual() {
var individual = [];
for (var i = 0; i < IND_COUNT; i++) {
individual.push(random(MIN, MAX));
}
return individual;
}
function randomPopulation(size) {
var population = [];
for (var i = 0; i < size; i++) {
population.push(randomIndividual());
}
return population;
}
function mutate(population) {
for (var i=0; i < population.length; i++) {
if (MUTATION_PROBABILITY > Math.random()) {
var index = randomInt(population[i].length);
population[i][index] = random(MIN, MAX);
}
}
return population;
}
function reproduce(father, mother) {
var half = father.length / 2;
var child = [];
child = child.concat(father.slice(0, half), mother.slice(half, mother.length));
return child;
}
function evolve(population) {
var parents = [];
//Keep the best solutions
parents = sortByFitness(population).slice(0, Math.round(POP_SIZE*RETAIN));
//Randomly add new elements
for (var i = parents.length; i < POP_SIZE - parents.length; i++) {
if (RANDOM_SELECTION > Math.random()) {
parents.push(randomIndividual());
}
}
//Mutate elements
parents = mutate(parents);
var rndMax = parents.length - 1;
while (parents.length < POP_SIZE) {
var father = randomInt(rndMax);
var mother = randomInt(rndMax);
if (father != mother) {
father = parents[father];
mother = parents[mother];
parents.push(reproduce(father, mother));
}
}
return parents;
}
function findSolution() {
var population = randomPopulation(POP_SIZE);
var generation = 0;
while (fitness(population[0]) > CLOSE_ENOUGH) {
generation++;
population = evolve(population);
}
return {solution: population[0], generations: generation};
}
var sol = findSolution();
console.log("Found solution in " + sol.generations + " generations.", sol.solution);
64. Faut le voir pour le croire
ALGORITHMES GÉNÉTIQUES
65. DOCUMENT CONFIDENTIEL, TOUT DROIT RÉSERVÉ
PRESENTED BY
That’s all folks !
Questions?
JOEL LORD
April 4th, 2017
TWITTER: @JOEL__LORD
GITHUB: HTTP://GITHUB.COM/JOELLORD