Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Cours] Initiez-vous au machine learning

Découvrez les bases du machine learning

    19 juillet 2019 à 9:35:26

    Bonjour.

    Au risque de poser une question complètement débile, j'aimerais comprendre un point.

    Dans le chapitre sur l'entraînement de "notre premier k-NN", le professeur dit voir le chiffre "3" à partir de l'affichage des données relatives à x_test[3].

    Sachant que l'image est censée être un carré de 28 pixels sur 28 pixels mais que la fenêtre dans le notebook Jupyter fait des lignes de seulement 13 valeurs, j'aimerais comprendre comment il peut voir un "3".

    A moins que je me trompe, les 2ème et 3ème lignes comportent les 15 valeurs qui sont nécessaires pour compléter les 13 valeurs de la première ligne, afin de constituer la première "vraie" ligne de l'image d'une longueur de 28 pixels (donc valeurs). Et ainsi de suite...

    Donc, en suivant ce raisonnement, qui est peut-être faux, la matrice présentée dans le notebook n'a donc pas du tout l'allure de l'image réelle.

    Une explication ?

    P.S. : j'ai exécuté plusieurs fois le choix aléatoire des données d'entraînement et de test et je n'ai jamais réussi à "identifier" un chiffre clairement...

    • Partager sur Facebook
    • Partager sur Twitter
      19 juillet 2019 à 9:50:04

      Un débutant a écrit:

      Dans le chapitre sur l'entraînement de "notre premier k-NN", le professeur dit voir le chiffre "3" à partir de l'affichage des données relatives à x_test[3].

      Où ça ? Dans la vidéo ? Je n'y ai pas accès pour l'instant, alors je ne peux pas vérifier.

      Un débutant a écrit:

      Sachant que l'image est censée être un carré de 28 pixels sur 28 pixels mais que la fenêtre dans le notebook Jupyter fait des lignes de seulement 13 valeurs, j'aimerais comprendre comment il peut voir un "3".

      Je ne vois pas pourquoi tu dis que le notebook affiche 13 valeurs ?

      Un débutant a écrit:

      A moins que je me trompe, les 2ème et 3ème lignes comportent les 15 valeurs qui sont nécessaires pour compléter les 13 valeurs de la première ligne, afin de constituer la première "vraie" ligne de l'image d'une longueur de 28 pixels (donc valeurs). Et ainsi de suite...

      :( 2ème et 3ème ligne de quoi ?

      Les données sont un tableau à deux dimensions 70.000 (nb d'échantillons) x 784.

      Les 784 colonnes sont les pixels de l'image, de gauche à droite et de haut en bas.
      Pour l'affichage, on le transforme ces lignes de 784 valeurs en des tableaux à deux dimensions de taille 28x28 :

      # On redimensionne les données sous forme d'images
      images = xtest.reshape((-1, 28, 28))

      On obtient ainsi un tableau à 3 dimensions de taille 70.000 x 28 x 28.
      Bon d'accord, pas 70.000 parce qu'on a découpé les données en train set et test set ; la première dimension est le nombre d'échantillons.

      La commande suivante permet d'afficher une image à partir d'un tableau 28x28 :

      plt.imshow(images[value],cmap=plt.cm.gray_r,interpolation="nearest")

      Si ça peut te rassurer, beaucoup de cours Data science ici sont bourrés de fautes de frappes, de variables qui changent de nom en cours de route, de commandes oubliées, etc. C'est assez pénible mais en principe on s'en rend compte facilement et on peut corriger tout seul. Si ça se trouve tu t'es laissé perturber par une coquille ?

      • Partager sur Facebook
      • Partager sur Twitter
        19 juillet 2019 à 10:58:05

        Re.

        Tout ce que tu expliques à propos du nombre et format des données, je pense avoir compris.

        Je parle de la 2ème vidéo (il faut descendre dans le cours) dans la partie 3, Chapitre 4 "Entraînez votre premier k-NN", aux alentours de 2'14.

        Je vais expliquer d'une autre manière.

        Normalement, soit on a la "vraie" image, soit on peut faire apparaître le niveau de gris de chaque pixel. Il me semble que c'est ce que le prof essaye de faire en appelant la variable "X_test[3]" : il cherche à faire apparaître les niveaux de gris de chaque pixel de l'image n°3 (ou 4 si on compte à partir de 0, mais bref, on s'en fiche...).

        Sauf que le notebook qu'il présente semble sortir une matrice d'une ligne seule avec 28x28 valeurs, soit 784 de rang (et non 28 lignes de 28 colonnes), et ces 784 valeurs sont disposées à l'écran selon des lignes qui ne comportent que 13 colonnes de rang... et non 28.

        Selon moi, pour voir l'image "correctement" sur le notebook, il faudrait qu'il y ait 28 colonnes et non 13. Je ne vois donc pas comment il peut voir un "3" alors que ce n'est pas la "vraie" image, si bien entendu je ne me trompe pas dans mon raisonnement.

        • Partager sur Facebook
        • Partager sur Twitter
          19 juillet 2019 à 13:17:13

          OK, j'ai pu voir la vidéo en question.

          Tout à fait d'accord avec toi : ça n'a pas de sens.
          Les données sont en une dimension au lieu de deux, et elles s'affichent sur 13 colonnes au lieu de 28. Ca donne une image complètement déformée dont on ne peut pas se faire une idée.
          C'est malheureusement le genre d'imprécisions que j'ai constatées à plusieurs reprises dans ces cours. Mais on va s'en remettre !

          Par contre l'idée d'afficher la matrice en guise d'aperçu est amusante.
          Pour y arriver, il faudrait se limiter à 13 colonnes équitablement réparties, par exemple les colonnes paires à partir de la n°2 :

          x_test[3].reshape(28, 28)[:, 2::2]
          • Partager sur Facebook
          • Partager sur Twitter
            19 juillet 2019 à 14:18:13

            Ok.

            Enfin un aperçu digne de ce nom !

            Par contre, comme je fais plein de choses en même temps (il faut que je me repenche sur ta réponse pour le SQL, que j'ai comprise mais je crois qu'il y a un élément de confusion dans mon raisonnement que je n'ai pas bien solutionné pour l'instant), que je débute, et que j'ai fait le cours sur les dataframes il y a 3 mois, est-ce que tu pourrais juste réexpliquer rapidement le fonctionnement (pas l'effet...) du [:, 2::2] ?

            Je crois me souvenir que le premier ":" ne touche rien donc on conserve 28 lignes mais je n'arrive plus à déchiffrer le "2::2", qui permet de garder les colonnes paires à partir de la 2ème colonne...

            Une proposition : le premier 2 pour dire qu'on commence à la 2ème colonne (quoique, colonne n°2 donc 3ème ou 2ème colonne ?) et le deuxième 2 permet de donner le pas qui indique ici qu'on ne garde qu'une colonne sur deux ?

            • Partager sur Facebook
            • Partager sur Twitter
              19 juillet 2019 à 15:22:56

              Oui, c'est ça.

              [start:stop:step]

              Tu commences à la colonne d'indice 2 (donc la 3ème), jusqu'à la fin, en avançant de 2 en 2.

              Plus d'infos sur la doc officielle Python.

              • Partager sur Facebook
              • Partager sur Twitter
                19 juillet 2019 à 16:07:52

                Merci pour le rappel, cela m'évite de regarder sur la documentation d'une chose "simple" comme ça... car là, je regarde depuis une heure la doc sur la régression linéaire et je galère...

                Dans le cours, il décompose la régression linéaire à l'aide de np.array() et de transpositions.

                J'aimerais comprendre pourquoi le "fit" de la régression nécessite des array sur lesquels j'ai été obligé d'utiliser "reshape(-1,1)". J'avoue être complètement perdu, notamment sur la différence entre un dataframe qui annonce (536,) avec shape et un array, après reshape, qui annonce (536,1).

                En tout cas, la fonction de régression linéaire aime le deuxième mais pas le premier...

                • Partager sur Facebook
                • Partager sur Twitter
                  19 juillet 2019 à 16:23:22

                  Les estimateurs, classifieurs, et d'une manière générale toutes les classes de scikit-learn qui traitent des données travaillent sur des tableaux en 2 dimensions.
                  Tout simplement parce qu'on ne travaille jamais sur des problèmes à une seule dimension : sinon ce n'est pas du Big Data. :D

                  Pour découvrir la régression linéaire, le cours fait travailler sur des données à 1 dimension.
                  Pour faire travailler l'estimateur LinearRegression, il faut convertir les données en un tableau à 2 dimensions de taille (n,1). C'est exactement ce que fait reshape(-1,1), sachant que le "-1" indique à numpy qu'il doit adapter la taille de cette dimension en fonction des données. Ce qu'on veut, c'est que la 2ème dimension soit de taille 1.
                  Le résultat est un tableau de n lignes de 1 élément chacune.

                  (536,) est la taille d'un vecteur à une dimension.
                  En Python, la virgule est là pour indiquer qu'il s'agit d'un tuple (une séquence, si tu préfères) contenant un seul élément, contrairement à (536) qui est interprété comme un nombre entier.
                  Pour faire le parallèle avec les maths, c'est la même différence qu'entre \(\{536\}\) et \(536\).

                  -
                  Edité par Zachee54 19 juillet 2019 à 16:23:37

                  • Partager sur Facebook
                  • Partager sur Twitter
                    20 juillet 2019 à 12:19:43

                    J'ai beau être de formation scientifique, j'ai très peu utilisé les matrices dans mes études et mon travail de prof.

                    Donc allons-y pour les vérifications :

                    - 536 est un nombre

                    - (536, ) est un nombre rangé dans une séquence : un tuple qui ne contient qu'un élément. Ce tuple, issue de shape appliqué à une colonne du dataframe, signifie que la colonne contient une liste de 536 valeurs.

                    - (536, 1) est une matrice contenant 536 lignes et une colonne. Il y a donc 536 valeurs dans 536 lignes les unes en dessous des autres dans une seule colonne.

                    - (1, 536) est une matrice contenant 1 ligne et 536 colonnes. Il y a donc 536 valeurs dans 536 colonnes les unes à côté des autres sur une seule ligne.

                    Normalement, ce que je viens de dire est correct, non ?

                    Question qui taraude : quand on fait le reshape du tuple (1D) afin de le transformer en array 2D, y a-t-il une préférence quant à la disposition des valeurs dans une seule ligne ou dans une seule colonne ?

                    Question annexe : quand on utilise la régression linéaire, y a-t-il un intérêt, une meilleure façon de faire pour présenter les matrices ? Je pense notamment au produit matriciel qui nécessite que le nombre de colonnes de la première matrice corresponde au nombre de lignes de la seconde. Y a-t-il une condition de la même sorte lorsqu'on fait la régression ?

                    J'ai cru comprendre que les modèles de "régression" font certaines choses automatiquement même si les données en entrée ne sont pas "parfaitement" présentées.

                    • Partager sur Facebook
                    • Partager sur Twitter
                      21 juillet 2019 à 15:20:02

                      Tout ce que tu dis est exact.

                      En mathématiques on ne fait pas trop la différence entre un vecteur et une matrice colonne : dans les deux cas ce sont des nombres rangés les uns au-dessus des autres.
                      En informatique c'est important, parce qu'une matrice est un tableau à 2 dimensions (un tableau de tableaux). Cela change la façon d'accéder aux données :

                      # On suppose que x_test[3] est un vecteur de 576 éléments
                      
                      # C'est un nombre
                      print(x_test[3][0])
                      
                      x_test = x_test.reshape((-1, 28, 28))
                      
                      # C'est un tableau de 28 nombres !
                      print(x_test[3][0])

                      Un débutant a écrit:

                      Question qui taraude : quand on fait le reshape du tuple (1D) afin de le transformer en array 2D, y a-t-il une préférence quant à la disposition des valeurs dans une seule ligne ou dans une seule colonne ?

                      On dispose toujours les features en colonnes et les échantillons en lignes.

                      Un débutant a écrit:

                      Question annexe : quand on utilise la régression linéaire, y a-t-il un intérêt, une meilleure façon de faire pour présenter les matrices ? Je pense notamment au produit matriciel qui nécessite que le nombre de colonnes de la première matrice corresponde au nombre de lignes de la seconde. Y a-t-il une condition de la même sorte lorsqu'on fait la régression ?

                      J'ai cru comprendre que les modèles de "régression" font certaines choses automatiquement même si les données en entrée ne sont pas "parfaitement" présentées.

                      Si tu as \(p\) échantillons de \(n\) features, tu dois avoir une matrice \(p\times n\). C'est en effet important pour le produit matriciel, et plus généralement pour la bonne interprétation des données.

                      Je crois que LinearRegression transformait tout seul un tableau 1D en matrice \(p\times1\), mais qu'il ne le fait plus maintenant. Disons qu'il ne faut pas te reposer là-dessus et que si tu fournis des données dans un mauvais format, un message d'erreur saura te l'expliquer.
                      Il y a aussi des conversions implicites, par exemple entre un tableau Python et un tableau Numpy. Mais tu n'as généralement pas besoin de t'en soucier, parce que c'est seulement le format des données en mémoire qui change, pas la dimension de la matrice ni les valeurs qui sont dedans.

                      -
                      Edité par Zachee54 21 juillet 2019 à 15:20:51

                      • Partager sur Facebook
                      • Partager sur Twitter
                        25 juillet 2019 à 9:15:02

                        Bonjour,

                        très intéressante formation. J'ai une question à propos de la reconnaissance d'images: quelles applications data science pourraient on imaginer dans le cadre d'une entreprise?

                        Merci

                        • Partager sur Facebook
                        • Partager sur Twitter
                          2 août 2019 à 19:03:10

                          Bonjour,

                          je suis bloqué a l'activité sur les loyer.

                          Est il possible d avoir plus d information sur ce qui est demander car rien n'est clair dans ce cours et bien trop vite expliquer.

                          que devons nous rendre ?

                          quelle est la marde a suivre ?

                          quelles sont les attentes au niveau des test ?

                          devons nous faire une régression linéaire ou K-nn ?

                          combien de test devons nous faire ?

                          des précisions sont nécéssaires ...

                          • Partager sur Facebook
                          • Partager sur Twitter
                            13 août 2019 à 14:22:52

                            Bonjour Guillaume,

                            Je suis d'accord, les attentes ne sont pas très claires. À la vue de la correction, on se dit "Ah bon, c'était seulement ça ?".
                            On ne te demande rien de plus que ce qui est dans l'énoncé :

                            • une séparation en training / testing set
                            • 2 propositions d'amélioration du modèle qui obtiennent de meilleures performances que la "baseline" (la régression linéaire avec une seule feature)
                            • Une sélection d'un modèle final à partir des performances.

                            Le problème, ce sont les propositions d'amélioration. À ce stade de la formation il n'est pas demandé de faire quelque chose de particulièrement intelligent.
                            Ce qu'on te demande, c'est de réfléchir à la façon dont tu pourrais utiliser l'arrondissement pour affiner le résultat. Tant pis si ce n'est pas efficace. Tu n'es pas pénalisé non plus si ta méthode est intellectuellement faussée, parce qu'on n'en demande pas tant à ce stade de la formation.

                            Tu peux en effet utiliser une régression linéaire ou un k-nn. Personnellement j'ai trouvé que ce n'étaient pas des modèles appropriés pour les arrondissements et j'ai cherché autre chose. La doc sklearn peut éventuellement aider.

                            • Partager sur Facebook
                            • Partager sur Twitter

                            [Cours] Initiez-vous au machine learning

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