Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Cours] Entraînez un modèle prédictif linéaire

    Staff 2 août 2018 à 10:55:26

    Bonjour, et bienvenue dans la discussion dédiée au cours Entraînez un modèle prédictif linéaire

    N'hésitez pas à poser vos questions ici et à échanger les uns avec les autres !

    Si vous avez une question concernant le fonctionnement du cours (accès aux exercices, envoi des exercices, inscription au cours…), contactez directement OpenClassrooms à hello@openclassrooms.com

    Bon courage et à bientôt !

    Luc.

    • Partager sur Facebook
    • Partager sur Twitter
      3 août 2018 à 3:55:09

      Chrys38 a écrit:

      Le fait que lors de la description de la régression Ridge et lasso, il n'y est pas de distinction, entre Beta pré et poste régularisation.

      Il faudrait signifiais que les coefficients Beta poste Régu sont des coefficients dit : biaisé. 

      De plus l'explication mathématique à propos de la relation qui lie Alpha à Beta biaisé, n'est pas forcément  clair avec les matrice.

      Sans cela, il demeurait, dans mon cas, une impossibilité de comprendre pourquoi quand Alpha est grand faisait tendre vers 0, et quand Alpha tend vers 0 on se retrouve dans la solution de la régression linéaire. 

      J'ai trouvé à cette adresse , une relation entre Alpha , Beta non biaisé, et Beta biaisé: 

      https://onlinecourses.science.psu.edu/stat857/node/155/

      ce qui rend les chose beaucoup plus clair : 

      βridge=(n/n+λ)β.

      par contre je désirerais avoir un précision supplémentairement, si on prend un Alpha grand , en quoi cela rend négligeable le terme de la mean squad error , puisque même si Beta biaisé négligeable, ça n'influence pas les yi dans l'expression :

      (yixijβj)²

      -
      Edité par Chrys38 il y a moins de 5s



      -
      Edité par Chrys38 10 août 2018 à 12:36:13

      • Partager sur Facebook
      • Partager sur Twitter
        15 mai 2019 à 10:46:26

        J'ai beaucoup de questions sur le quiz de ce cours.

        Question 3 (calculer un bêta optimal à partir de 4 points donnés) :

        1° pour moi, sauf précision contraire, un "vecteur de paramètreS" optimal a deux dimensions : l'ordonnée à l'origine et le coefficient directeur de la droite de régression. Sauf si on suppose que les données sont centrées, ce qui n'est pas dit ici. Mais je suppose qu'il faut le comprendre comme une donnée implicite puisque le QCM ne propose que des réponses à 1 dimension ?

        2° Que je fasse le calcul à la main ou que je le fasse faire à scikit-learn ou à Excel, je trouve toujours 26. Si on ne considère pas a priori que les données sont centrées, je trouve 24. Or les réponses proposées sont 52, 13, 29 et 32. La correction ne m'aide pas beaucoup. Est-ce une erreur ou est-ce que j'ai mal compris ?

        Question 5 : Comment choisir au mieux l'hyperparamètre lambda (une seule réponse possible) ?
        Le cours donne un principe général, et le TP propose une autre méthode à titre pédagogique. Mais les deux approches permettent de choisir lambda "au mieux". Dès lors, comment choisir une réponse plutôt qu'une autre ?
        La question serait plutôt de savoir quelle est la méthode "usuelle".

        Question 9 : Le lasso est-il plus stable ou moins stable que Ridge ?
        Je me demande : plus stable ou moins stable par rapport à quoi ?
        - Le lasso est plus stable que Ridge par rapport aux données d'entraînement dans le sens où si elles changent un peu, les coefficients changent moins souvent (puisqu'on ignore certaines features).
        - Il est aussi plus stable que Ridge par rapport aux données de test dans le sens où si elles changent un peu, les prédictions changent aussi moins souvent (toujours pour la même raison).
        - Il est moins stable par rapport à l'hyperparamètre dans le sens où si l'hyperparamètre change un peu, certaines features peuvent disparaître au profit d'autres, et changer considérablement le modèle.
        Il ne m'a pas paru évident de savoir laquelle de ces 3 interprétations de la question était la bonne.

        -
        Edité par Zachee54 15 mai 2019 à 10:57:16

        • Partager sur Facebook
        • Partager sur Twitter
          25 mai 2019 à 10:16:58

          Dans le TP de la partie 2 ("Entraînez une régression logistique et une SVM linéaire"), je bute sur la courbe ROC de LinearSVC.

          1°) Dans la vidéo, on utilise

          y_pred = gsvm.predict(X_test)
          fpr, tpr, _ = roc_curve(y_test, y_pred)

          Bien que la vidéo utilise "y_prob" comme nom de variable, il s'agit bien de prédictions {0;1} et non d'une probabilité dans [0;1].
          Partant de ça, les valeurs transmises à roc_curve n'ont qu'un seul seuil. Il est donc normal que la courbe ROC ressemble à deux segments de droite.
          Mais du coup, la notion d'aire sous la courbe n'a plus de sens : à supposer que la régression logistique serait globalement moins performante (càd plus éloignée du coin supérieur gauche), comme on a plus de seuils on a de toute façon une courbe ROC plus arrondie que les deux segments de droite de LinearSVC, et donc on peut avoir une aire plus grande. Dans ces conditions, ce n'est pas du tout une bonne idée de mesurer la pertinence du modèle avec AUC !

          2°) Dans le code du TP (hors vidéo), on calcule cette fois la courbe ROC avec une variable y_prob qui n'a pas été calculée pour LinearSVC. Et on obtient une courbe ROC arrondie, qui n'a rien à voir avec celle de la vidéo mais qui ressemble furieusement à celle de la régression logistique après optimisation des hyperparamètres...
          De deux choses l'une :
          - ou bien le calcul de y_prob a été oublié dans le code du TP, et la courbe ROC présentée comme étant celle de LinearSVC est en fait celle de LinearRegression optimisé ;
          - ou bien y_prob a été calculé mais le code n'est pas retranscrit dans la page. Et dans ce cas, on n'a pas utilisé la fonction predict comme dans la vidéo puisqu'on a une courbe très différente.

          Mon avis (mais j'aimerais qu'on me le confirme) est que la courbe ROC n'a de sens qu'avec des probabilités dans [0;1], et non avec des prédictions dans {0;1}. Et pour obtenir des probabilités avec LinearSVC, il faut utiliser la fonction de décision non évoquée dans le cours :

          y_prob = gs_svm.decision_function(X_test)

          Il y a aussi plusieurs erreurs dans le code du TP, que je signale pour tout le monde :
          - "data" au lieu de "raw_data",
          - on définit à deux reprises y_pred pour LogisticRegression alors qu'on ne s'en sert pas,
          - import inutile de cross_val_score.

          • Partager sur Facebook
          • Partager sur Twitter
            28 mai 2019 à 16:59:42

            On va dire que je fais mon difficile, mais à nouveau je ne comprends pas l'activité de fin de cours sur la classification des feuilles d'arbres.
            En effet, le test set ne contient pas les étiquettes. Comment peut-on tester des différents modèles si on ne peut pas les comparer aux étiquettes réelles ??

            Ce dataset est extrait d'un défi Kaggle. Je comprends que s'agissant d'une compétition, les participants n'ont pas les réponses et le défi consiste justement à les deviner.
            J'ai l'impression que le défi Kaggle a été proposé en activité sur OpenClassrooms.com tel quel sans que l'auteur du cours ait réalisé qu'on avait besoin des réponses pour pouvoir s'auto-évaluer, et corriger les pairs.

            Il ne reste plus qu'à laisser tomber le test set d'origine et faire un train_test_split sur les données d'entraînement.

            Très franchement, ou bien je suis passé à côté de beaucoup de choses dans ce cours, ou bien il a été conçu à l'arrache et ce n'est vraiment pas sérieux. Si quelqu'un a des éclairages utiles suite à mes précédents posts, ça me serait très appréciable !

            • Partager sur Facebook
            • Partager sur Twitter
              29 mai 2019 à 16:21:21

              Il faut effectivement que tu entraînes ton modèle et sélectionne les paramètres sur le jeu de données d'entraînement uniquement, en splittant ce jeu en deux. Une fois que c'est terminé, tu pourras - tout à la fin - ré-entraîner ton modèle optimisé sur l'ensemble des données étiquetées et faire une prédiction des étiquettes des données de test (mais tu n'auras aucune façon de vérifier leur exactitude).

              • Partager sur Facebook
              • Partager sur Twitter
                13 octobre 2019 à 16:48:07

                Bonjour le Black Belt du ML ;-)

                Dans le tutoriel TP-Entraînez une régression logistique et une SVM linéaire il me semble qu'il y a un erreur avec l'exemple donnée pour l'application d'un modèle SVM linéaire.

                L'example donné:

                from sklearn.svm import LinearSVC

                from sklearn.model_selection import GridSearchCV

                from sklearn.metrics import roc_curve, auc

                svm = LinearSVC()   ### Alors le svm ici ?!? 

                params = { 'C': np.logspace(-3, 3, 7) }

                gs_svm = GridSearchCV(lr, params, cv=10)   #### lr ??? 

                gs_svm.fit(X_train, y_train)

                print(gs_svm.best_params_)

                Vous remarquez dans les paramètres du Grid que le modèle c'est "lr" et non pas "svm" 

                Autrement dit, on tune notre modèle sur avec une Régression  logistique et nom pas avec une SVM linéaire, correct?

                Ou peut-être je me trompe :(


                • Partager sur Facebook
                • Partager sur Twitter

                Carlos C.

                  13 octobre 2019 à 19:14:26

                  CarlosCarvalho a écrit:

                  Vous remarquez dans les paramètres du Grid que le modèle c'est "lr" et non pas "svm"

                  Oui, je crois que tu as raison. Ce sont les dangers du copier-coller !

                  • Partager sur Facebook
                  • Partager sur Twitter
                    14 octobre 2019 à 10:36:41

                    Oui, c'est bien une erreur.
                    Ce n'est ni la première ni la dernière, mais heureusement on arrive à peu près à les repérer pourvu qu'on ait compris le cours.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      30 octobre 2019 à 18:58:44

                      A propos de ce que dit Zachee54 sur la courbe ROC :

                      Il y a une confusion dans le cours à propos de l'utilisation du roc. (D'ailleurs c'est dommage d'utiliser un outil dans un cours sans le présenter). Le but du roc c'est, étant donné des points étiquetés 0/1 d'une part et d'autre étiquetés par une proba, de regarder le nombre de faux positifs et vrais positifs qu'on trouve EN FONCTION du seuil à partir duquel on assigne un 1 à un point. La courbe s'interprete donc comme ca : le point tout en bas a gauche correspond à un seuil >1 et tous les points sont prédits à 0, donc on a 0 vrai positif et 0 faux positif. Le point "coude" correspond à ce qu'on pourrait penser être le bon seuil (a peu pres 0.5) -> Beaucoup de vrais positifs et pas trop de faux positifs, et le point en haut a droite on a un seuil 0 donc que des positifs. 

                      Dans le cours vidéo il met en entrée de la fonction des predictions dans {0,1} et pas des probas. Donc utiliser le roc dans le cadre du svm n'a aucun intérêt, voire aucun sens ! Il dit que la courbe ressemble plus à deux segments parce qu'il y a moins de données -> non pas du tout, c'est effectivement deux segments de droite car il n'y a que trois points qui correspondent à trois seuils : 2, un seuil entre 0 et 1 quelconque, et 0. 

                      Sinon j'ai une question de modélisation, est-ce que ca a vraiment du sens de transformer toutes les variables catégorielles en int comme ca ??

                      Déjà our les variables qui ont plus de 3 catégories, on est en train de dire qu'on peut les ordonner, bon c'est surement le cas sinon j'imagine qu'on aurait fait d'autres variables (mais bon a voir avec le gars qui a produit les données) ?

                      Mais en plus vu qu'on a utilisé le même labelencoder pour toutes les features, on arrive à des trucs bizarres genre l'odeur ca peut etre 0,3,5,6. 

                      Bon pour juste appliquer les outils on se fout un peu de l'interprétation mais en vrai on est d'accord que ca veut rien dire ?


                      -
                      Edité par charox 31 octobre 2019 à 16:30:12

                      • Partager sur Facebook
                      • Partager sur Twitter
                        31 octobre 2019 à 9:30:52

                        Le LabelEncoder permet de manipuler des entiers plutôt que du texte ou n'importe quoi d'autre, parce que c'est plus simple, plus économique en mémoire et que c'est standardisé.

                        Bien sûr il ne faut pas en faire une interprétation en disant que "6" c'est deux fois plus que "3", on est d'accord que ça ne veut rien dire. De même, tu ne vas pas faire de "moyenne" sur des labels. Je ne pense pas non plus que ça ait du sens de les ordonner (quoique... rien ne l'empêche, s'il existe un ordre naturel dans les classes de départ).

                        En revanche tu peux prédire que le label "6" a \(x\) fois plus de chances de correspondre à ton item que le label "3".

                        • Partager sur Facebook
                        • Partager sur Twitter
                          31 octobre 2019 à 15:20:39

                          Ben oui mais justement vu qu'on fait de la régression linéaire (a peu de choses pres), 6 c'est effectivement 2 fois plus que 3. S'il y a que deux labels c'est pas grave, mais s'il y en a plus ca me semble poser un problème. Je prends un cas extrême : suppose qu'on a une feature avec trois labels possibles 1, 999 et 1000. Alors la régression ne sera pas capable de distinguer l'effet de la différence entre les deux derniers et tout se passera comme s'il n'y avait que deux labels. Mais bon apres tout, vu qu'on a pas d'info sur les variables, c'est a priori aussi absurde de les mettre en progression arithmétique (1,2,3)

                          Enfin je crois ... haha

                          -
                          Edité par charox 31 octobre 2019 à 15:21:24

                          • Partager sur Facebook
                          • Partager sur Twitter
                            31 octobre 2019 à 18:46:45

                            Relis le cours : ça s'appelle "régression", mais c'est une classification. Les mots sont trompeurs.

                            La régression logistique sert uniquement à faire une classification binaire (avec deux classes). Quand on a plus de deux classes, on fait tourner la régression logistiques plusieurs fois sur des classes prises deux à deux, avec un algorithme One-Versus-One ou One-Versus-Rest.

                            • Partager sur Facebook
                            • Partager sur Twitter
                              31 octobre 2019 à 19:44:01

                              Je sais ce que c'est qu'une régression logistique ;)

                              Je parle pas du résultat (y), mais des variables explicatives (les colonnes de X).

                              Je détaille..

                              La régression trouve un vecteur de poids b et ta prédiction c'est une fonction de la combinaison linéaire de ces poids b avec le vecteur x qui contient les variables de ton point à classifier. Jusque là pas d'embrouille ! Dans le cas du TP, dans X tu retrouves par exemple l'odeur avec plusieurs niveaux possibles (p, a, l, n). L'encodeur derriere va transformer p, a, l, n en 0, 3, 5, 6 (mais pour l'exemple on va dire que c'est 0,1,99,100). Tu fais ta régression et elle te donne donc un certain poids b_o qui correspond à l'effet de l'odeur sur ce qu'on veut classifier (le fait qu'il soit mangeable ou pas). Ensuite quand tu vas vouloir classifier un point qui a pour odeur od, tu vas calculer ta combinaison linéaire bx puis faire la transformation logistique pour en déduire la proba etc.. Et tu vois que dans la combinaison linéaire, l'effet de l'odeur c'est exactement od*b_o. De là tu vois bien que tu auras un effet similaire pour od = 0 ou 1 d'une part et od = 99 ou 100 de l'autre. Autrement dit on a créé artificiellement deux classes au sein de la variable odeur.

                              -
                              Edité par charox 31 octobre 2019 à 19:45:54

                              • Partager sur Facebook
                              • Partager sur Twitter
                                1 novembre 2019 à 16:49:14

                                Salut charox

                                charox a écrit:

                                Il dit que la courbe ressemble plus à deux segments parce qu'il y a moins de données -> non pas du tout, c'est effectivement deux segments de droite car il n'y a que trois points qui correspondent à trois seuils : 2, un seuil entre 0 et 1 quelconque, et 0.

                                Je dis exactement la même chose que toi : la courbe correspond à deux segments de droite parce qu'on ne fournit que des valeurs 0 ou 1. On se comprend ?

                                charox a écrit:

                                Mais en plus vu qu'on a utilisé le même labelencoder pour toutes les features, on arrive à des trucs bizarres genre l'odeur ca peut etre 0,3,5,6.

                                OK, ce qui te gêne c'est que le LabelEncoder soit utilisé pour des features et pas pour des classes.

                                C'est vrai, je n'y avais pas fait attention dans ce TP.

                                Un bon article sur le sujet : http://www.stephacking.com/encode-categorical-data-labelencoder-onehotencoder-python/

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  1 novembre 2019 à 18:27:33

                                  Pour le ROC oui j'essayais de confirmer ce que tu disais !

                                  Pour le LabelEncoder voila l'article correspond à ce que je disais, meme si je comprends pas bien ce que tu veux dire ici :


                                  Zachee54 a écrit:

                                  OK, ce qui te gêne c'est que le LabelEncoder soit utilisé pour des features et pas pour des classes.

                                  Je reformulerais autrement : ce qui me dérange c'est d'appliquer le LabelEncore a des features qui sont organisées en (plus de 2) classes! Exemple la feature odeur a 4 classes p, a, l et n.

                                  -
                                  Edité par charox 1 novembre 2019 à 18:38:53

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    2 novembre 2019 à 7:53:01

                                    Oui c'est ça.

                                    On peut appliquer un LabelEncoder sur des features qui ne contiennent que deux valeurs différentes.

                                    Ce que je voulais dire :
                                    On peut aussi appliquer un LabelEncoder sur les classes à prédire (la colonne \(y\) du dataset), puisque de toute façon on n'applique la régression logistique que sur une partition binaire de l'ensemble des classes : la classe \(a\) vs. la classe \(b\) (OVO), ou la classe \(a\) vs. toutes les autres classes (OVR), etc.

                                    Quel que soit le nombre de classes dans le dataset, on n'a jamais plus de deux classes dans la même régression logistique puisque c'est un classifieur binaire.
                                    Donc pas de problème pour encoder \(y\), comme c'est le cas dans ce TP pour les valeurs \(p\) (poisonous) et \(e\) (edible) qu'on encode en 0 et 1.
                                    Mais ne me demande pas quel intérêt ça a, parce que je crois qu'on aurait aussi bien pu travailler avec \(p\) et \(e\)...

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      14 novembre 2019 à 16:28:05

                                      Bonjour,

                                      J'ai une petite question à propos du TP de la partie 1, sur les méthodes Ridge et Lasso pour la régression. J'ai essayé d'optimiser la valeur de l'hyperparamètre à l'aide d'une validation croisée (GridSearchCV, RidgeCV, LassoCV et même ma propre fonction développée lors d'un cours précédent). Le résultat est quasiment toujours le même et c'est alpha = 1.e-5 qui ressort de ces algos de validation croisée, donc bien loin du alpha = 10 (environ) qui ressort lorsqu'on teste directement sur les données de test. Si je ne splitte pas les échantillons (cv = none dans RidgeCV et LassoCV) j'ai un alpha encore différent.

                                      Je me dis donc que je me suis planté quelque part, ou alors que la validation croisée n'est peut-être ici pas préconisée car peu de données. Qu'en pensez-vous ?

                                      D'avance merci pour vos retours !

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        14 novembre 2019 à 16:55:46

                                        Avec moins de 100 échantillons (60 seulement dans le train set !), si tu ajoutes une validation croisée le résultat sera forcément très aléatoire. À mon avis il ne faut pas chercher plus loin.

                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          21 novembre 2019 à 10:54:37

                                          Bonjour,

                                          Merci pour ta réponse, c'est bien ce que je me disais :)

                                          J'en suis au TP de classification sur les champignons. Par curiosité j'ai comparé SVM et la régression logistique à KNN, avec "accuracy score" en critère, et un seuil de 0.5 pour la régression logistique. Le résultat m'a pas mal surpris, je trouve une précision de 1 sur le KNN (optimisé avec GridSearchCV), 0.96 pour la régression logistique et 0.94 pour la SVM. Moi qui pensait que KNN n'était pas sensé être un très bon algo...

                                          Qu'en pensez-vous ? Avez-vous aussi testé KNN ?

                                          • Partager sur Facebook
                                          • Partager sur Twitter

                                          [Cours] Entraînez un modèle prédictif linéaire

                                          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                          • Editeur
                                          • Markdown