Partage
  • Partager sur Facebook
  • Partager sur Twitter

Echantillonage des données mnist

Sujet résolu
27 juillet 2017 à 9:45:18

Bonjour à tous,

Je suis actuellement en train de suivre le cours Initiez-vous au machine learning et j'en suis au deuxième TP sur l'algorithme K-NN.

Pour faire l’échantillonnage, le cours propose d'utiliser 

sample = np.random.randint(70000, size=5000)
data = mnist.data[sample]
target = mnist.target[sample]

Mais il me semble que np.random.randint(70000, size=5000) renvoie une liste de nombres aléatoires entre 0 et 70000, donc il peut potentiellement avoir deux nombres identiques dans cette liste. 

Pour mélanger des données, j'aurais plutôt tendance à utiliser DataFrame.sample(frac=x) mais évidemment ça ne marche que pour les dataframe.

Donc est-ce que je fais complètement erreur ? Y a-t-il une autre solution ?

Merci !

  • Partager sur Facebook
  • Partager sur Twitter
27 juillet 2017 à 10:42:20

Salut,

Corrigez-moi si je me trompes, mais vos lignes ne mélangent pas les données. C'est la ligne juste en dessous, qui va mélanger, pour créer deux groupes (Test et Train)

xtrain, xtest, ytrain, ytest = train_test_split(data, target, train_size=0.8)

Vos lignes servent uniquement, à prendre les mêmes samples aléatoirement, pour le data et le target. (Histoire d'avoir la bonne étiquette, lors des prédictions)

Il est donc normal, d'avoir plusieurs fois le même. 

C'est comme si vous faisiez des examens médicales, sur des virus/bactéries, sans jamais reprendre le même sujet d'étude. Comment savoir si ce n'était pas de la chance, une erreur, ou que son système immunitaire à bien réagit ???

Il faut donc, faire plusieurs fois le même test, sur le même patient. Histoire d'obtenir le même résultat, sinon quelque chose clocherait.

Donc, je crois que tout est normal. 

Si vous voulez vraiment, ne jamais avoir le même data, suffit de faire:

sample = np.arange(5000)

print(sample) --> 0,1,2,3,4,5,6,7,8,9,10,11,...

C'est un [x for x in range(5000)], version numpy :)

Bref, j'espère vous avoir aider, si je suis pas dans l'erreur.

Bonne chance

A+

  • Partager sur Facebook
  • Partager sur Twitter
27 juillet 2017 à 11:08:03

Bonjour nolimitech, et merci de ton aide

J'avais bien compris que les lignes en questions ne servaient pas à faire la séparation train/test.

Dans le cours, il s'agit juste de réduire l'échantillon (70000 à 5000) pour accélérer le temps de traitement. Pour cela il faut prendre 5000 éléments aléatoirement pour garder une distribution similaire à la distribution d'origine. Ces lignes servent donc à tirer 5000 numéro d'index entre 1 et 70 000 pour ensuite prendre les éléments correspondants.

Mais du coup si des éléments surviennent plusieurs fois, je me suis dis que cela pouvait fausser les prédictions.

Je tiens également à préciser que j'ai trouvé le topic dédié au cours (je l'avais raté, désolé). Il y est fait état du même problème :

Rico42 a écrit:

Bonjour,

Le TP "Entraînez le modèle des k plus proches voisins (k-NN)" passe par l'utilisation de la fonction

np.random.randint(70000, size=5000)

Or cette fonction ne fournit pas d'unicité sur les entiers tirés (cf. par exemple ce post : http://stackoverflow.com/questions/8505651/non-repetitive-random-number-in-numpy). N'est-ce pas problématique ? En tout cas ça le devient si on utilise cette méthode pour diviser le jeu de données du TP en données d'entrainement et de test.

Merci,

R.

-
Edité par Rico42 16 février 2017 à 16:18:11

Une des réponses mentionnent différentes méthodes pour faire correctement l'échantillonnage dans le cours mais je ne trouves pas...

EDIT : Il y a du coup une solution dans le lien dans la citation ^^'

-
Edité par korpi95 27 juillet 2017 à 11:11:58

  • Partager sur Facebook
  • Partager sur Twitter
30 décembre 2021 à 14:44:56 - Message modéré pour le motif suivant : Merci de créer votre propre sujet


30 décembre 2021 à 15:23:53

@YounousseHadjee Bonjour, merci de ne pas déterrer d'ancien sujet résolu pour une nouvelle question.

Déterrage

Citation des règles générales du forum :

Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.

Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre.
En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.

Au lieu de déterrer un sujet il est préférable :

  • soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
  • soit de créer un nouveau sujet décrivant votre propre contexte
  • ne pas répondre à un déterrage et le signaler à la modération

Je ferme ce sujet. En cas de désaccord, me contacter par MP.

  • Partager sur Facebook
  • Partager sur Twitter