Python algo de recommandation
Algorithmes de recommandation
Lien vers le notebook en ligne : https://mybinder.org/v2/gh/tix06/notebooks_classif/master
Choisir alors le fichier :
algorithme de recommandation.ipynb
Il s’agit d’un cas très classique d’algorithme utilisé dans le web marketing. Un client choisit et met dans ses favoris un article, ou dans son panier. Le site lui propose des articles compatibles, ou similaires. La recommandation peut être basée sur la description de ces articles. L’algorithme va alors chercher les articles qui ont le plus de points communs dans leur description; c’est à dire le plus de mots communs dans leur description.
La première étape pour calculer les similarités consiste à découper les descriptions en listes de mots (c’est la tokenisation) puis à prendre les racines des mots, les stems.
Extraire les mots d’un texte
Prenons un exemple avec le texte suivant :
On utilise alors une expression regulière, ; |, |\' |\n |\s+,pour découper le texte, et conserver les stems dans une liste. C’est ce que réalisera ici la fonction decoupe(texte) :
['chef',
'accompagn',
'locataire',
'pour',
'remise',
'officielle',
'rapport',
'biblioth',
'leur',
'commun',
'avec',
'concours',
'inspecteur',
'affaires',
'culturelles',
'premi',
'mesures',
'faveur',
'plan',
'biblioth']
Recommandation d’un article à partir de sa description
traitement du fichier de données en csv
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
[['bande',
'dessinee',
'ouvrage',
'illustre',
'racontant',
'histoire',
'images',
'aventure',
'fantaisie',
'lire'],
['roman',
'ouvrage',
'avec',
'texte',
'raconte',
'histoire',
'biogaphie',
'aventure',
'documentaire',
'lire'],
['ordinateur',
'dispositif',
'pour',
'produire',
'consulter',
'objets',
'numeriques',
'communiquer',
'calculer',
'jouer',
'lire',
'videos'],
['console',
'dispositif',
'pour',
'jouer',
'jeux',
'videos',
'lire',
'videos',
'aventure',
'fantaisie']]
Vecteurs
L’étape suivante consiste à stocker chacune des descriptions traitées sous forme de vecteurs en base de données.
Chaque ligne est un vecteur qui correspond à une description, chaque colonne correspond à un stem.
La fonction mots retourne une liste contenant tous les mots de descriptif, de manière unique. (les mots qui apparaissent plusieurs fois dans descriptif ne sont renvoyés qu’une seule fois dans la liste mot
La fonction tab créé un tableau où les lignes correspondent au nombre d’occurences de ce mot dans la description de l’objet. La ligne de rang 1 correspond aux occurences pour le premier objet de la description, la ligne de rang 2 au 2e objet de la description,…
Pour avoir des valeurs normalisées, on transforme ces occurences en une frequence :
$$f(mot) = \tfrac{nb\quad occurences}{nb\quad mots}$$['bande',
'dessinee',
'ouvrage',
'illustre',
'racontant',
'histoire',
'images',
'aventure',
'fantaisie',
'lire',
'roman',
'avec',
'texte',
'raconte',
'biogaphie',
'documentaire',
'ordinateur',
'dispositif',
'pour',
'produire',
'consulter',
'objets',
'numeriques',
'communiquer',
'calculer',
'jouer',
'videos',
'console',
'jeux']
[[0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.1, 0.0, 0.0, 0.1, 0.0, 0.1, 0.0, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.08333333333333333, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.08333333333333333, 0.08333333333333333, 0.08333333333333333, 0.08333333333333333, 0.08333333333333333, 0.08333333333333333, 0.08333333333333333, 0.08333333333333333, 0.08333333333333333, 0.08333333333333333, 0.08333333333333333, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.1, 0.1, 0.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.1, 0.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.1, 0.2, 0.1, 0.1]]
| bande | dessinee | ouvrage | illustre | racontant | histoire | images | aventure | fantaisie | lire | … | produire | consulter | objets | numeriques | communiquer | calculer | jouer | videos | console | jeux | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| bande dessinee | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.100000 | … | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.0 | 0.0 |
| roman | 0.0 | 0.0 | 0.1 | 0.0 | 0.0 | 0.1 | 0.0 | 0.1 | 0.0 | 0.100000 | … | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.0 | 0.0 |
| ordinateur | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.083333 | … | 0.083333 | 0.083333 | 0.083333 | 0.083333 | 0.083333 | 0.083333 | 0.083333 | 0.083333 | 0.0 | 0.0 |
| console de jeux | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.1 | 0.1 | 0.100000 | … | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.100000 | 0.200000 | 0.1 | 0.1 |
Calcul des similarités
La dernière étape est celle du calcul des similarités. Cela consiste à appliquer la similarité cosinus 2 à 2 pour tous les produits de la base de données :
$$s_{ij}=\tfrac{u_i\cdot u_j}{||ui||\cdot||uj||}$$On cherche alors une règle de similitude, du type : A=>B (si on aime A alors on aurait tendance à aussi apprécier B)
array([[1. , 0.4 , 0.09128709, 0.27386128],
[0.4 , 1. , 0.09128709, 0.18257419],
[0.09128709, 0.09128709, 1. , 0.5 ],
[0.27386128, 0.18257419, 0.5 , 1. ]])
| bande dessinee | roman | ordinateur | console de jeux | |
|---|---|---|---|---|
| bande dessinee | 1.000000 | 0.400000 | 0.091287 | 0.273861 |
| roman | 0.400000 | 1.000000 | 0.091287 | 0.182574 |
| ordinateur | 0.091287 | 0.091287 | 1.000000 | 0.500000 |
| console de jeux | 0.273861 | 0.182574 | 0.500000 | 1.000000 |
<matplotlib.axes._subplots.AxesSubplot at 0x1a17767250>
Interpretation
On voit assez facilement que :
- la bande dessinée est proche dans sa description avec le roman, avec un score de 0.4, et un un peu moins proche de la console de jeux (score de 0.27)
- l’ordinateur est compatible avec la console de jeux, avec un score de 0.5
- La description de la bande dessinnée et du roman ne contient presque aucun point commun avec l’ordinateur
l'article bande dessinee est similaire à roman voire peut être un peu à console de jeux
l'article roman est similaire à bande dessinee voire peut être un peu à console de jeux
l'article ordinateur est similaire à console de jeux voire peut être un peu à roman
l'article console de jeux est similaire à ordinateur voire peut être un peu à bande dessinee
definir des classes à l’aide d’une représentation en graphe
Interprétation
Il apparait ici clairement 2 classes en choisissant seuil = 0.3 :
- les articles du genre littérature
- les articles du genre électronique
Classification
L’arbre de classification peut être utile dans le cas L’apprentissage par arbre de décision désigne une méthode basée sur l’utilisation d’un arbre de décision comme modèle prédictif. Dans ces structures d’arbre, les feuilles représentent les valeurs de la variable-cible (les classes) et les embranchements correspondent à des combinaisons de variables d’entrée qui mènent à ces valeurs. En analyse de décision, un arbre de décision peut être utilisé pour représenter de manière explicite les décisions réalisées et les processus qui les amènent.
Une des variables d’entrée est sélectionnée à chaque nœud intérieur (ou interne, nœud qui n’est pas terminal) de l’arbre selon une méthode qui dépend de l’algorithme.
L’arbre est en général construit en séparant l’ensemble des données en sous-ensembles en fonction de la valeur d’une caractéristique d’entrée. Il est construit de manière récursive. C’est un algorithme glouton.
Plus de détail : https://fr.wikipedia.org/wiki/Arbre_de_décision_(apprentissage)
Il existe ainsi les :
- arbres de classification (feuille = classe)
- arbres de regression, qui permettent de prédire une quantité réelle
Les algorithmes pour construire les arbres de décision sont construits en divisant l’arbre du sommet vers les feuilles en choisissant à chaque étape une variable d’entrée qui réalise le meilleur partage de l’ensemble d’objets, comme décrit précédemment. Pour choisir la variable de séparation sur un nœud, les algorithmes testent les différentes variables d’entrée possibles et sélectionnent celle qui maximise un critère donné.
suite : voir la page sur les arbres de décision : graphes_mini_prog.md



