Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Cours] Sélection de modèle en machine learning

Évaluez et améliorez les performances d'un modèle de machine learning

    1 mars 2017 à 17:41:52

    Bonjour, et bienvenue dans la discussion dédiée au cours Évaluez et améliorez les performances d'un modèle de machine learning !

    Dans ce cours, vous allez apprendre à évaluer un modèle de machine learning, et à sélectionner le modèle qui convient le mieux à votre problème.

    N'hésitez pas à poser vos questions ici et à échanger les uns avec les autres ! Je ferai de mon mieux pour vous répondre régulièrement.

    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 !

    Chloé.

    • Partager sur Facebook
    • Partager sur Twitter
      18 mai 2017 à 11:52:45

      Bonjour,

      Si j'ai bien compris le cours, la validation croisée utilise l'intégralité du jeu de données, en le découpant en plusieurs parties qui serviront successivement de testing set.

      Dans ce cas, à quoi sert la séparation préalable des données en un jeu de données et un jeu d'entrainement, puisque ceux-ci vont varier au cours de la validation croisée ?

      Merci d'avance pour votre retour.

      Frédérik

      Edit (petite précision sur ma question précédante) :
      Quelle est la taille d'un testing set sur 1 fold ?  Est-ce [Nombre d'échantillons] / [Nombre de folds]  ou plutôt un ratio que l'on définit ?

      Dans le 1er cas, pourquoi ajouter le code :

      X_train, X_test, y_train, y_test = \
      	model_selection.train_test_split(X, y_class,
                                      	test_size=0.3 # 30% des données dans le jeu de test
                                      	)

      Dans le 2ème cas, certains échantillons peuvent se retrouver dans plusieurs testing set, ce qui ne correspond pas à la phrase du cours "À la fin, chaque point (ou observation) a servi 1 fois dans un jeu de test, (k-1) fois dans un jeu d'entraînement."

      -
      Edité par FrédérikVarlet 19 mai 2017 à 11:05:19

      • Partager sur Facebook
      • Partager sur Twitter
        7 juin 2017 à 11:38:50

        Bonjour,

        La séparation entre jeu d'entraînement et jeu de test a un but différent de la séparation en jeu d'entraînement et jeu de validation. Dans le premier cas (entraînement/test), il s'agit d'évaluer la capacité du modèle choisi à généraliser : comment va-t-il se comporter sur de nouvelles données que l'on a jamais vues ? Dans le deuxième (entraînement/validation), il s'agit de sélectionner l'algorithme d'apprentissage (soit l'algorithme lui-même, par ex. réseau de neurones ou algorithme kNN, soit ses hyper-paramètres, par ex. nombre de couches du réseau de neurones ou nombre de voisins dans le kNN.) qui donnera un modèle optimal.

        Dans l'exemple choisi, le jeu de données est séparé en un jeu d'entraînement qui contient 70% des données et un jeu de test qui contient les 30 autres pourcents. C'est ensuite le jeu d'entraînement (X_train, y_train) sur lequel on fait une validation croisée (séparation répétée en un sous-jeu d'entraînement et jeu de validation). La taille d'un test set sur un fold fait bien [Nombre d'échantillons] / [Nombre de folds].

        J'espère que c'est plus clair !

        • Partager sur Facebook
        • Partager sur Twitter
          11 juillet 2017 à 16:04:29

          Est-ce qu'une version ebook du cours est prévue ?
          • Partager sur Facebook
          • Partager sur Twitter
            18 juillet 2017 à 14:19:32

            Dans le chapitre "Comparez votre algorithme à des approches de régression naïves", il y a des petites erreurs de copier/coller :

            • dans l'appel à train_test_split : le code référence "y_class" au lieu de "y"
            • il manque plusieurs imports : sklearn.preprocessing et sklearn.metrics, matplotlib...

            Et, c'est peut-être l'effet de Chrome, mais l'extrait de code avec l'accumulation pour déterminer la taille des ronds n'est pas indenté.

            • Partager sur Facebook
            • Partager sur Twitter
              21 août 2017 à 13:12:57

              .

              -
              Edité par AlanC 18 septembre 2017 à 13:19:06

              • Partager sur Facebook
              • Partager sur Twitter
                17 octobre 2017 à 15:36:58

                Bonjour,

                Après la validation du modèle calculé sur 70 % du jeu de données totales (X_train), peut-on rejouer un modèle avec la totalité de du jeu de données pour augmenter la généralisation du modèle ?

                -
                Edité par NicolasMejane 17 octobre 2017 à 15:38:09

                • Partager sur Facebook
                • Partager sur Twitter
                  27 mars 2018 à 10:29:32

                  Pour l'activité "Implémentez une validation croisée", je ne suis pas sûre de comprendre le mot "implémentez".

                  Habituellement, je comprends "implémenter" comme "utiliser"

                  Pouvez vous confirmer qu'il s'agit ici d' écrire une fonction qui pourrait remplacer gridSearchCV de scikit learn si elle n'existait pas déjà ?

                  merci.

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Catalyseur d'innovation digitale pour des responsables opérationnels passionnés par leur métier.
                    28 mars 2018 à 16:00:08

                    @BrigitteMaillère :
                    En informatique, le terme « implémenter » signifie généralement « programmer » ou « mettre en place » et non pas « utiliser » ! (L'académie propose « effectuer l’ensemble des opérations qui permettent de définir un projet et de le réaliser », le Wiktionnaire « Traduire un algorithme dans un langage de programmation », nous ne sommes donc pas les seuls à le penser !).

                    Donc oui, il s'agit bien d'écrire une validation croisée vous-même sans utiliser gridSearchCV.

                    @NicolasMejane :

                    Oui, c'est l'idée. Cependant remarquez bien que vous ne serez pas en mesure de mesurer la généralisation.

                    -
                    Edité par cazencott 28 mars 2018 à 16:05:49

                    • Partager sur Facebook
                    • Partager sur Twitter
                      6 avril 2018 à 9:16:35

                      Bonjour, une question pour l'exercice d'implémentation d'une validation croisée:

                      Je n'arrive pas à ne pas randomiser la selection des sets pour pouvoir comparer les résultats avec ma propre implémentation.

                      J'ai essayé plusieurs solutions dont la suivante:

                      clf = model_selection.GridSearchCV(neighbors.KNeighborsClassifier(), # un classifieur kNN
                      param_grid, # hyperparamètres à tester
                      cv=model_selection.KFold(n_splits=5,shuffle=False), # nombre de folds de validation croisée
                      scoring=score # score à optimiser
                      )

                      En copiant exactement le code du TP et en ne modifiant que les lignes citées ci-dessus j'ai pourtant à chaque fois que je lance le script des résultats différents pour l'hyperparamètre k et des accuracy différentes.

                      Je voudrais qu'à chaque fois que je lance le script les résultats soient exactement les mêmes afin de pouvoir remplacer l'appel à GridSearchCV avec ma fonction CustomGridSearchCV.

                      Merci d'avance.

                      EDIT: parmi mes tentatives, j'ai essayé d'utiliser un seed en prenant comme paramètres shuffle=True et random_state=123 sans que cela ne fonctionne non plus.

                      -
                      Edité par Shravan1804 6 avril 2018 à 10:27:05

                      • Partager sur Facebook
                      • Partager sur Twitter
                        9 avril 2018 à 15:39:56

                        L'option shuffle=False devrait fonctionner, et d'ailleurs en utilisant votre code j'obtiens toujours le même résultat. Vous pouvez vérifier les folds créés en utilisant :

                        for train_index, test_index in cv.split(X):
                            print("TRAIN:", train_index, "TEST:", test_index)


                        • Partager sur Facebook
                        • Partager sur Twitter
                          12 avril 2018 à 10:02:27

                          Je vous remercie pour votre réponse.

                          Vous avez raison, les folds sont les mêmes à chaque fois que je lance et relance le code.

                          Le KNN ne donnait pas les même résultats car je séparais à chaque fois le training set du test set sans utiliser de seed.

                          Encore merci.



                          • Partager sur Facebook
                          • Partager sur Twitter
                            13 avril 2018 à 17:45:56

                            Bonjour,

                            Concernant le dernier exercice "Sélectionnez le nombre de voisins dans un kNN pour une régression:

                            le lien indiqué pour "le second dataset" semble, d'après le nom du lien, être le dataset des vins rouges (winequality-red.csv),

                            Pourtant le téléchargement renvoie la dataset des vins blancs. Lequel devons nous prendre ?


                            Victor

                            • Partager sur Facebook
                            • Partager sur Twitter
                              Staff 16 avril 2018 à 19:04:22

                              Bonjour,

                              Merci d'avoir remonté ce bug. Le lien est corrigé !

                              Cordialement,

                              LB.

                              • Partager sur Facebook
                              • Partager sur Twitter
                                7 mai 2018 à 8:28:53

                                Bonjour,

                                Dans le cours "Évaluez un algorithme de classification qui retourne des scores", j'ai une question avec l'antispécificité à cette ligne:

                                Comme aucune observation n'est prédite positive, notre sensibilité (qui est le taux de vrais positifs TP/P) est égale à 0, de même que l'antispécificité (qui est le taux de faux positifs FP/P).

                                Je ne vois pas comment déduire FP/P algébriquement en utilisant la formule de la spécificité du cours précédent à savoir TN/(TN+FP) ou TN/N.

                                Or avec 1 - TN/N, j'arrive à FP/N et non pas FP/P.

                                Merci d'avance.

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  13 juin 2018 à 17:49:48

                                  Bonjour,

                                  La fonction de sklearn "r2_score" pour calculer le coefficient de détermination ne fonctionne pas avec ma version de python.

                                  Je code avec Jupyter Notebook, python 3.4. Existe t-il une autre fonction qui marchera  avec cette version?

                                  En vous remerciant par avance.

                                  -
                                  Edité par FatouDrame1 17 juillet 2018 à 17:33:24

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    7 juillet 2018 à 19:02:18

                                    bonjour, 
                                    pour l'exemple de plot scatter size que vous donnez ici : https://openclassrooms.com/courses/4297211-evaluez-et-ameliorez-les-performances-dun-modele-de-machine-learning/4308281-comparez-votre-algorithme-a-des-approches-de-regression-naives#/id/r-4334448

                                    i
                                    l semblerais  que ".has_khey" ne soit pas implémenté en python3 mais remplacé par "in".

                                    J'ai donc essayé de remplacer 

                                    if sizes.has_key((yt, yp)):

                                    qui renvoie l'erreur : AttributeError: 'dict' object has no attribute 'has_key'

                                    par

                                    if (yt, yp) in sizes:

                                    et j'obtiens l'erreur  : 

                                    TypeError: unhashable type: 'numpy.ndarray'

                                     Comment régler ce problème merci d'avance



                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                    Anonyme
                                      31 juillet 2018 à 15:21:51

                                      c'est bon j'ai pu régler mon problème c'est juste la library qui a subit des changement il faut , utiliser la nouvelle méthode pour .has_khey
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        16 août 2018 à 5:45:25

                                        C'est en forgeant qu'on devient forgeron, j'avais plein de questions au début de l'activité 1, à la faire, j'ai compris...

                                        -
                                        Edité par GaranceRichard1 16 août 2018 à 10:58:44

                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          2 septembre 2018 à 15:14:46

                                          Quiz question 8.

                                          Bonjour, je ne comprends pas le corrigé de cette question.

                                          En effet, il vaut mieux utiliser le paramètre constant, mais d'après votre cours, étant donnée que la classe majoritaire est négative, il faudrait utiliser un classifieur de classe négative? Pourquoi positive?

                                          Crdt, José

                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                          José Castro
                                            22 mai 2019 à 15:49:15

                                            Bonjour

                                            Pour l'activité 1 (sur l'implémentation de la validation croisée), devons-nous également ré-implémenter la fonction KFold de sélection des plis ?

                                            model_selection.KFold(n_splits=n_folds,shuffle=False)

                                            Ou bien pouvons-nous la réutiliser dans notre code ?

                                            Merci d'avance et bonne journée.

                                            Christophe

                                            -
                                            Edité par Christophe Lebrun du Puytison 22 mai 2019 à 15:49:46

                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              3 septembre 2019 à 14:26:57

                                              ---

                                              -
                                              Edité par giuseppebellavia 3 septembre 2019 à 14:46:12

                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                6 septembre 2019 à 18:29:55

                                                Bonjour,

                                                Je ne comprends absolument pas l'objet du TP "Implémentez une validation croisée"

                                                Si j'en crois les messages précédents, le but est de réécrire gridSearchCV.

                                                Or, rien dans le cours n'indique comment coder un objets de classe sklearn.model_selection._search.GridSearchCV ou quoi que ce soit de comparable.

                                                S'il me parait assez facile de bricoler une grille de résultats avec une simple boucle for dans laquelle on testerait chaque valeur des hyperparamètres présents dans la grille en entrée et les données, 

                                                je ne sais en revanche, absolument pas quel sorte d'objet est ce gridSearchCV et donc comment je peux, en deux temps, d'abord définir cette chose avec une grille d'hyperparamètres puis, dans un second temps, y passer des données pour obtenir les résultats attendus.

                                                Ai-je raté quelque chose ? Je ne vois vraiment pas le rôle que joue ce tp dans le cours. Ce serait comme nous demander de coder un nouveau modèle random Forest alors que la seule chose qui importe ici, c'est de savoir comment l'utiliser.

                                                J'aimerais vraiment pouvoir croire que c'est vraiment le bricolage évident qui est demandé ici, mais l'exercice demande explicitement à ce que la fonction ne prenne que le tableau des hyperparamètres et folds en entrée, ce qui indique donc implicitement que l'on a pas le droit d'y mettre également les données.

                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  12 septembre 2019 à 13:42:21

                                                  Shadourow a écrit:

                                                  Ce serait comme nous demander de coder un nouveau modèle random Forest alors que la seule chose qui importe ici, c'est de savoir comment l'utiliser.

                                                  Je ne suis pas d'accord : pour bien l'utiliser, il faut l'avoir bien compris. L'intérêt est justement de le réécrire soi-même pour mieux comprendre comment ça fonctionne. C'est comme ça qu'on apprend le mieux, et c'est le but de l'activité.

                                                  Shadourow a écrit:

                                                  J'aimerais vraiment pouvoir croire que c'est vraiment le bricolage évident qui est demandé ici, mais l'exercice demande explicitement à ce que la fonction ne prenne que le tableau des hyperparamètres et folds en entrée, ce qui indique donc implicitement que l'on a pas le droit d'y mettre également les données.

                                                  Quand on dit que la fonction doit prendre en arguments les hyperparamètres et le nombre de folds, c'est parce qu'on veut que tu implémentes une fonction assez souple pour n'importe quels hyperpamètres, arbitrairement nombreux, et pour n'importe quel nombre de folds.

                                                  La façon dont ta fonction accède aux données et au classifieur n'a aucune importance. Tu n'es pas évalué là-dessus.

                                                  Shadourow a écrit:

                                                  je ne sais en revanche, absolument pas quel sorte d'objet est ce gridSearchCV et donc comment je peux, en deux temps, d'abord définir cette chose avec une grille d'hyperparamètres puis, dans un second temps, y passer des données pour obtenir les résultats attendus.

                                                  GridSearchCV est un wrapper, c'est-à-dire qu'il se comporte comme un classifieur alors qu'il ne fait que modifier le comportement du classifieur que tu lui donnes. Donc il doit implémenter les fonctions habituelles des classifieurs (fit, predict, etc). Rien de plus.

                                                  Tu peux construire une classe Python. Ca, ce serait le plus élégant.

                                                  Mais si tu veux faire simple, il suffit d'une fonction qui prend les hyperparamètres et le nombre de folds. Tu peux récupérer les données et le classifieur soit dans des arguments supplémentaires de ta fonction, soit dans des variables globales auxquelles ta fonction accède naturellement.

                                                  Shadourow a écrit:

                                                  S'il me parait assez facile de bricoler une grille de résultats avec une simple boucle for dans laquelle on testerait chaque valeur des hyperparamètres présents dans la grille en entrée et les données,

                                                  Chiche ! Ce n'est pas difficile mais c'est ce qu'on te demande. Et des fois on tombe sur un problème auquel on n'a pas pensé.
                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    11 novembre 2019 à 20:57:25

                                                    Bonjour

                                                    J'aurai plusieurs questions :

                                                    Première question, cette partie là du code du TP ne fonctionne pas : (ne serait-ce que les print "" qui decvrait etre remplacés par des print() )

                                                    # Optimiser ce classifieur sur le jeu d'entraînement
                                                    # clf.fit(X_train, y_train)
                                                    clf.fit(X_train_std, y_train)

                                                    # Afficher le(s) hyperparamètre(s) optimaux
                                                    print "Meilleur(s) hyperparamètre(s) sur le jeu d'entraînement:",
                                                    print clf.best_params_

                                                    # Afficher les performances correspondantes
                                                    print "Résultats de la validation croisée :"
                                                    for mean, std, params in zip(clf.cv_results_['mean_test_score'], # score moyen
                                                    clf.cv_results_['std_test_score'], # écart-type du score
                                                    clf.cv_results_['params'] # valeur de l'hyperparamètre
                                                    ):
                                                    print "\t%s = %0.3f (+/-%0.03f) for %r" % (score, # critère utilisé
                                                    mean, # score moyen
                                                    std * 2, # barre d'erreur
                                                    params # hyperparamètre
                                                    )

                                                    Je ne comprend pas la ligne "print "\t%s = %0.3f (+/-%0.03f) for %r" % (score, # critère utilisé"

                                                    Deuxième question, concernant l'énoncé de l'exercice :

                                                    - devons nous recoder entièrement la fonction de validation croisée, ou alors pouvons nous implémenter quelque chose d'existant (par exemple, basé sur Kfolds) ?

                                                    Troisième question :

                                                    -  un script utilisant la librairie cross_val_score serait-elle recevable ? Cela a l'air moins lourd que StratifiedKfolds....

                                                    - quatrième question, concernent le second exercice (Sélectionnez le nombre de voisins dans un kNN pour une régression) : que faut-il faire au juste ?

                                                    J'ai créé un script qui compare un régrésseur bayésien naif et un régrésseur KNN, dont je détermine le nombre de voisins par gridsearchCV...

                                                    Je les compare en sortant le R2 et la RMSE.

                                                    Est-ce ce qui est attendu ?

                                                    Cordialement

                                                    -
                                                    Edité par RichardChazal1 12 novembre 2019 à 0:17:20

                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                      12 novembre 2019 à 15:15:11

                                                      RichardChazal1 a écrit:

                                                      Première question, cette partie là du code du TP ne fonctionne pas : (ne serait-ce que les print "" qui decvrait etre remplacés par des print() )

                                                      Je n'ai pas pris le temps de retaper le TP. Tu peux nous dire directement ce qui ne marche pas une fois que tu as corrigé la syntaxe des print ?

                                                      RichardChazal1 a écrit:

                                                      Je ne comprend pas la ligne "print "\t%s = %0.3f (+/-%0.03f) for %r" % (score, # critère utilisé"

                                                      Cette ligne est à lire avec les suivantes. C'est une instruction qui a été étalée sur plusieurs lignes pour des raisons de lisibilité :

                                                      print("\t%s = %0.3f (+/-%0.03f) for %r" % (score, mean, std * 2, params))

                                                      Elle affiche une tabulation, le critère de score, la moyenne et la marge d'erreurs arrondies à 3 décimales, puis l'hyperparamètre.

                                                      RichardChazal1 a écrit:

                                                      - devons nous recoder entièrement la fonction de validation croisée, ou alors pouvons nous implémenter quelque chose d'existant (par exemple, basé sur Kfolds) ?

                                                      Tu dois implémenter l'algorithme de validation croisée, donc sans utiliser GridSearchCV ni une fonction équivalente.

                                                      Par contre tu peux te servir de KFold pour créer les folds. Fais juste attention à ce qu'ils ne soient pas randomisés, c'est important.

                                                      RichardChazal1 a écrit:

                                                      -  un script utilisant la librairie cross_val_score serait-elle recevable ? Cela a l'air moins lourd que StratifiedKfolds....

                                                      Non. C'est justement une fonctionnalité similaire à cross_val_score qu'il faut réimplémenter.

                                                      StratifiedKFolds utilise une division en folds efficace mais compliquée. Je ne vois pas l'intérêt de se compliquer la vie avec ça pour cet exercice.

                                                      RichardChazal1 a écrit:

                                                      - quatrième question, concernent le second exercice (Sélectionnez le nombre de voisins dans un kNN pour une régression) : que faut-il faire au juste ?

                                                      Implémenter un grid search comme dans la précédente activité, choisir le meilleur hyperparamètre et comparer les résultats avec une baseline.

                                                      RichardChazal1 a écrit:

                                                      J'ai créé un script qui compare un régrésseur bayésien naif et un régrésseur KNN, dont je détermine le nombre de voisins par gridsearchCV...

                                                      Je les compare en sortant le R2 et la RMSE.

                                                      Est-ce ce qui est attendu ?

                                                      Oui, sauf qu'on te demande la MSE et pas la RMSE. Ce n'est pas très grave mais c'est toujours mieux de suivre l'énoncé à la lettre (je ne sais plus si on peut perdre des points pour ça).

                                                      Je reste sceptique sur le choix de ta baseline. Ce n'est pas parce que les régresseurs bayésiens s'appellent "naïfs" que ce sont des baselines. Au contraire, ce peuvent être de très bons régresseurs !
                                                      On les appelle "naïfs" parce qu'il partent du postulat que toutes les features sont indépendantes, ce qui en réalité est rarement le cas.

                                                      Une bonne baseline est un régresseur stupide qui fait des prédictions sans intérêt : tellement simples que tu aurais pu faire les mêmes à l'école primaire sans avoir besoin d'être data scientist. Si tu as des résultats moins bons que le baseline, c'est que tu as travaillé (vraiment) pour rien.

                                                      Si tu as des résultats moins bons qu'un bayésien, ça ne veut pas forcément dire que tu as travaillé pour rien mais seulement que tu ferais mieux d'utiliser un NaiveBayes parce qu'il est plus adapté à ton problème.

                                                      -
                                                      Edité par Zachee54 12 novembre 2019 à 15:23:19

                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                        13 novembre 2019 à 11:09:24


                                                        Je n'arrive pas à mettre en forme la citation...

                                                        cette partie là fonctionne bien :

                                                        import pandas as pd

                                                        import numpy as np

                                                        import matplotlib.pyplot as plt

                                                        data = pd.read_csv('winequality-white.csv', sep=";")

                                                        print data.head()

                                                        X = data.as_matrix(data.columns[:-1])

                                                        y = data.as_matrix([data.columns[-1]])

                                                        y = y.flatten()

                                                        y_class = np.where(y<6, 0, 1)

                                                        from sklearn import model_selection

                                                        X_train, X_test, y_train, y_test = \

                                                        model_selection.train_test_split(X, y_class,

                                                                                       test_size=0.3 # 30% des données dans le jeu de test)

                                                        from sklearn import preprocessing

                                                        std_scale = preprocessing.StandardScaler().fit(X_train)

                                                        X_train_std = std_scale.transform(X_train)

                                                        X_test_std = std_scale.transform(X_test)

                                                        from sklearn import neighbors, metrics

                                                        # Fixer les valeurs des hyperparamètres à tester

                                                        param_grid = {'n_neighbors':[3, 5, 7, 9, 11, 13, 15]}

                                                        # Choisir un score à optimiser, ici l'accuracy (proportion de prédictions correctes)

                                                        score = 'accuracy'

                                                        # Créer un classifieur kNN avec recherche d'hyperparamètre par validation croisée

                                                        clf = model_selection.GridSearchCV(neighbors.KNeighborsClassifier(), # un classifieur kNN

                                                        param_grid, # hyperparamètres à tester

                                                        cv=5, # nombre de folds de validation croisée

                                                        scoring=score # score à optimiser

                                                        )

                                                        # Optimiser ce classifieur sur le jeu d'entraînement

                                                        # clf.fit(X_train, y_train)

                                                        clf.fit(X_train_std, y_train)


                                                        Ici, ça ne fonctionne pas, il manque les ()

                                                        # Afficher le(s) hyperparamètre(s) optimaux

                                                        print "Meilleur(s) hyperparamètre(s) sur le jeu d'entraînement:",

                                                        print clf.best_params_

                                                        cette partie là ne fonctionne pas non plus. D'une part, à cause des () absentes, mais parce qu'il ne trouve pas les 

                                                        std_test_score et params. Je crains qu'une ou plusieurs bibliothèques soient manquantes. J'ai aussi des doutes sur le placement du ":"

                                                        # Afficher les performances correspondantes

                                                        print "Résultats de la validation croisée :"

                                                        for mean, std, params in zip(clf.cv_results_['mean_test_score'], # score moyen

                                                        clf.cv_results_['std_test_score'], # écart-type du score

                                                        clf.cv_results_['params'] # valeur de l'hyperparamètre

                                                        ):

                                                        ici, c'est encore pire... mais je suppose que résoudre les problèmes de la boucle précédente permettraient de résoudre ceux de ce print.

                                                        print "\t%s = %0.3f (+/-%0.03f) for %r" % (score, # critère utilisé

                                                        mean, # score moyen

                                                        std * 2, # barre d'erreur

                                                        params # hyperparamètre

                                                        )

                                                        Zachee54 a écrit:

                                                        Tu dois implémenter l'algorithme de validation croisée, donc sans utiliser GridSearchCV ni une fonction équivalente.

                                                        Par contre tu peux te servir de KFold pour créer les folds. Fais juste attention à ce qu'ils ne soient pas randomisés, c'est important.

                                                        Ah oui... carrément... sauf qu'il n'y a a aucun cours qui montre ne serait-ce qu'une partie de cela... je n'ai pas les compétences pour construire une fonction qui fait une validation croisée à partie de rien.

                                                        J'ai bien trouvé des bouts de code utilisant kfolds, mais implémentation échoue : il ne reconnait pas n_splits...

                                                        Quant à mettre en entrée param_grid...

                                                        Zachee54 a écrit:

                                                        Implémenter un grid search comme dans la précédente activité, choisir le meilleur hyperparamètre et comparer les résultats avec une baseline.

                                                        Zachee54 a écrit:

                                                        Oui, sauf qu'on te demande la MSE et pas la RMSE. Ce n'est pas très grave mais c'est toujours mieux de suivre l'énoncé à la lettre (je ne sais plus si on peut perdre des points pour ça).

                                                        Je reste sceptique sur le choix de ta baseline. Ce n'est pas parce que les régresseurs bayésiens s'appellent "naïfs" que ce sont des baselines. Au contraire, ce peuvent être de très bons régresseurs !
                                                        On les appelle "naïfs" parce qu'il partent du postulat que toutes les features sont indépendantes, ce qui en réalité est rarement le cas.

                                                        Une bonne baseline est un régresseur stupide qui fait des prédictions sans intérêt : tellement simples que tu aurais pu faire les mêmes à l'école primaire sans avoir besoin d'être data scientist. Si tu as des résultats moins bons que le baseline, c'est que tu as travaillé (vraiment) pour rien.

                                                        Si tu as des résultats moins bons qu'un bayésien, ça ne veut pas forcément dire que tu as travaillé pour rien mais seulement que tu ferais mieux d'utiliser un NaiveBayes parce qu'il est plus adapté à ton problème.

                                                        Déjà, ça a l'air trop facile (l'activité précédente est une vraie purge en comparaison..).

                                                        Faut il automatiser le nombre de voisins idéal à utiliser pour la prédiction ? des petits schémas ?... si je suis ce qui est demandé, mon script répond à la demande, mais je ne pense pas qu'il puisse obtenir la note maximale...

                                                        Que proposes tu comme scénario de base ? Une régression linéaire multiple ?

                                                        (remarque : le knn obtient de meilleures performances que le bayésien, mais ça ne casse pas des briques. Si tu as un script pour faire tourner une PLS et afficher les résultats, je suis preneur. J'ai bien essayé de construire quelque chose, mais ça ne marche pas...).









                                                        -
                                                        Edité par RichardChazal1 13 novembre 2019 à 23:30:27

                                                        • Partager sur Facebook
                                                        • Partager sur Twitter
                                                          14 novembre 2019 à 9:48:14

                                                          RichardChazal1 a écrit:

                                                          Ici, ça ne fonctionne pas, il manque les ()

                                                          C'est une différence de syntaxe entre Python 2 et Python 3. Le TP a été écrit pour Python 2.7.1 (c'est écrit), donc c'est normal. Tu dois pouvoir reconnaître et corriger seul ce type d'anomalies.

                                                          RichardChazal1 a écrit:

                                                          cette partie là ne fonctionne pas non plus. D'une part, à cause des () absentes, mais parce qu'il ne trouve pas les std_test_score et params. Je crains qu'une ou plusieurs bibliothèques soient manquantes. J'ai aussi des doutes sur le placement du ":"

                                                          # Afficher les performances correspondantes
                                                          print "Résultats de la validation croisée :"
                                                          for mean, std, params in zip(clf.cv_results_['mean_test_score'], # score moyen
                                                          clf.cv_results_['std_test_score'], # écart-type du score
                                                          clf.cv_results_['params'] # valeur de l'hyperparamètre
                                                          ):

                                                          Non. Je n'ai pas de notebook sous la main mais tout ça devrait marcher très bien. Les clés std_test_score et params sont prévues dans la documentation (cf. § "Attributes"). Le ":" est au bon endroit.

                                                          Est-ce que tu peux donner le texte de l'erreur tel que Python te l'affiche ?

                                                          RichardChazal1 a écrit:

                                                          Zachee54 a écrit:

                                                          Tu dois implémenter l'algorithme de validation croisée, donc sans utiliser GridSearchCV ni une fonction équivalente.

                                                          Par contre tu peux te servir de KFold pour créer les folds. Fais juste attention à ce qu'ils ne soient pas randomisés, c'est important.

                                                          Ah oui... carrément... sauf qu'il n'y a a aucun cours qui montre ne serait-ce qu'une partie de cela... je n'ai pas les compétences pour construire une fonction qui fait une validation croisée à partie de rien.

                                                          J'ai bien trouvé des bouts de code utilisant kfolds, mais implémentation échoue : il ne reconnait pas n_splits...

                                                          Quant à mettre en entrée param_grid...

                                                          Oui, carrément.
                                                          C'est du travail mais cela n'a rien de sorcier. C'est seulement implémenter en Python la méthodologie expliquée dans le cours.

                                                          Qu'est-ce qui te gêne : l'algorithme ou lui-même ou son implémentation en Python ?
                                                          Si c'est l'algorithme, rebosse le cours. C'est le but de l'activité !
                                                          Si c'est Python, tu peux en profiter pour suivre un cours Python (c'est facile et rapide à apprendre), ou te débrouiller avec quelques notions. J'ai vu beaucoup d'activités où les étudiants faisaient des choses alambiquées parce qu'ils ne connaissaient pas les syntaxes plus simples qui existent en Python. Ce n'est pas grave, ils l'apprendront plus tard à l'usage.

                                                          RichardChazal1 a écrit:

                                                          J'ai bien trouvé des bouts de code utilisant kfolds, mais implémentation échoue : il ne reconnait pas n_splits...

                                                          Ah ça non, par contre : ne recopie pas un code trouvé ailleurs !

                                                          Tu n'apprendras rien du tout en faisant ça. En tant que data scientist, tu dois savoir faire ça toi-même. Tant que tu ne t'es pas confronté au fonctionnement des modèles que tu utilises, tu ne pourras pas les mettre en oeuvre à bon escient.

                                                          RichardChazal1 a écrit:

                                                          Quant à mettre en entrée param_grid...

                                                          C'est ce qui me fait penser que ton problème vient surtout d'un manque de formation en Python.

                                                          Voilà à quoi ça peut ressembler (très, très grossièrement) :

                                                          def validation_croisee(param_grid):
                                                            ...
                                                            for n in param_grid['n_neighbors']:
                                                              # Fais ce qu'il faut sur ton classifieur KNN
                                                              ...
                                                          
                                                          validation_croisee( {'n_neighbors': [1,2,3,4,5,6]} )

                                                          Tu n'es d'ailleurs pas obligé de garder la clé 'n_neighbors', tu peux écrire une fonction qui prend directement la liste des nombres de voisins à tester.

                                                          RichardChazal1 a écrit:

                                                          Déjà, ça a l'air trop facile (l'activité précédente est une vraie purge en comparaison..).

                                                          Fais-le et on en reparle après.

                                                          N'oublie pas qu'il y a tout une démarche de preprocessing, comme toujours en data science.

                                                          RichardChazal1 a écrit:

                                                          Faut il automatiser le nombre de voisins idéal à utiliser pour la prédiction ? des petits schémas ?... si je suis ce qui est demandé, mon script répond à la demande, mais je ne pense pas qu'il puisse obtenir la note maximale...

                                                          Non, rien de tout ça. Juste une baseline, une validation croisée sur un KNN, une évaluation des résultats et l'interprétation. Ca veut dire qu'il faut évidemment des explications sous forme de texte dans ton activité, pas que du code.

                                                          RichardChazal1 a écrit:

                                                          Que proposes tu comme scénario de base ? Une régression linéaire multiple ?

                                                          Ca, c'est dans le cours qu'il faut aller le chercher.

                                                          • Partager sur Facebook
                                                          • Partager sur Twitter

                                                          [Cours] Sélection de modèle en machine learning

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