Journal machine learning - expérimentation foireuse

Posté par . Licence CC by-sa.
15
6
mar.
2019

Bonjour Nal,

Je dois vendre mon véhicule. Je souhaite estimer le bon prix pour le vendre : juste assez pour en tirer un bon bénéfice mais pas trop pour qu'il puisse trouver acquéreur.
Je peux aller sur un site spécialisé qui moyennant quelques informations me produira cette estimation.
Mais à l'heure du machine learning, avouez que ce n'est pas très palpitant.

Alors j'ai collecté deux cent annonces de ventes d'un véhicule de même marque, même modèle, dont j'ai extrait le kilométrage, l'année de mise en circulation et le prix de mise en vente.

Mon hypothèse est qu'il existe une corrélation entre ces trois caractéristiques ; et par conséquent, que l'on peut prédire le prix de vente à partir de l'année de mise en circulation et du kilométrage.
Je dois donc construire et entraîner un modèle pour qu'il puisse prédire de manière fiable le prix de vente de mon véhicule.

Je me documente comprends que ce dont j'ai besoin est d'un algorithme de régression (versus classification) et que dans ce domaine, une des meilleurs est l'Extreme Gradient Boosting (xgboost).

La bonne nouvelle est qu'une implémentation existe en python. J'installe les bibliothèques logicielles nécessaires, et construit le script ad-hoc et le lance ; l'exécution est plutôt.

Le résultat est très décevant. L'erreur moyenne est de 700 avec des cas à plus de 1500. Pour une valeur allant de 2000 à 7000, ce n'est pas utilisable.

J'en déduis que soit je n'ai pas choisi le bon algorithme, soit je ne l'ai pas utilisé correctement, soit il n'y a pas de corrélation entre mes features, soit qu'il faudrait d'autres features pour améliorer la prédiction, soit que je n'ai pas assez de données d’entraînement.

Avez vous déjà fait des expérimentations similaires, avec plus de succès ?

  • # Pas sûr que ça produise la réponse qui t’intéresse

    Posté par (page perso) . Évalué à 9 (+8/-0).

    Pas sûr que l’approche que tu décris répondra à ta question, à savoir, le prix de vente que tu comptes fixer est-il réaliste ?

    Ton jeu de données d’apprentissage devrait aussi contenir la durée entre la mise en vente et la vente. Si la plupart des ventes présentes dans ton jeu de données ont pris des mois à se concrétiser, ça ne te donne pas la même info que si elles se sont toutes faites en quelques jours, ou encore s’il y a une distribution de durées plus étalée. Dans le premier cas ça peut signifier que ces vendeurs ont demandé trop cher, dans le deuxième cas pas assez cher : ce sont deux situations que tu essayes d’éviter. Si tu veux déterminer un prix équitable pour toi et l’acheteur, il me semble qu’il te faut cette information de durée entre la mise en vente et la vente, et aussi que tu choisisses une durée acceptable pour toi.

    Je passe sûrement à côté de plein d’autres choses importantes, car je ne connais l’apprentissage automatique que très superficiellement, et le marché de la voiture d’occasion encore moins…

    • [^] # Re: Pas sûr que ça produise la réponse qui t’intéresse

      Posté par . Évalué à 10 (+10/-0).

      Aux données, il faut ajouter la zone géographique.

      Il faut éventuellement tenir compte du carburant : les diesels ont moins d'adepte. Mais les vendeurs en tiennent ils vraiment compte dans leurs annonces ?
      La couleur : gris (et dérivé) c'est passe partout, autre ça peut réduire le marché.

      Cela peut aussi dépendre du moment : avant les grandes vacances, un véhicule en bon état se vend très bien.

      Ainsi que dit plus bas dans un autre message, le prix annoncé n'est pas le prix de vente.
      En pratique, les acheteurs négocient tous le prix et n'achètent jamais au prix affiché (sauf si vraiment trop bas). Les vendeurs ajoutent donc tous une certaine somme qui sert de marge.
      J'ai récemment vendu une voiture, affichée 2900, vendue 2500 (somme que j'espérais).
      Au niveau de l'affichage, toujours en dessous d'un chiffre rond (le prix psy) qui permet de rentrer dans plus de filtres de recherche de l'acheteur.

      Le temps d'attente pour vendre est peut être le meilleur indicateur pour savoir si on est trop ou pas assez cher. J'ai attendu 3 mois pour vendre la voiture citée dessus. J'ai eu moins de 6 appels et 2 visites.

      J'ai un copain qui a attendu un an pour vendre une voiture. Un truc « invendable », sauf à celui qui la voulait. Sur un marché de niche, il faut être patient (mon copain l'avait acheté pour presque rien).

  • # Bon exemple jouet

    Posté par . Évalué à 3 (+3/-0).

    Si tu mets tes données en ligne, peut-être que l'on pourra jouer avec.

    Autrement, en petite dimension tu peux essayer de visualiser tes données (ACP ou tsne) et tester des algorithmes plus simples pour commencer.
    Peut-être des arbres de décisions seraient plus adaptés si il y a des effets de seuil dans la décote?

    • [^] # Re: Bon exemple jouet

      Posté par . Évalué à 3 (+1/-0).

      • [^] # Re: Bon exemple jouet

        Posté par . Évalué à 6 (+5/-0).

        Merci, j'en ai profité pour faire quelques tests : https://quentin.pradet.me/stuff/vehicule_linuxfr.html

        Effectivement, tu manques de données :)

        Je t'encourage à faire des tests avec un dataset qui marche mieux : https://scikit-learn.org/stable/datasets/index.html#boston-dataset (sklearn.datasets.load_boston).

        • [^] # Re: Bon exemple jouet

          Posté par (page perso) . Évalué à 1 (+0/-0).

          Merci pour ton notebook. Tu m'as fait découvrir pandas.get_dummies et ta fonction plot_learning_curves pourrait être très utile :-).

          Par contre, je pense avoir décelé une petite erreur de copier coller:

          from sklearn.ensemble import GradientBoostingRegressor
          clf = RandomForestRegressor()
          plot_learning_curve(clf, "Gradient Boosting", X, Y)
          

          Lors de la séquence précédente, tu fais le graphique du RandomForestRegressor() mais ici tu n'appelles pas GradientBoostingRegressor. Les résultats ne devraient pas être beaucoup mieux mais bon.

        • [^] # Re: Bon exemple jouet

          Posté par . Évalué à 1 (+1/-0).

          L'analyse basique faite ici était surement la première chose à faire (jusqu'à la ligne 11).

          Je rajouterais: est-ce qu'utiliser des random forest ou autre est vraiment utile ici ?

          Une rapide analyse des données montre qu'il y a une corrélation linéaire uniquement entre km et price… L'année, qu'on pourrait penser comme importante, ne semble pas primordiale (hormis pour les très vieux, ou les très récents).

          Cette corrélation peut être corrigée à la marge en fonction de l'année, de la provenance (particulier vs pro) ou du département. Ici, une régression linéaire ultra-basique en km et price suffit amplement, surtout vu le nombre de données. Régression qu'on peut affiner à la main ou pas selon l'année, la provenance ou le département. Se lancer ne serait-ce que dans une régression linéaire multiple me semble inutile ici. Parfois, rester simple a du bon.

      • [^] # Re: Bon exemple jouet

        Posté par . Évalué à 5 (+3/-0).

        Graph interactif 3D (x = année, y = km, z = prix) :

        https://plot.ly/~titizorro/1/#/

  • # Découverte de l'être humain

    Posté par (page perso) . Évalué à 6 (+5/-1).

    Le résultat est très décevant. L'erreur moyenne est de 700 avec des cas à plus de 1500. Pour une valeur allant de 2000 à 7000, ce n'est pas utilisable.

    Pourquoi décevant et pas utilisable?
    Ca donne une idée, et pour le reste du découvres juste ce qu'est la vente d'occasion (des prix avec une bonne dose de pifomètre). Et ne te dis pas que plus c'est cher ("c'est pas un bibelot à 10 €") plus ça peut être précis en pourcentage, pour les logements c'est pareil.

    Il te reste alors à estimer ce que tu penses être le "juste prix" pour que tu vendes sans regrets, en fonction d'autres critères plus subjectifs (état général, disponibilité du carnet d'entretien, couleur si si ça change le prix "juste" en comparant la mode du moment avec la mode de l'époque, options, etc, "même marque, même modèle" ne définissant pas le prix d'achat non plus).

    • [^] # Re: Découverte de l'être humain

      Posté par . Évalué à 3 (+2/-1). Dernière modification le 07/03/19 à 16:19.

      > Ca donne une idée, et pour le reste du découvres juste ce qu'est la vente d'occasion (des prix avec une bonne dose de pifomètre)
      

      C'est pas trop du pifomètre, mais tu prend n'importe quelle voiture, à même kilométrage/année, si les options sont différentes, ça peut tout changer. Et des fois les options ne vont pas être indiquées de façon exploitable.

    • [^] # Re: Découverte de l'être humain

      Posté par . Évalué à 4 (+2/-0).

      Je vois bien l'idée et c'est d'ailleurs ce que je fais.

      Mais avoue que faire un journal "Je vais vendre ma voiture, je pense en tirer X neuros" aurait été assez loin des thèmes de ce site.

  • # Quelques améliorations possibles?

    Posté par . Évalué à 6 (+4/-0).

    • Il y a plein de façons d'évaluer le résultat, et l'erreur moyenne n'est pas forcément le meilleur. La variance ajoute une courbure à l'erreur moyenne en pénalisant les fortes erreurs par rapport aux faibles, c'est peut-être plus intéressant?

    • Le prix de vente n'est clairement pas fonction de ces trois paramètres: si Alice
      et Robert (enlève ton masque Bob, on t'a reconnu!) ont acheté la même voiture la même année au même prix et roulé le même nombre de kilomètres, il n'y pas de raison qu'ils souhaitent
      la vendre au même prix. Si cela arrive dans te données, tu demandes de deviner une fonction “qui n'existe pas” dans tes données initiales, du coup ça a peu de chances de marcher. Pour t'en sortir tu as trois pistes: “lisser les données en moyennant les points proches” – définir une notion d'exception qui te permet de jarter ou pénaliser les points gênants – et finalement changer (raffiner…) la variable que tu veux modéliser. Mais bon ce qui est sûr, c'est que le problème n'est pas très bien conditionné.

    (Un exemple de raffinement – que je préfère à prendre des moyennes – serait d'estimer de le “min” ou le “max” sur des points proches par exemple.)

    • Il faut vérifier que la date soit comprise contre une variable continue – car on y pense comme à l'âge – une erreur banale est de l'utiliser comme une variable classifiante (comme rouge, vert, bleu par exemple) ce qui fragmente l'échantillon.

    • Il y a une phase d'analyse des corrélations (où on parle des facteurs explicatifs qui permettent de reconstruire les corrélations). Est-ce que cela démontre une corrélation du prix de vente au prix de mise sur le marché par exemple?

    • Ta question de variables à ajouter est très pertinente, est-ce que par exemple la cote ARGUS mérite d'être dans le jeu de données?

    soit il n'y a pas de corrélation entre mes features

    Si tu utilises un paquet d'apprentissage automatique il y a certainement une petite analyse toute prête qui traîne quelque part qui te dira ça.

  • # Prix de vente... ou prix d'achat ?

    Posté par . Évalué à 10 (+15/-0). Dernière modification le 06/03/19 à 21:58.

    Tu as pris comme source des petites annonces, c'est à dire par définition des véhicules qui ne sont pas encore vendus. Dans le lot, il est certain qu'il y a des prix complètement illusoires.

    Du coup tes données sources ne sont que moyennement fiables. Certains ne vont pas vendre, et revoir le prix à la baisse dans qques semaines/mois.

    Il te faudrait comme source des prix de vente, c'est à dire des achats réellement effectués, seule réelle marque de la valeur de ton véhicule.

    Le machine learning c'est succès/échec, et le succès, c'est la vente du véhicule, pas la mise en ligne d'une petite annonce.

    En théorie, la théorie et la pratique c'est pareil. En pratique c'est pas vrai.

  • # Commencer par le commencement...

    Posté par . Évalué à 10 (+10/-0).

    Avant d'attaquer avec un système de machine learning, peut-être que quelques statistiques simples permettraient-elles de dégager des informations pertinentes. Par exemple, une matrice de corrélations puis une ACP donneraient sans doute des informations quant à l'existence de corrélations (linéaire) entre les données.
    Par ailleurs, comme dit plus haut, d'autres informations non présentes risquent d'être pertinentes : un véhicule vendu par un habitant du 3è arrondissement risque d'être légèrement plus cher que le même vendu par un campagnard corrézien.

  • # taille de l'échantillon

    Posté par . Évalué à 7 (+6/-1).

    200 annonces avec autant de variables, je suis pas sûr qu'une quelconque analyse donne quelque chose.

  • # GIGO

    Posté par . Évalué à 10 (+12/-0). Dernière modification le 07/03/19 à 09:17.

    Tu viens d'expérimenter le principe du GIGO : Garbage in, Garbage out. Tes données sont de très mauvaise qualité, puisqu'elles sont bruitées et biaisées par rapport au prix de vente. Ton modèle ne peut donc te donner théoriquement que le prix à mettre sur l'annonce pour être dans la moyenne, et pas le prix que tu peux espérer tirer de ton véhicule.

    Ensuite, le machine learning pour ce genre de trucs, c'est de la blague. Tu fais une régression multivariée, tu regardes éventuellement le fit pour vérifier si tu n'as pas besoin de termes quadratiques (mais avec si peu de données, c'est peu probable que tu voies quelque chose), et hop, c'est bon.

    Enfin, regarder l'erreur moyenne (le r2) seule ne te dit pas grand chose, parce qu'un bon ajustement peut être attribuable à de l'overfitting (si tu mets 200 variables dans ta régression, tu vas pouvoir prédire parfaitement tes données). Si tu ne veux pas utiliser d'outils statistiques traditionnels (style sélection de modèles), tu peux toujours faire de la validation croisée (fitter le modèle sur par ex. 90% de tes données, et estimer l'erreur sur les 10% restants). En général, c'est très déprimant.

    • [^] # Re: GIGO

      Posté par . Évalué à 3 (+1/-0).

      Merci pour ce retour. Est-ce que tu as une ressource qui explique la régression multivariée ? Est-ce que ça s'implémente facilement ou se trouve facilement dans une bibliothèque logicielle ?

      • [^] # Re: GIGO

        Posté par . Évalué à 4 (+2/-0). Dernière modification le 08/03/19 à 09:04.

        Pour la régression multivariée, n'importe quel bouquin de stats fera l'affaire. On en utilise tout le temps en biologie, donc une recherche Google sur "biostatistiques régression linéaire multiple" devrait te donner absolument toutes les bases mathématiques. La régression linéaire multiple étant une généralisation de la régression linéaire simple, il peut être plus pédagogique de commencer par la régression linéaire simple.

        Tout ceci est implémenté dans la librairie standard de R et je serais surpris que ce ne soit pas dans pandas.

        Ça, ce sont les sources. Le mouton que tu veux est dedans.

      • [^] # Re: GIGO

        Posté par . Évalué à 5 (+3/-0).

        Bah le mieux c'est de commencer par Wikipédia wp:Régression linéaire multiple. Mais c'est vraiment un outil de base, ça ne sert à rien de réimplémenter les choses soi-même (sauf à comprendre comment ça marche, peut-être). Sur le fond, c'est très simple, en une dimension, tu fais passer une droite dans ton nuage de points en minimisant les carrés des écarts, et en multivarié, ça revient à faire passer un plan (ou un hyperplan) dans un espace défini par deux (ou plus) variables.

    • [^] # Re: GIGO

      Posté par (page perso) . Évalué à 2 (+0/-0).

      Ouaip. Pour des données de même, une regression linéaire est probablement le mieux. Aussi, il peut centrer et normaliser les données, utiliser quelques features quadratiques, etc.

      Et la première chose à faire, là, c'est de plotter les données sur un graphe. Surtout avec si peu de dimensions, c'est fastoche à visualiser…

  • # Prix des pros vs prix des particuliers

    Posté par . Évalué à 3 (+2/-0).

    Je rejoins les autres commentaires en ajoutant un détail :
    la responsabilité du vendeur est plus importante si c'est un professionnel. Donc les annonces des pros sont plus chers (normal faut payer les commerciaux, mécano, locaux, taxes et il y a une plus value derrière : normalement moins de risque de mauvaises surprises)

    Qu'entend tu par même modèle ? Parle tu de la finition ? De la motorisation ? Exactement les mêmes options (jusqu'à la peinture métallique)

    Comme dit plus haut : tu veux vendre vite tu baisse le prix, tu as le temps tu peux essayer de laisser un prix plus haut, comme l'immobilier en fait. A noter que pour l'immobilier, tu peux aller sur le site des impôts et regarder dans les données public et regarder " Rechercher des transactions immobilières pour m’aider à estimer mon bien" qui permettent de voir à combien se sont vendus les biens (en France hors Alsace Moselle/Mayotte)

  • # suite 🏎

    Posté par . Évalué à 3 (+1/-0).

    Merci pour tous vos retours très éclairants.

    Je suis assez convaincu par ceux qui expliquent que le prix de vente affiché dans l'annonce ne présuppose pas du pris d'achat réel ni du temps mis pour trouver l'acheteur. Malheureusement je ne pense pas que cette information soit accessible contrairement aux transactions immobilières.
    Je me demande d'ailleurs comment la central ou l'argus font leurs côtes. Sûrement un pifomètre professionnel :)

    J'ai essayé d'ajouter des "features" comme la date de mise en ligne, la qualité pro/particulier du vendeur, la région de vente.
    J'ai essayé de changer l'algorithme de régression.
    Je parviens globalement aux mêmes résultats non pertinents.

    Je trouverai un meilleur cas d'expérimentation.

    • [^] # Re: suite 🏎

      Posté par . Évalué à 4 (+2/-0).

      Malheureusement je ne pense pas que cette information soit accessible contrairement aux transactions immobilières.

      Si tu as l'âme joueuse, tu peux peut-être faire un outil qui traque les petites annonces.

      => temps depuis lequel l'annonce est posée (apparemment tu le fais déjà)
      => analyse de la baisse du prix dans un v2 de l'annonce : excellente information
      => suppression de l'annonce : on peut partir du principe que la voiture a été vendue (c'est tout de même rare ceux qui finalement ne vendent plus), mais on ne pourra pas tenir compte d'une éventuelle négociation de dernière minute entre les deux parties. en voyant à quelle vitesse l'annonce a été supprimée on aurait ainsi un indice de "bonne affaire"

      En théorie, la théorie et la pratique c'est pareil. En pratique c'est pas vrai.

    • [^] # Réduction de l'échantillon

      Posté par . Évalué à 2 (+1/-0). Dernière modification le 11/03/19 à 13:45.

      Certains intervenants ont justement pointé du doigt le fait que l’échantillonnage soit très limité et, même si je suis d'accord, je vais aller à contre courant : pourquoi ne pas limiter les échantillons aux pros ? En théorie, un professionnel connaitra mieux le marché, il mettra en vente un véhicule en bonne condition, proposera souvent une garantie et les négociations sont plus difficiles qu'avec les particuliers. J'ai peut être tort mais j'imagine que les variations seront plus limitées.

      • [^] # Re: Réduction de l'échantillon

        Posté par . Évalué à 1 (+0/-0).

        On pourrait en contrepartie élargir l'échantillon aux véhicules de segments équivalents (voitures de différentes marques mais qui répondent aux mêmes besoin marchés) :

        • l'exemple le plus parlant : 108/C1/aygo ce sont des véhicules qui possèdent beaucoup de similitudes (normal les constructeurs ont collaboré entre eux)
        • Un exemple un peu moins vrai : clio/208 (de même que tous les véhicules renault vs peugeot : 5008/Scénic par exemple)

        Evidemment pour les voitures de collection, cet élargissement est impossible

      • [^] # Re: Réduction de l'échantillon

        Posté par . Évalué à 3 (+2/-0).

        J'ai essayé de faire une expérience similaire avec des sources provenant d'un autre site où il y a moins de particuliers¹ que le site d'où proviennent les données de l'auteur du journal. Le véhicule n'était pas le même (2 roues de plus) que celui analysé par l'auteur. J'ai pris 100 éléments par année pour 4 années différentes (100 pour 2015, 100 pour 2016, 100 pour 2017 et 100 pour 2018). Afin de réduire les écarts, le kilométrage du véhicule était limité (de 0 à 60000kms).

        La régression a été faite en utilisant LibreOffice Calc.

        Les résultats sont aussi peu concluants que ceux de l'auteur de ce journal. Par contre, avec le graphique des données, je peux facilement repérer les annonces qui semblent être de bonnes affaires ou placer l'estimation de mon véhicule par rapport aux autres.

        Titre de l'image

        ¹ Les professionnels proposent souvent une garantie sur le véhicule allant de 3 à 24 mois. Cette plus-value n'est pas prise en compte.

Envoyer un commentaire

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.