On Github opoirion / pres_ml
Une présentation de : Olivier Poirion
new_comment = "c'est vraiment naze" if new_comment.count('naze'): status = "bad" elif new_comment.count('bien'): status = "good" ...
if new_comment.count('super') and not comment.count('pas super'): status = "good" ...
def supervized_analysis(): """ building a classifier """ used_classifier = Classifier() trainingdata = process(rawdata) used_classifier.feed_with(trainingdata) score = used_classifier.evalutation() used_classifier.predict("c'est un super commentaire positif")
dictionnary = process_one_comment("super ce blog! J'adore ce truc") ### looking inside dictionnary ### { "super": 1, "blog": 1, "ce": 2, "adore":1, "truc":1 } ### processing all rawdata ### pre_trainingdata = [process(rawdata) for raw in rawdata]
vector, index = vectorize_one(dictionnary) ### looking inside vector ### (1, 1, 2, 1, 1) ### looking inside index ### { "super": 0, "blog": 1, "ce": 2, "adore":3, "truc":4 }
problème, on doit vectoriser dictionnary par rapport à rawdata
vector, index = vectorize(dictionnary, rawdata) ### looking inside vector ### (1, 1, 2, 1, 1, 0,...,0) ### looking inside index ### { "super": 0, ... "naze":27 }
training data final
trainingdata = vectorize_all_dictionnary(dictionnary) status = ["good", "good", "good", "bad", "bad", "bad"]
used_classifier = KNearestNeighbors(k=1, distance="Jaccard") used_classifier.feed_with(trainingdata) used_classifier.predict("c'est un super commentaire positif")
Entrainement
trainingdata = trainingdata status = status nb_neighbors = k """ do nothing, keep into memory trainingdata as matrix """
Prédiction
new_comment = "c'est un super commentaire positif" new_vector, index = vectorize(new_comment, rawdata) results = set() for vector, state in zip(trainindata, status): score = compute_distance(new_vector, vector) results.add((score, state)) order_by_best_score(results) results = results[0:nb_neighbors] #take k best scores result = most_represented_status(results) # "good" or "bad"
en python:
union = len(set(dict1.keys()).union(dict2.keys())); intersection = len(set(dict1.keys()).intersection(dict2.keys())); d_jaccard = 1.0 - float(union) / intersection
“c'est un super commentaire positif”
super ce blog! J'adore ce truc... 0.85 De la balle! c'est vraiment super! 0.71 que des bonnes choses, bien fait et très intéressant 1.0 pas terrible c'est vraiment un blog de gros naze... 0.80 On se fout de ma geule! remboursez!!! c'est naze! 0.90 pas super ce blog, peut mieux faire je n'y reviendrai pas 0.90“pas super”
super ce blog! J'adore ce truc... 0.83 De la balle! c'est vraiment super! 0.86 que des bonnes choses, bien fait et très intéressant 1.0 pas terrible c'est vraiment un blog de gros naze... 0.90 On se fout de ma geule! remboursez!!! c'est naze! 1.0 pas super ce blog, peut mieux faire je n'y reviendrai pas 0.88{ "super": 1, "super ce": 1, "super ce blog": 1, }k-mers
{ "sup": 1, "supe": 1, "super": 1, "super!":1, }
{ "!": 2, ("!", -1): 1, ("super", 0): 1 }mixte
{ "super ce": 1, "!": 1, "super": 1, ("super", 0): 1, }
Scoring de la pertinence d'un attribut:
“pas super”
super ce blog! J'adore ce truc... 0.92 De la balle! c'est vraiment super! 0.92 que des bonnes choses, bien fait et très intéressant 1.0 pas terrible c'est vraiment un blog de gros naze... 0.95 On se fout de ma geule! remboursez!!! c'est naze! 1.0 pas super ce blog, peut mieux faire je n'y reviendrai pas 0.89“pas super”
super ce blog! J'adore ce truc... 0.90 De la balle! c'est vraiment super! 0.88 que des bonnes choses, bien fait et très intéressant 1.0 pas terrible c'est vraiment un blog de gros naze... 0.96 On se fout de ma geule! remboursez!!! c'est naze! 0.99 pas super ce blog, peut mieux faire je n'y reviendrai pas 0.89faible k: spécificité
fort k: généralisation
Score du training-set
Cross-validation
Test set
Méthodes propre à l'algo utilisé
présence de patterns spécifiques et évidents entre les deux classes
Confrontation a des données bruitées
Distance euclidienne
Distance de Jaccard
Aucun pattern!
Surestimation du vrai score (Mauvaise méthode d'évaluation)
modèle 1-nn trop spécifique ( overfitting )
Existe-t-il quelque chose à apprendre?
\[modèle = \{algorithme, vectorisation\}\]
\[succès = f(donnés, modèle, paramètres) \]
Considérations techniques de l'algorithme
Machine-learning <=> science (mais pas de raison d'avoir peur!)
Clés théoriques
Algorithmes