Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Cours] Initiez-vous au machine learning

Découvrez les bases du machine learning

24 septembre 2018 à 16:23:04

Il me semble difficile d'établir un prix par m2 avec une droite qui a une ordonnée à l'origine... ?

Cela ne revient-il pas aussi quelque part à dire qu'on a trouvé la réponse avant de poser la question ?

Bon courage

-
Edité par Pezman 26 septembre 2018 à 14:54:38

  • Partager sur Facebook
  • Partager sur Twitter
30 septembre 2018 à 19:52:33

Bonjour 

Je ne comprends pas pourquoi j'ai cette résultat de theta [[-283.37836117][  40.97116431]] alors que je n'ai rien changé au niveau des données.

  • Partager sur Facebook
  • Partager sur Twitter
La vie, c'est comme une bicyclette, il faut avancer pour ne pas perdre l'équilibre.   Albert Einstein
1 octobre 2018 à 18:51:33

Missay a écrit:

Bonjour 

Je ne comprends pas pourquoi j'ai cette résultat de theta [[-283.37836117][  40.97116431]] alors que je n'ai rien changé au niveau des données.


Je me posais la même question que toi. Si tu regardes les autres postes du forum, tu verras que le code indiqué dans le cours n'est pas exactement celui que le prof a utilisé pour obtenir ses résultats. La différence existe car le prof a fait un filtrage des loyers trop élevés.

Son poste est sur la première page. Je le reporte ici.

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
 
# Import des donnees
house_data_raw = pd.read_csv('house.csv')
house_data = house_data_raw[house_data_raw['loyer'] < 7000]
 
# Affichage des observations
plt.plot(house_data['surface'], house_data['loyer'], 'ro', markersize=4)
plt.show()
 
# Creation des matrices de travail
X = np.matrix([np.ones(house_data.shape[0]), house_data['surface']]).T
y = np.matrix(house_data['loyer']).T
 
# Calcul du coefficient de regression
theta = np.linalg.inv(X.T.dot(X)).dot(X.T).dot(y)
theta.item(0) + 50 * theta.item(1)
 
# Affichage de la droite de regression
plt.plot(house_data['surface'], house_data['loyer'], 'ro', markersize=4)
plt.plot([0, 250], [theta.item(0), theta.item(0) + 250 * theta.item(1)])
plt.show()

__________________________________________________________________

Concernant le TP des KNN, je rencontre des problèmes avec les données récupérées avec MNIST.

Les données sont correctement récupérées, cependant chaque image est de taille 780 (et non 784). Cela ne correspond pas à 28*28, le format aurait il changé ? (26*30 par exemple). Par ailleurs, il est indiqué dans le TP que les niveaux de gris sont compris entre 0 et 16, mais c'est en fait entre 0 et 255.

De plus, les données sont représentées sous forme de matrices creuses. Il faut donc utiliser la fonction todense() décrite ici.

from sklearn.model_selection import train_test_split

xtrain, xtest, ytrain, ytest = train_test_split(data, target, test_size=0.2)

#On transforme la matrice creuse en matrice dense.
denseXTEST = xtest.todense()

#On reforme les matrices pour qu'elles aient un format compatible avec l'affichage d'images
images = []
for i in 0,denseXTEST.shape[0]-1:
    images.append(denseXTEST[i].reshape((-1,26,30)))

#Attention, images n'est plus une matrice de matrices, mais une liste de matrices.




Par ailleurs, pourrait-on me dire si j'aurais dû procéder autrement pour utiliser reshape ? Ca me dérange un peu de casser la matrice initiale pour la transformer en liste, mais je n'ai pas réussi à utiliser reshape autrement... (la fonction s'applique sur la matrice entière plutôt que chaque élément de la matrice).

J'ai finalement réussi à afficher les images avec ce reshape 26,30. Mais il est clair que ce n'est pas le bon format vu l'apparence des images.

Je pense que le TP aurait besoin d'une petite mise à jour :) 

-
Edité par oppoppy 1 octobre 2018 à 20:15:59

  • Partager sur Facebook
  • Partager sur Twitter
18 octobre 2018 à 17:04:26

Bonjour, 

J'ai terminé le cour à 100% et j'ai eu 5/7 (en moyenne) à l'activité. J'ai échoué le quizz n°1 à deux reprises et je ne peut plus recommencer. Je n'ai aucune possibilité pour obtenir le certificat ? En vous remerciant. 

  • Partager sur Facebook
  • Partager sur Twitter
6 novembre 2018 à 14:35:15

Bonjour,

J'ai essayé de faire le TP1 mais ça marche pas.

voici mon code

#On importe les libraries qu'on aura besoin

%matplotlib inline

import numpy as np

import pandas as pd

import matplotlib.pyplot as plt

# Import des donnees

house_data_raw = pd.read_csv('house_data.csv')

house_data = house_data_raw[house_data_raw['price'] < 7000]

house_data_raw

plt.show

# On affiche le nuage de points dont on dispose

plt.plot(house_data['surface'], house_data['price'], 'ro', markersize=4)

plt.show()

# On décompose le dataset et on le transforme en matrices pour pouvoir effectuer notre calcul

X = np.matrix([np.ones(house_data.shape[0]), house_data['surface'].values]).T

X

y = np.matrix(house_data['price'].values).T

y

# On effectue le calcul exact du paramètre theta

theta = np.linalg.inv(X.T.dot(X)).dot(X.T).dot(y)

print(theta)

résultat obtenu après exécution de la dernière ligne :

 [[nan]

 [nan]]
  • Partager sur Facebook
  • Partager sur Twitter
20 novembre 2018 à 15:34:50

Bonjour,

Serait-il possible d'obtenir la correction du TP prédiction de loyers améliorées avec arrondissements ?

Merci d'avance.

  • Partager sur Facebook
  • Partager sur Twitter
29 novembre 2018 à 12:31:33

Bonjour,

sur le mooc "Analysez vos données textuelles", j'ai fais une erreur de correction sur le dernier tp pour le troisième élève.

Serait-il possible de débloquer le corriger pour changer la note.

Cordialement

  • Partager sur Facebook
  • Partager sur Twitter
José Castro
8 décembre 2018 à 17:06:24

Bonjour.

Pour commencer ce post, je souhaite mentionner que j’apprécie beaucoup le contenu des cours proposés par Openclassroom. Je me permets toutefois de faire remarquer plusieurs erreurs et/ou confusions qui ne semblent pas avoir été soulevées jusqu’à présent. Dans la section « TP: Décomposez l’apprentissage d’une régression linéaire », plusieurs éléments mathématiques sont donnés aux lecteurs, plus précisément dans les sous-sections « Reformuler le problème dans l'espace d’hypothèse : une droite », « Définir la fonction loss » et « Apprentissage : trouver le thetaoptimal ». Je suis partisan du fait qu’il est primordial de définir correctement toutes les notions et notations mathématiques que l’on souhaite utiliser. Sinon, cela reste une série de symboles incompréhensibles pour le lecteur non initié. Etant donné que l’auteur de ce cours a ajouté ces quelques équations, je suppose qu’il estime quelles apportent une informations supplémentaires pour le lecteur désireux d’avoir quelques détails techniques. J’ai remarqué plusieurs grosses erreurs dans les équations ainsi que des erreurs de notation. N’ayant pas accès à LaTeX pour formater les équations correctement, je vais essayer de faire comme je peux: l’underscore _ pour définir un indice (x_1), le chapeau ^ pour définir une notation avec exposant (x^{(2)} est le second x, comme on aurait pu l’écrire par x_2), la notation Python/numpy .T pour appliquer l’opérateur transposé. C’est parti:

(1) La première équation de la sous-section « Reformuler le problème dans l'espace d’hypothèse : une droite » est incorrecte: « ychapeau = theta.T x avec x = (1, x_1, x_2, …, x_N), ychapeau = (ychapeau_1, ychapeau_2, …, ychapeau_N) ». Premièrement, si l’auteur a pris la peine de mentionner qu’il faut appliquer l’opérateur transposé au vecteur theta, c’est qu’il différencie les notions de vecteur ligne (par exemple (a, b, c, …)) et vecteur colonne (le même mais « écrit à la vertical », avec c en dessous de b, lui-même en dessous de a). Je suis tout à fait d’accord avec lui sur ce point. Dans ces conditions, le produit de deux vecteurs n’est défini qu’entre un vecteur ligne par un vecteur colonne: `a b` est par définition le produit du vecteur ligne `a` par le vecteur colonne `b`. C’est une convention mathématique à la base même du calcul matriciel. Dans le cours, x est défini comme un vecteur ligne, ce qui rend d’ores et déjà le produit indéfini. Etant donné qu’il est indiqué, à la fin de cette sous-section, que theta = (theta_0, theta_1) (lorsqu’on réduit le problème à une seule dimension), le vecteur theta est donc un vecteur ligne, ce qui implique donc que theta.T est un vecteur colonne. Le produit n’aurait donc de sens que sous la forme `x theta.T` au lieu de `theta.T x`. Deuxièmement, quand bien même nous utiliserions `x theta.T`, le résultat de ce produit est nécessairement un scalaire, autrement dit une simple valeur, et non pas un vecteur comme c’est indiqué par ychapeau = (ychapeau_1, ychapeau_2, …, ychapeau_N). Cette équation n’a donc aucun sens. Il semble que l’auteur ait extrait cette équation de l’article qu’il donne en référence dans un cadre bleu un peu plus loin (lien cliquable sur la phrase « par exemple ici (en anglais) »), mais en transposant de façon erronée les notations. 

(2) Une autre erreur manifeste dans cette première équation est l’utilisation du `N` dans les définitions de x et ychapeau. Le `N` a été défini plus tôt dans la section comme étant « Notre training set est un ensemble de N = 545 observations de surface et leur loyer associé … ». Je pense donc que l’auteur a confondu le nombre d’observations avec la dimensionalité du problème. Ceci expliquerait les erreurs expliquées au point (1) de ce post. Cela est d’autant plus clair que l’auteur mentionne dans la phrase suivante: «  Dans notre cas, puisqu’on est en une dimension, … ». Ceci veut bien dire que la première équation discutée ci-dessus est une généralisation du problème abordé. La dimension du vecteur x (et celle de ychapeau et theta aussi) doit donc être indépendante du nombre d’observations. Une conséquence immédiate de cette erreur est que la notation utilisée à l’équation qui suit la précédente: « … on peut écrire pour un point x_i, ychapeau_i = theta_0 + theta_1 x_i » laisse penser que les x_i peuvent être un des éléments du vecteur x = (1, x_1, x_2, …, x_N) définit précédemment. Par exemple, on pourrait croire que pour i = 5, x_5 dans cette seconde équation est le même que celui dans x = (1, x_1, …, *x_5*, x_6, …, x_N). Or ce n’est *pas* le cas. Toutes les valeurs que le x_i de cette seconde équation peuvent prendre sont des réalisations de la variable « surface », qui peut être représenté uniquement par le x_1 (et uniquement lui, car la dimension de notre cas est 1) dans la première équation. Cette dernière phrase montre bien la confusion dans la notation x_i et (x_1, x_2, ….). Je propose une version correct plus bas. 

(3) Malheureusement, les erreurs décrites ci-dessus se propagent à la sous-section « Définir la fonction loss », notamment dans la définition du risque empirique. Cette définition est, selon moi, erronée. La somme couvre les N observations, ce qui implique que pour un i donné, x_i est une simple valeur (en l’occurence, la surface correspondant à la i-th observation). Dans ce cas, que peut bien représenter la quantité `theta.T x_i` qui est le produit d’un vecteur par un scalaire? Certainement pas l’estimation, donnée par le modèle, du loyer associé à la i-th surface. De même, l'expression `theta.T x_i - y_i` représente la différence d'un vecteur avec un scalaire, ce qui n'a pas de sens mathématique. Quant à la définition de la distance euclidienne, quel est l’intérêt de l’ajouter si la notation n’est pas définie? || . ||_2 représente la norme l_2 d’un vecteur?

(4) Dans la sous-section « Apprentissage : trouver le thetaoptimal », quitte à mettre la solution exacte, pourquoi ne pas indiquer ce que X représente, à savoir (dans le problème abordé) une matrice Nx2 dont la première colonne est remplie de 1, et la seconde est remplie avec les N observations de surface. Chaque ligne est donc un vecteur (1, x_i) avec x_i la i-th valeur de surface.

Au vu de ce qui a été dit, je pense qu’une version correcte de la première équation serait: 

ychapeau(x) = x theta.T

avec theta = (theta_0, theta_1, …, theta_D), x = (1, x_1, x_2, …, x_D), et D >= 1 est un entier représentant la dimension du problème. Ainsi, ychapeau(x) représente une fonction du vecteur x, à valeur réelle. Dans notre problème surface-loyer, cette dimension se réduit à D=1. Cela implique que le vecteur theta se réduit à deux composantes: theta = (theta_0, theta_1). De même, le vecteur x se réduit à x = (1, x_1) où x_1 représente une variable dont une réalisation correspond à une valeur de la surface. La j-th réalisation définit un vecteur x^{(j)} = (1, x_1^{(j)}), où ^{(j)} est une notation pour différencier les réalisations de la variable x_1. Si on collecte l’ensemble de ces N = 545 réalisations, l’ensemble des vecteurs x^{(j)} pour j = 1, …, N peut se condenser dans une matrice de dimension Nx2, dont la j-th ligne est définie par x^{(j)} = (1, x_1^{(j)}). Cette nouvelle matrice X est précisément la matrice X présentée dans le cours à la première équation de la sous-section « Apprentissage : trouver le thetaoptimal », à savoir thetachapeau = (X.T X)^{-1} X.T y. 

Pour conclure, les erreurs mentionnées ne sont pas que de simples typos, ou erreurs de notation. Comme écrites dans le cours, ces quelques équations mélangent le nombre d’observations avec la dimensionalité du problème, ce qui rend la compréhension très difficile pour quelqu’un n’ayant pas un bagage mathématique suffisant. Pour les personnes parlant anglais, le lien fourni par l’auteur dans le cadre « Détails de la solution » renvoi vers une démonstration rigoureuse et très bien expliquée de la solution exacte. De plus, les différentes quantités (vecteurs et matrices) y sont définies clairement.

En espérant que ce post soit utile, je vous (nous) souhaite bonne continuation.

-
Edité par klosferatu 8 décembre 2018 à 20:54:49

  • Partager sur Facebook
  • Partager sur Twitter
5 janvier 2019 à 14:18:01

Bonjour à tous,

sur cet exemple :

https://openclassrooms.com/fr/courses/4011851-initiez-vous-au-machine-learning/4020631-exploitez-au-mieux-votre-jeu-de-donnees#/id/r-4091481

il faut caster en integer :

sample = np.random.randint(data_size, size=int(data_size*0.1))

Bien à vous.

  • Partager sur Facebook
  • Partager sur Twitter
5 janvier 2019 à 23:48:17

Bonjour Tout le monde,

Svp, est-qu'il y a des idées pour résoudre l'activité:Allez plus loin... ?

Je comprend pas bien est qu'on doit chercher améliorations avec régression linéaire ou bien d'autres méthodes!!

Des pistes pour résoudre l'activité !!

Merci

  • Partager sur Facebook
  • Partager sur Twitter
6 janvier 2019 à 16:57:07

YounseZr a écrit:

Bonjour Tout le monde,

Svp, est-qu'il y a des idées pour résoudre l'activité:Allez plus loin... ?

Je comprend pas bien est qu'on doit chercher améliorations avec régression linéaire ou bien d'autres méthodes!!

Des pistes pour résoudre l'activité !!

Merci


Bonjour. Un première amélioration est de tenir compte des arrondissements en plus de la surface, ce qui peut se faire par une régression linéaire en dimension 2. Personnellement, j'ai également effectué 5 régressions linéaires, chacune étant basée sur des données liées à un et un seul arrondissement. Chacune de ces régressions produit un modèle prédictif qui n'est utilisable uniquement que pour l'arrondissement sur lequel il a été construit.

Je ne suis qu'un élève en plein apprentissage, et mon avis ne veut pas celui d'un expert. Mais comme tu l'auras remarqué, la dernière réponse d'un membre du staff sur cette partie du forum date d'un an environ... 

  • Partager sur Facebook
  • Partager sur Twitter
6 janvier 2019 à 20:13:14

Bonjour Klosferatu,

Tu as raison, il y a effectivement une erreur. Ton message étant très dense, je vais tenter de clarifier un peu pour que ça soit bien compréhensible.

Commençons par le point 2):

Le `N` a été défini plus tôt dans la section comme étant « Notre training set est un ensemble de N = 545 observations de surface et leur loyer associé … ». Je pense donc que l’auteur a confondu le nombre d’observations avec la dimensionalité du problème.

et

La dimension du vecteur x (et celle de ychapeau et theta aussi) doit donc être indépendante du nombre d’observations..

On touche le coeur de l'erreur déjà. Ce qui se passe c'est un mélange entre deux notions et deux notations.

Commençons par définir une variable X = (x_1, x_2, ... x_N) qui contient l'ensemble de notre échantillon. Avec cette définition, N = 545 est correct, il s'agit du nombre d'appartement dans notre dataset.

Maintenant, définissons un x_i. Un x_i est un individu (ici un appartement), c'est à dire une variable qui définit plusieurs features.  Ici, il n'y en a qu'une, c'est le loyer, mais il pourrait y en avoir d'autre. On verra plus tard dans le cours l'arrondissement par exemple, on pourrait penser à l'âge de l'immeuble, le nombre de chambres, etc.

Ces features sont représentées par un vecteur de taille k (pour k features): x_1 = (f_1, f_2, ..., f_k).

Pour des raisons liées au calcul matriciel, nous allons ajouter la valeur 1 dans notre vecteur (ça sert à calculer l'ordonnée à l'origine. On a maintenant:

x_1 = (1, f_1, f_2, ..., f_k)


C'est là que le cours fait une confusion entre X et les x_i.

Si x est une variable alors on doit écrire x = (1, f_1, ..., f_k), c'est un vecteur.

Si x est l'échantillon alors on doit écrire x = (x_1, ..., x_n), c'est un vecteur de vecteurs, soit une matrice.

Mais x = (1, x_1, ..., x_n) c'est faux

Donc pour être clair partons sur:

  • des individus x_i = (1, f_i1, f_i2, ... f_ik) qui sont des vecteurs
  • un échantillon  X = (x_1, x_2, ... x_N) qui est une matrice de dimension (N, k+1), soit un vecteur de N vecteurs de taille k+1 (nos N individus).

Puisque nous sommes dans un cas de dimension 1, on aura donc

x_i = (1,  s_i)

avec s_i la surface du logement i.

On va garder ŷ = (ŷ_1, ..., ŷ_N), le vecteur contenant les N loyers.

Pour rappel, on cherche l'équation d'une droite affine de la forme y = ax + b.

Ou, comme écrit dans le cours ŷ_i = theta_1 * x_i + theta_0 .

ça c'est le résultat du calcul de l'estimation de 1 loyer, pour le logement i. 

Maintenant, pour résoudre le problème pour nos N logements, nous allons utiliser le calcul matriciel et donc on va pouvoir utiliser une formule de la forme

ŷ = theta_T * X

theta = (theta_0, theta_1)  (vecteur de dimension (2, 1)

X notre échantillons (une matrice de dimension (N, 2)

ŷ l'estimation de l'ensemble des loyer (un vecteur de taille N)

Avec une formulation différente, on peut écrire:

E l'erreur que l'on ignore.

Rappel, le produit de matrice d'après Wikipedia:

On a donc une matrice X de taille (N, 2) multipliant un vecteur A de dimension (2, 1), ce qui doit nous donner un vecteur ŷ de dimension (N, 1).

Je crois que c'est ce à quoi tu arrives comme conclusion.

Pour écrire la formule comme dans le cours, il suffit de se souvenir que:

Le code python fait d'ailleurs ce même calcul en créant la matrice X.

En fait on a une matrice (2, N) avec une première rangée de 1, ce que fait le professeur avec le code python:

X = np.matrix([np.ones(house_data.shape[0]), house_data['surface'].as_matrix()]).T
y = np.matrix(house_data['loyer']).T

Voilà, je pense que j'ai bien expliqué où était l'erreur j'espère que c'est clair pour tout le monde et que le cours sera corrigé.

-
Edité par QuentinLeguay 7 janvier 2019 à 0:22:13

  • Partager sur Facebook
  • Partager sur Twitter
29 janvier 2019 à 10:35:29

Bonjour tout le monde,

 Je me permets de vous exposer mon problème car je bloque sur l'import du dataset MNIST et j'ose espérer avoir un coup de pouce pour pouvoir continuer le cours. Je précise que je suis sur python3

Sauvez une apprenti datascientist en detresse :)

Kazon.

-
Edité par kazon 29 janvier 2019 à 10:53:48

  • Partager sur Facebook
  • Partager sur Twitter
7 février 2019 à 19:03:02

Bonjour tout le monde,

je beugue au niveau tu TP : Allez plus loin.... , est ce que quelqu'un a pu avancer là dessus, j'ai divisé les données en 2 mais ensuite j'ai pas su est ce qu'il faut revenir vers la regression ou bien continuer avec le KNN?

Merci D'avance. 

  • Partager sur Facebook
  • Partager sur Twitter
20 février 2019 à 21:30:33

NABILSEFTA a écrit:

Bonjour tout le monde,

je beugue au niveau tu TP : Allez plus loin.... , est ce que quelqu'un a pu avancer là dessus, j'ai divisé les données en 2 mais ensuite j'ai pas su est ce qu'il faut revenir vers la regression ou bien continuer avec le KNN?

Merci D'avance. 


Bonjour je suis exactement au même point ! J'envisage de creuser la piste de la Regression Multiple et peut être un KNN bi dimension si c'est possible I don't know ! Help :) 

Si quelqu'un peut nous donner un indice pour nous débloquer ! J'ai du mal à saisir ec qu'il faut faire.
  • 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