Modèle Interne : test de classification de pages via le Machine Learning pour un seul site

Importance des variables

Cet article fait suite aux 2 articles précédents :

Dans cet article nous allons tester un modèle « interne » de classification de pages au moyen du machine learning pour un seul site.

Dans notre cas nous partons des données de Pages/Expressions/Positions récupérées via Google Search console API pour le site de Networking Morbihan pour le mois de Mai 2019. Le jeu de données contient 514 enregistrements et les variables suivantes :

  • clicks ; clics obtenus par le couple page/expression
  • ctr : click through rate : taux de clics clics/impressions
  • impressions : nombre d’affichage de la page de mon site dans les pages des résultats de recherche (SERPs Search Engine Results Pages) dans Google.
  • Position : position de ma page dans les SERPs
  • query : requête, on dit aussi indifféremment « expression » ou « mot clé » ou « groupe de mots clés »…
  • page : l’url de la page

Pour ce premier test nous allons construire des variables explicatives à partir des données que nous avons :

  • isHttps : le site est -il en https ?*
  • level : « pseudo niveau » de la page dans l’arborescence du site
  • lenWebsite : taille de l’url du site en caractères
  • lenTokensWebSite : taille de l’url du site en nombre de mots
  • lenTokensQueryInWebSiteFrequency : fréquence des mots de la requête dans le nom du site.
  • sumTFIDFWebSiteFrequency : somme des TF*IDF** pour les mots de WebSite en fonction de la taille en mots (indicateur d’originalité du contenu).
  • lenPath : taille du chemin*** en caractères
  • lenTokensPath : taille du chemin en nombre de mots
  • lenTokensQueryInPathFrequency : fréquence des mots de la requête dans le chemin.
  • sumTFIDFPathFrequency : idem que pour WebSite.

*ici nous sommes sur un seul site et toutes nos pages sont en https, ce qui n’a pas beaucoup d’intérêt. On garde cette information pour la suite.

**TF*IDF (Term Frequency * Inverse Document Frequency), nous reviendrons la dessus plus bas.

***Le chemin
correspond ici à la partie de l’URL après le site Web par exemple dans :

https://www.networking-morbihan.com/comment-financer-son-entreprise-le-9-avril-2019-a-larmor-plage

webSite :  https://www.networking-morbihan.com

et le chemin « path » : « comment-financer-son-entreprise-le-9-avril-2019-a-larmor-plage »

TF*IDF : Term Frequency * Inverse Document Frequency

Pendant de nombreuses années, en SEO, il suffisait de mettre de nombreux mots clés sur votre page en fonction de la thématique pour pouvoir avoir des chances de ressortir dans les résultats des moteurs de recherche.

Aujourd’hui c’est un peu plus complexe, et il vous est demandé de faire preuve d’originalité en créant des contenus uniques mais pertinents pour vous distinguer de vos concurrents.

Une méthode pour contrôler l’originalité des termes de votre document par rapport à un univers de concurrence, est de calculer le TF*IDF pour chacun de ceux-ci.

Le principe du TF*IDF est de calculer le poids d’un terme dans un document relativement à un ensemble de documents (souvent appelé corpus).

La formule est la suivante : pour le « poids » (weight en anglais) d’un terme i dans un document j :

Formule du TF*IDF

Où :

: nombre d’occurrences de i dans j.
: nombre de documents contenant i
N : nombre total de documents

Ici comme nous ne souhaitons pas mesurer l’originalité de chacun des termes dans une variable, mais l’originalité globale de la variable nous sommons les TF*IDF et les divisons par la taille de la variable en nombre de termes.

Pour ceux qui suivent 🙂 : Ici on regarde cet indicateur notamment pour la variable WebSite : ceci n’a pas beaucoup d’intérêt puisque c’est la même pour tout le monde.

Cet indicateur n’aura de sens ici que pour la variable « path » : sumTFIDFPathFrequency

Rappel : pour simplifier le problème nous classifions ici en 2 groupes : les pages dans le Top10 et les autres.

De quoi aurons nous besoin ?

Python Anaconda

Anaconda est une version de Python dédiée aux Data Sciences. Rendez vous sur la page de téléchargement d’Anaconda Distribution pour télécharger la version qui vous convient selon votre ordinateur. Remarque : nous faisons tourner le programme dans l’IDE Spyder fourni avec Anaconda.

Jeu de données

Nous partons du jeu de données créé lors de la phase précédente. Vous pouvez télécharger l’archive contenant ces données sur notre GitHub. Dézipper le fichier dans le répertoire qui contient votre programme source Python.

Code Source

Récupération des bibliothèques utiles et du jeu de données

Fonctions de calcul de la somme TF*IDF

Afin d’illustrer le calcul TF*IDF nous avons créé 2 fonctions qui permettent de calculer les sommes des TF*IDF à partir d’une variable donnée par une colonne de DataFrame.

Une des fonctions propose un calcul « à la main ». L’autre utilise la fonction TfidfVectorizer de la bibliothèque Scikit-Learn qui est plus rapide.

Créations de variables explicatives

On va enrichir les données que l’on a pour créer de nouvelles variables explicatives pour créer un modèle de Machine Learning.

Préparation des données pour le Machine Learning

On va préparer les données : déterminer les variables explicatives et la variable à expliquer et splitter le jeu de données en des données d’entrainement et des données de test.

Méthode des K-NN : k plus proches voisins

L’algorithme k-NN (k-plus proches voisins, en anglais k-nearest
neighbors) est un algorithme de machine learning assez simple. Ici, la construction du modèle consiste simplement à stocker l’ensemble d’apprentissage. Contrairement à d’autres algorithmes qui détermine un modèle mathématique.

Afin de faire une prévision sur une nouvelle donnée, l’algorithme regarde les k plus proches voisins de cette donnée dans l’ensemble d’apprentissage.

L’algorithme des k-plus proches voisins pour la classificatiion et contrôlé par deux paramètres : le nombre de voisin et la distance utilisée pour mesurer le proximité

En pratique un nombre de voisins entre 3 et 5 fonctionne assez bien, on peut toutefois déterminer le meilleur k en testant plusieurs valeurs.

Pour la distance c’est un peu plus complexe c’est pourquoi nous avons laissé la valeur par défaut : la distance euclidienne.

Un inconvénient de l’algorithme k-NN est qu’il doit conserver toutes les données d’entraînement en mémoire. Toutefois il donne d’assez bons résultats pour les jeux de données de petite taille.

Déterminons un k :

Performances selon k
Performances selon k

Le meilleur F1 score (en jaune) est obtenu avec k=3. Toutefois avec ce nombre on peut considérer que le modèle est sur optimisé par rapport aux données d’entrainement. On pourrait aussi choisir k=5 ou 6.

N neighbor=3
Training set score: 0.917
Test set score: 0.8295
F1-Score : 0.8944

Distribution des pages dans les groupes

Distribution des pages
Distribution des pages

Modèles Linéaires

Nous allons tester deux modèles linéaires : LogisticRegression et LinearSVC. Pour LogisticRegression on va faire varier le paramètre C qui sert à contrôler l’intensité de la régularisation.

Importance des variables.

Nous allons visualiser l’importance et le sens des variables peou la régression Logistique avec C=100. Celle qui a donné le meilleur F1 Score pour les modèles linéaires : 0.7744

Importance des variables
Importance des variables

Le fait que lenPath (longueur en caractères) et lenTokensPath (longueur en nombre de mots) sont dans des sens opposés pourrait montrer que le système privilégie les « grands » mots.

Bien que le modèle « interne » puisse fonctionner, nous souhaiterions plutôt nous mesurer à la concurrence dans la suite de nos articles.

Ce modèle interne pourrait toutefois être approfondi pour aider le Web Marketeur à améliorer ses pages sur son site toutes choses égales par ailleurs.

Et vous qu’avez-vous comme résultats ?

A bientôt,

Pierre

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.