La classification, c’est notre grande passion

La classification, c’est notre grande passion

En ce moment, le sujet récurrent des discussions de comptoir entre référenceurs, c'est le manchot, alias le penguin, troisième du nom. Qui est-il ? d'où vient-il ? quels sont ses effets ? Autant de questions que se posent les collègues, et dont en fait on se moque un peu, car la seule question importante est : suis-je touché, et surtout vais-je l'être ?

Avec les années, la communauté progresse et se dote d'outils de plus en plus performants, qui permettent d'avoir des informations nombreuses et fournies. Ainsi, l'ami 512banque a mis en place un outil sympathique qui permet d'analyser les positionnements de votre site web (et des petits concurrents) pour pas mal de mots-clés, qui donne aussi pas mal d'autres informations. Pour ceux qui sont partis en Mongolie intérieure ces derniers temps, l'outil s'appelle SEObserver. Pour le présenter, Kevin nous propose des données post-penguin dans un post intéressant, d'autant plus que les données sont libres d'usage, ce qui est toujours un plus. Et je crois que nous pouvons tous remercier Kevin, car c'est vraiment bien d'avoir partagé ces infos avec tout le monde.

Aujourd'hui, j'ai joué avec les données et je les ai passé à la moulinette de la classification, pour voir ce que l'on pouvait en tirer. Voici exactement ce que j'ai regardé :

Peux t-on déterminer à partir des caractéristiques fournies par SEObserver et les observations déjà faites, si une page raisonnablement positionnée pour un mot clé donné va se faire lourdement bananer ? Plus précisément, si une page est dans les 2 premières pages, peux t-on prédire/déterminer si elle va perdre AU MOINS 10 places (ce qui signifie le passage en page 2 pour une page en première position) ? Je cherche donc à prédire un évènement qui signe généralement la fin du trafic sur le mot clé.

Il s'agit d'un test amusant, pour voir si les méthodes de classification sont utiles ici, et j'ai joué petits bras. J'ai pris environ 5000 entrées du fichier de données, et je n'ai gardé que celles qui correspondaient à des pages positionnées dans les deux premières pages avant le passage du manchot. C'est ce dataset qui m'a servi de référence, il contient environ 1000 pages. C'est peu et les réusltats sont donc toujours à prendre avec des pincettes.

Ensuite, j'ai travaillé un peu les données pour les faire rentrer dans l'outil de création de classifieur. J'ai gardé la plupart des caractéristiques fournies par Kevin :

  • KeywordVolume
  • Pr
  • RefDomains
  • CitationFlow
  • TrustFlow
  • ExactAnchorsRefDomains
  • Alexa
  • ContainingAnchorsRefPages
  • KeywordCpc
  • KeywordCompetition
  •  YesterdayPos
  • ExactAnchorsRefPages
  • ContainingAnchorsRefDomains
  • RefPages

Je vous renvoie au post de Kevin pour en savoir plus, mais notez juste qu'on retrouve ici des indicateurs classiques (par exemple le PR à la Google, c'est à dire la fameuse barre verte), le Trust Flow  et le Citation Flow, les indicateurs de Majestic pour évaluer la « qualité » du linking et son volume, le nombre de domaines référents mais surtout des indicateurs portant sur les ancres optimisées (au sens strict mais aussi au sens plus large).

Mon objectif était de créer un classifieur le plus efficace possible, et j'ai donc fait feu de tout bois et j'ai crée ce que l'on appelle une forêt d'arbres de décision avec une méthode de boosting. Un arbre de décision, vous pouvez en voir un, un peu plusbas, a toujours un certain pourcentage d'erreur. L'idée derrière la forêt d'arbres de décision, c'est de dire que les erreurs d'un arbre ne sont pas nécessairement celles d'un autre, et que donc on peut améliorer la prédiction/classification si on a plusieurs arbres.

Bref, au final le mieux que j'ai pu faire sur ce dataset est un classifieur avec une erreur de 18% (pour les faux positifs et les faux négatifs). Grosso modo, à chaque fois que vous l'utilisez pour un de vos sites et un mot clé, vous avez 1 chance sur 5 qu'il se trompe. Ce résultat est en partie décevant, et cela est dû à plusieurs choses : dataset pas forcément totalement représentatif (il y a surtout des mots clés concurrentiels), non prise en compte de facteurs intra-page et de facteurs externes autres que les ancres des liens. Mais ce résultat est aussi très satisfaisant, comme vous allez pouvoir le voir.

Avant de passer au résultat, un point concernant la prise en compte du PR. Le PR barre verte, c'est fini nous a dit Matt Cutts, et donc il faudrait l'enlever du classifieur à terme. En l'enlevant, on passe à un taux d'erreur de 27%, signe que le critère a quand même du sens, même si en fait c'est uniquement parce que les pages en PR -1 sont plus souvent pénalisées par penguin que les autres.

Bref, de tous les arbres de la forêt, en voilà un, qui a un taux d'erreur de 22% environ :

Pr <= 1:
:...RefDomains <= 60:
:   :...Alexa > 8441600: pe (22.2/4.3)
:   :   Alexa <= 8441600:
:   :   :...YesterdayPos > 11: npe (94/43.2)
:   :       YesterdayPos <= 11:
:   :       :...RefPages > 1986: pe (10)
:   :           RefPages <= 1986:
:   :           :...KeywordCompetition <= 0.92: npe (9/3)
:   :               KeywordCompetition > 0.92: pe (3.8)
:   RefDomains > 60:
:   :...TrustFlow > 46: npe (10/3)
:       TrustFlow <= 46:
:       :...Pr <= -1:
:           :...ContainingAnchorsRefDomains <= 1: npe (2)
:           :   ContainingAnchorsRefDomains > 1: pe (33/1)
:           Pr > -1:
:           :...Alexa <= 300669:
:               :...ContainingAnchorsRefDomains <= 27: npe (5)
:               :   ContainingAnchorsRefDomains > 27: pe (4.4/1)
:               Alexa > 300669:
:               :...CitationFlow <= 19: npe (2)
:                   CitationFlow > 19: pe (37.6/3)
Pr > 1:
:...Pr > 7: npe (56/11)
Pr <= 7:
:...KeywordVolume > 368000:
:...ExactAnchorsRefPages > 1772635: pe (14/1)
:   ExactAnchorsRefPages <= 1772635:
:   :...KeywordCpc > 0.74: npe (10/1)
:       KeywordCpc <= 0.74:
:       :...KeywordCpc > 0.45: pe (5)
:           KeywordCpc <= 0.45:
:           :...CitationFlow <= 38: pe (4)
:               CitationFlow > 38:
:               :...KeywordCompetition <= 0.69: npe (19/4)
:                   KeywordCompetition > 0.69: pe (3)
KeywordVolume <= 368000:
:...Pr > 3:
:...ExactAnchorsRefDomains > 47307:
:   :...Alexa <= 5653: npe (77/29)
:   :   Alexa > 5653:
:   :   :...YesterdayPos <= 15: pe (8)
:   :       YesterdayPos > 15:
:   :       :...KeywordVolume <= 60500: npe (7/1)
:   :           KeywordVolume > 60500: pe (12/2)
:   ExactAnchorsRefDomains <= 47307:
:   :...TrustFlow > 46: npe (156/27)
:       TrustFlow <= 46:
:       :...KeywordCompetition <= 0.52: npe (21/2)
:           KeywordCompetition > 0.52:
:           :...Pr <= 4:
:               :...ContainingAnchorsRefPages <= 22435: npe (63/13)
:               :   ContainingAnchorsRefPages > 22435:
:               :   :...YesterdayPos > 20: npe (2)
:               :       YesterdayPos <= 20:
:               :       :...KeywordVolume <= 90500: pe (18/3)
:               :           KeywordVolume > 90500: npe (7/2)
:               Pr > 4:
:               :...Alexa <= 1316: pe (6.1/0.1)
:                   Alexa > 1316:
:                   :...YesterdayPos > 19: npe (12/1)
:                       YesterdayPos <= 19:
:                       :...CitationFlow <= 53: npe (81.9/32.9)
:                           CitationFlow > 53:
:                           :...Pr <= 5: pe (4)
:                               Pr > 5:
:                               :...KeywordCpc <= 1.77: pe (2)
:                                   KeywordCpc > 1.77: npe (3)
Pr <= 3:
:...Pr <= 2: npe (66/24)
Pr > 2:
:...Alexa <= 108338:
:...KeywordVolume > 90500: pe (9.5)
:   KeywordVolume <= 90500:
:   :...RefDomains <= 311: pe (17.4/3.4)
:       RefDomains > 311: npe (6.5/1)
Alexa > 108338:
:...ContainingAnchorsRefPages > 78962: npe (8)
ContainingAnchorsRefPages <= 78962:
:...KeywordCpc <= 0.91: npe (14/1)
KeywordCpc > 0.91:
:...KeywordVolume > 90500: pe (7.5/1)
KeywordVolume <= 90500:
:...RefPages > 42629: pe (8/1)
RefPages <= 42629:
:...RefDomains > 388: npe (8.5)
RefDomains <= 388:
:...RefPages > 14607: npe (9/1)
RefPages <= 14607:
:...RefPages > 10197: pe (4)
RefPages <= 10197: [S1]

SubTree [S1]

KeywordCompetition <= 0.6: pe (2.8)
KeywordCompetition > 0.6:
:...YesterdayPos <= 11: npe (4.8)
YesterdayPos > 11:
:...Alexa <= 1201722: pe (13.1/4.3)
Alexa > 1201722: npe (25/7.5)

Voilà, vous avez compris que j'avais la flemme de le faire sous forme graphique, ce qui est normal vu sa taille 😉 "npe" signifie que le couple (page, mot clé) passe à travers la grosse pénalité, tandis que "pe" signifie que le manchot a dessoudé la page. Je rappelle que ce classifieur n'a de sens que pour des pages qui sont dans les 20 premiers résultats du moteur avant le passage du filtre.

Comment se lit cet arbre ? La première ligne demande à voir le PR de la page, si il est 0 ou -1, alors on regarde la valeur de RefDomains. Si cette valeur est <= 60 et que le Alexa rank est > 8441600 alors le classifieur conclura que la page est pénalisée. Sinon il va regarder d'autres critères (comme le TrustFlow ici, etc.). Plus loin on a la ligne pour les autres cas de valeur du PR à la première comparaison. Les indentations donnent la hauteur de chaque test dans l'arbre.

On peut aussi avoir des représentations (avec un taux d'erreur généralement supérieur) sous forme de règles plutôt que d'arbres, ce qui est plus facile à utiliser. On peut aussi améliorer le taux d'erreur en terme de faux négatif, mais cela dégrade celui sur les faux positifs, et réciproquement. Ici j'ai fait le choix d'une erreur symétrique.

Ensuite, avec la technique du boosting, on crée plusieurs arbres qu'on utilise conjointement, et on obtient une erreur autour de 18%. Mais ce qui est intéressant, c'est surtout le taux d'utilisation de chaque critère par la forêt issue du boosting :

  • 100%  KeywordVolume
  • 100%  Pr
  • 100%  RefDomains
  • 100%  CitationFlow
  • 100%  TrustFlow
  • 96%  ExactAnchorsRefDomains
  • 90%  Alexa
  • 85%  ContainingAnchorsRefPages
  • 78%  KeywordCpc
  • 67%  KeywordCompetition
  • 58%  YesterdayPos
  • 55%  ExactAnchorsRefPages
  • 52%  ContainingAnchorsRefDomains
  • 33%  RefPages

100% veut dire que pour une page analysée on regardera toujours ce critère dans au moins un des arbres de décision, 33% que 2 pages sur 3 ne seront pas du tout analysées à l'aune de ce critère. On voit que sans surprise les informations de popularité/trust sont là, que ce soit pour le mot-clé avec son volume ou pour la page avec les différents flows, le volume de domaines référents ou le classement Alexa. mais on voit surtout que l'existence de l'ancre exacte dans les domaines référents est très importante, et cela corrobore ce qui est dit intuitivement par beaucoup de référenceurs.

Maintenant, à vous de jouer pour faire la même chose et vous créer votre classifieur/prédicteur. Vous ne savez pas comment faire ? Dans nos deux masterclass (moteurs ET stats), on vous l'explique, il ne faut donc pas hésiter à venir 😉

Comments ( 4 )

  • Merci Sylvain pour ce post, il faut absolument qu’on se voit 🙂

    Je réagis juste sur la partie décevante : le fichier est un gros dump sans aucun tri préalable, il est donc parasité par des infos qui n’ont rien à voir (cf le mouvement sur la requête « plug anal », liée davantage à l’actualité qu’à de réels éléments liés à penguin).
    Autre info à laquelle nous n’avons pas accès, du moins pas dans le fichier livré tel quel : les redirections qui transmettent à mon humble avis une concentration d’ancre et les pénalités, le désaveu et surtout les infos temporelles (penguin ne pénalise que si le spam a été fait depuis un certain temps).

    Bref, très agréable d’avoir un éclairage plus « scientifique/probabiliste » que le simple feeling plus difficile à expliquer 🙂

  • Photo du profil de Sylvain Peyronnet

    Oui, il y a pas mal d’infos qui sont très dures à obtenir de manière systématique et automatique, ce qui pollue nécessairement le résultat. Mais même si c’est un « gros dump », tu as fait un sacré boulot et c’est utile pour tout le monde je crois.

  • Mickael

    J’ajouterai une dernière variable : le NDD est-il un exact match domain ? Ça peut être intéressant de voir le comportement de Google vis-à-vis de ce critère 🙂

  • Beware that the problem is skewed (lesser penalized pages than not penalized).
    To properly assess the prediction value, don’t forget to look at the rates for both classes.
    I have put some graphics there to highlight the discrepancies between the algorithms :
    Here are the classification success for each class on the validating set for a set of algorithms : (code available also)
    https://github.com/sduprey/TOXICITY_CLASSIFIER/blob/master/TOXICITY_CLASSIFIER/html/toxicity_multiple_learning_05.png