IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

R Discussion :

Classification/Classement sur très grosse base de données


Sujet :

R

  1. #1
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    127
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 127
    Points : 58
    Points
    58
    Par défaut Classification/Classement sur très grosse base de données
    Bonjour tout le monde,

    Je reviens vers vous pour savoir si quelqu'un avait déjà traité de très grande base de données sous R.
    En ce moment j'ai une matrice de presque 30 millions d'individus pour 10 variables qualitatives (environ 4 modalités par variable) et avec R ça plante quasiment à chaque fois dès que je fais une opération sur ce jeu de données (après l'avoir chargé via la librairie RMySql).

    Du coup je me retrouve à "bidouiller" comme suit:
    - tirage aléatoire de 5000 individus (après ça rame bien trop)
    - une ACM pour avoir des données "numériques" (i.e. les coordonnées de mes individus sur tous les axes factoriels)
    - un CAH via la fonction HCPC de FactoMineR

    Mais après ... ? Comment classer du coup mes autres individus dans les 2 groupes ainsi obtenus?
    Utiliser une méthode de prédiction (arbre de décision) avec comme variable à prédire l'appartenance à mes classes obtenues?

    D'ailleurs est-ce une bonne méthode de ne sélectionner que 5000 individus et de "généraliser" comme ça?

    Si quelqu'un avait un "tuyau" ou même une autre méthode à me conseiller je suis preneur!
    Peut être qu'ici R atteint des limites et je devrais peut être coder ça sur quelque chose de plus "robuste"?

    Cordialement,

    Hollow

    PS: je suis sous Ubuntu 12.10 avec un processeur 4x Intel(R) Core(TM) i5-2500 CPU @3.3GHz avec 16Gb de RAM sur un SSD de 115 Gb si jamais ça peut aider

  2. #2
    Membre confirmé
    Inscrit en
    Mars 2013
    Messages
    208
    Détails du profil
    Informations forums :
    Inscription : Mars 2013
    Messages : 208
    Points : 461
    Points
    461
    Par défaut
    Re coucou,
    Commence par lancer ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    memory.limit(size = NA)
    qui renvoit la limite max de ram allouée à R

    Si c'est inférieur à tes 16000 de ram tu as encore de l'espoir puisque tu peux allouer plus (pour R 64bit) en faisant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    memory.limit(size = 16000)
    Si tu ne peux pas allouer plus, bon courage


    Aha, non serieusement si ca suffit pas, un échantillonage intelligent reste une bonne solution (par intelligent j'entend que tu dois reflechir un minimum à la façon dont tu selectionnes tes individus et faire des testz pour vérifier que tu ne loupes pas des catégories spécifiques en gros).

    Minimum syndical: tu fais un modèle avec un échantillonage.
    Tu refais le même modèle avec genre 100 simulations d'echantillonages différents et tu verifies que les résultats sont les mêmes. (ou très proches).


    Autre chose très importante: quand tu commences à être ric rac niveau mémoire, c'est vraiment le moment de coder proprement les choses et d'avoir un workspace propre, à savoir:

    -on efface au fur et à mesure les données crées qui ne servent plus
    avec rm() puis un gc() pour le ramasse miette.
    -quand on doit garder des résultats pour la suite (genre le-mega-modèle-super-lourd-qui-prend-toute-la-ram) on les sauvegarde en dur sur le disque avec la fonction save(x, file), et on les efface de la ram (rm();gc()).
    Quand on en a rebesoin on les rappelle dans la ram avec load(file).


    Bonne chance

  3. #3
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    127
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 127
    Points : 58
    Points
    58
    Par défaut
    Citation Envoyé par Sengar Voir le message
    Re coucou,
    Commence par lancer ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    memory.limit(size = NA)
    qui renvoit la limite max de ram allouée à R

    Si c'est inférieur à tes 16000 de ram tu as encore de l'espoir puisque tu peux allouer plus (pour R 64bit) en faisant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    memory.limit(size = 16000)
    Si tu ne peux pas allouer plus, bon courage


    Aha, non serieusement si ca suffit pas, un échantillonage intelligent reste une bonne solution (par intelligent j'entend que tu dois reflechir un minimum à la façon dont tu selectionnes tes individus et faire des testz pour vérifier que tu ne loupes pas des catégories spécifiques en gros).

    Minimum syndical: tu fais un modèle avec un échantillonage.
    Tu refais le même modèle avec genre 100 simulations d'echantillonages différents et tu verifies que les résultats sont les mêmes. (ou très proches).


    Autre chose très importante: quand tu commences à être ric rac niveau mémoire, c'est vraiment le moment de coder proprement les choses et d'avoir un workspace propre, à savoir:

    -on efface au fur et à mesure les données crées qui ne servent plus
    avec rm() puis un gc() pour le ramasse miette.
    -quand on doit garder des résultats pour la suite (genre le-mega-modèle-super-lourd-qui-prend-toute-la-ram) on les sauvegarde en dur sur le disque avec la fonction save(x, file), et on les efface de la ram (rm();gc()).
    Quand on en a rebesoin on les rappelle dans la ram avec load(file).


    Bonne chance
    Hey Sengar,

    Malheureusement est réservé à Windows ... mais je pense que mon directeur technique a allouer 16Gb de RAM max à R.

    Je fais régulièrement des rm(), gc() et comme tu dis l'option save() et load() est utile.

    Mais là je parle d'un environnement "vierge" lorsque ça "rame" trop. Bref seule solution l'échantillonnage comme tu dis.

    En revanche ici l'échantillonnage est compliqué à réalisé puisque je cherches justement des comportements homogènes au travers de ce grand jeu de données ...
    D'où ma question car à mon avis tu y as répondu ... je fais mon modèle en échantillonnant ma population ... puis je fais la même chose 100 fois (environ) en vérifiant la stabilité?

    Mais justement ici je ne vois pas comment vérifier cette stabilité pour mes groupes car j'ai du mal à analyser les sorties via la librairie FactoMineR.
    Je suppose que l'idée c'est de voir si les modalités qui contribuent à la variabilité (et donc à la conception de mes groupes) ne changent pas trop en fonction de l'échantillon?

    Typiquement voici une sortie que j'ai
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    res.hcpc$desc.var
    $test.chi2
                            p.value df
    Var1                 0.000000e+00  3
    Var2                 0.000000e+00  4
    Var3                 2.762328e-33  1
    Var4                 3.490518e-03  2
    Var5                 1.338222e-02  1
    où res.hcpc est ici de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    res.mca <- MCA(datacah, ncp = 20, quali.sup = c(6), graph = TRUE)
    res.hcpc<-HCPC(res.mca,nb.clust = 2, consol = TRUE, kk = Inf)
    Donc là j'ai "forcé" à couper en 2 groupes mais bon j'aurai pu laisser une coupure "optimale".
    Dans datacah (mes données originales avec mes modalités) j'ai bien 7 variables qualitatives dont une que je considère comme "supplémentaire".
    Déjà j'ai du mal à comprendra comment une de mes variables ne participent pas à ma classification (res.hcpc) et surtout les p-value à 0.00000 pour les 2 premières variables (qui à l'issu de mon ACM sont effectivement les variables qui sont les plus aux extrémités sur mes axes factoriels - les 2 premiers -).

    Puis j'ai logiquement une information sur la description des axes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $category
    $category$`1`
                                                   Cla/Mod    Mod/Cla Global p.value v.test
    Var2Mod1                                  99.25880 76.3057930  64.76  0.000000e+00 Inf
    Var1Mod3                                 100.00000 95.0142450  80.04   0.000000e+00 Inf
    Mais là encore j'ai du mal à voir ...
    Pourtant quand je représentes mes groupes sur les axes du clustering (dimension 1 = 17%, dim 2 = 15% environ) c'est assez clair comme séparation ... séparation linéaire d'ailleurs) mais j'ai du mal à quoi correspondent ces axes justement.

    Bref un peu l'impression d'avoir biaisé mon approche et d'avoir perdu beaucoup d'information au final ...

    Si tu as des conseils je suis plus que preneur

    Amicalement,

    Hollow

  4. #4
    Membre confirmé
    Homme Profil pro
    MCU
    Inscrit en
    Juillet 2010
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : MCU
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2010
    Messages : 185
    Points : 486
    Points
    486
    Par défaut
    Bonjour,

    Ma seule expérience similaire a été d'ouvrir un fichier de 35 millions de lignes, mais juste pour appliquer des filtres et faire des summary. La seule différence est que j'avais 24 Go de RAM... Vous n'avez pas accès à un cluster?

    Sinon, vous pouvez aller voir du côté des Task Views (http://cran.cict.fr/web/views/HighPe...Computing.html). Il y a peut-être un package qui vous aidera...

    HTH

    Vincent

  5. #5
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    127
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 127
    Points : 58
    Points
    58
    Par défaut
    Bonjour,

    Merci pour le lien j'irai jeter un coup d’œil!

    Je n'ai pas accès à un cluster ... enfin avec échantillonnage mais après je suis confronté au problème que je cite au dessus.

    Merci,

    Hollow

  6. #6
    Membre confirmé
    Inscrit en
    Mars 2013
    Messages
    208
    Détails du profil
    Informations forums :
    Inscription : Mars 2013
    Messages : 208
    Points : 461
    Points
    461
    Par défaut
    Citation Envoyé par hollowdeadoss Voir le message
    Hey Sengar,

    En revanche ici l'échantillonnage est compliqué à réalisé puisque je cherches justement des comportements homogènes au travers de ce grand jeu de données ...
    D'où ma question car à mon avis tu y as répondu ... je fais mon modèle en échantillonnant ma population ... puis je fais la même chose 100 fois (environ) en vérifiant la stabilité?

    Mais justement ici je ne vois pas comment vérifier cette stabilité pour mes groupes car j'ai du mal à analyser les sorties via la librairie FactoMineR.
    Je suppose que l'idée c'est de voir si les modalités qui contribuent à la variabilité (et donc à la conception de mes groupes) ne changent pas trop en fonction de l'échantillon?
    Effectivement avec une CAH c'est un peu moins évident qu'avec un modèle ou tu peux comparer des coefficients (genre regression).

    Mais tu peux toujours vérifier que l'importance de chaque variable dans la création de tes axes est stable suivant l'echantillonage.

    Tu peux aussi construire un modèle 1 sur un échantillon 1, construire un modèle i sur un échantillon i, et voir si ton modèle 1 regroupe les même individus de échantillon i que modèle i. (et tu fais varier i de 2 à 100).

  7. #7
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    127
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 127
    Points : 58
    Points
    58
    Par défaut
    Citation Envoyé par Sengar Voir le message
    Effectivement avec une CAH c'est un peu moins évident qu'avec un modèle ou tu peux comparer des coefficients (genre regression).

    Mais tu peux toujours vérifier que l'importance de chaque variable dans la création de tes axes est stable suivant l'echantillonage.

    Tu peux aussi construire un modèle 1 sur un échantillon 1, construire un modèle i sur un échantillon i, et voir si ton modèle 1 regroupe les même individus de échantillon i que modèle i. (et tu fais varier i de 2 à 100).
    Merci bien pour l'information.

    En revanche je n'ai pas bien saisi le coup de tes échantillons.
    Je peux effectivement créer plusieurs modèles sur des échantillons différents et ainsi avoir chaque échantillon divisé en un nombre (fixé) de clusters.

    Mais j'ai du mal justement à voir, après une CAH (peut être que je m'y prends mal) quel est le modèle derrière!
    Par exemple je n'ai pas quelque chose comme "si l'individu à la modalité i pour la variable j et la modalité k pour la variable l alors il appartient à la classe 2".

    C'est ça qui me bloque le plus en fait. Et une CAH c'est également bien nouveau pour moi

    Hollow

  8. #8
    Membre habitué
    Homme Profil pro
    Analyste
    Inscrit en
    Février 2012
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste

    Informations forums :
    Inscription : Février 2012
    Messages : 62
    Points : 143
    Points
    143
    Par défaut
    Bonjour,

    Tout d'abord, merci Sengar pour ces conseils avisés, et Hollodeadoss pour cette discussion plaisante. ^^

    Mais j'ai du mal justement à voir, après une CAH (peut être que je m'y prends mal) quel est le modèle derrière!
    Si tu cherches une classification en 2 catégories la régression logistique semble être un bon choix d'étape suivante. Elle permet de prédire l'appartenance d'un individu à l'une ou l'autre des classes.
    Une fois ta CAH réalisée, l'avantage (et finalement son rôle dans le processus est principalement celui-ci) est que cela t'a permis d'étiqueter tes individus avec leur classe d'appartenance. (Ce qui revient à ajouter en fin de tableau une nouvelle colonne "cluster" pouvant être égale à 1 ou 2) Et de considérer cet échantillon comme base d'apprentissage pour un modèle de régression logistique, qui doit exister dans le package FactoMineR.

    Que tu peux ensuite appliquer sur le reste de tes données, et enfin observer les classes prédites. Sans oublier que l'ACM t'aura permis de caractériser ces classes.

    Sinon, plusieurs fois évoqué dans d'autres posts, le package bigdata pourrait-il être une solution ?

    En tout cas bon courage ,

    Guinue

  9. #9
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    127
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 127
    Points : 58
    Points
    58
    Par défaut
    Citation Envoyé par Guinue Voir le message
    Bonjour,

    Tout d'abord, merci Sengar pour ces conseils avisés, et Hollodeadoss pour cette discussion plaisante. ^^



    Si tu cherches une classification en 2 catégories la régression logistique semble être un bon choix d'étape suivante. Elle permet de prédire l'appartenance d'un individu à l'une ou l'autre des classes.
    Une fois ta CAH réalisée, l'avantage (et finalement son rôle dans le processus est principalement celui-ci) est que cela t'a permis d'étiqueter tes individus avec leur classe d'appartenance. (Ce qui revient à ajouter en fin de tableau une nouvelle colonne "cluster" pouvant être égale à 1 ou 2) Et de considérer cet échantillon comme base d'apprentissage pour un modèle de régression logistique, qui doit exister dans le package FactoMineR.

    Que tu peux ensuite appliquer sur le reste de tes données, et enfin observer les classes prédites. Sans oublier que l'ACM t'aura permis de caractériser ces classes.

    Sinon, plusieurs fois évoqué dans d'autres posts, le package bigdata pourrait-il être une solution ?

    En tout cas bon courage ,

    Guinue
    Thx Guinue!

    Effectivement je pensais à une régression logistique et/ou un arbre de décision avec comme variable à prédire le numéro du cluster d'appartenance.

    Mais ce que me conseillait Sengar c'était de faire tourner N fois l'algo et donc N fois une rég.log (ou arbre) pour vérifier qu'on est pas trop mal?

    Ce qui est délicat avec une CAH (ou autre méthode de classif') c'est qu'il y a peu de mesures pour quantifier l'erreur ou quelque chose dans le style.
    Avec un k-means (ma première idée) je me retrouvais dépendant de mes centres. Même si j'aurai pu faire tourner k-means sur les centres obtenus après un k-means ... mouai

    Le package FactoMineR ne contient pas (il me semble) de fonction pour la régression logistique. Ceci dit avec la fonction glm() c'est ok.

    J'ai vu également une fonction hclust() du package cluster mais je crois que je dois définir une distance avant (donc effectuer un calcul peut être coûteux?) pour pouvoir faire une CAH.

    Je regarderai le package Big Data que je ne connais pas

    Ah autres questions :
    - en quoi mon ACM (que je fais généralement avant pour "numériser" mes individus et appliquer une CAH) peut m'aider à "expliquer" mes clusters obtenus? Car avec les résultats que j'ai mis au dessus j'avoue que je suis perdu ... des p-values égales à 0 et des v.test à Inf

    - j'avais cru voir que souvent les gens faisaient un k-means avant la CAH pour diminuer le nombre d'individus (en se servant uniquement des 100 barycentres du k-means par exemple) et en faisant tourner cette routine plusieurs fois pour vérifier que ce soit bien cohérent. Encore une fois l'interprétation au niveau des individus me parait complexe

    En tout cas merci pour vos conseils, idées, remarques, etc. ça fait vraiment avancer surtout pour quelqu'un qui comme moi est probabiliste à la base ^^

    Cordialement,

    Hollow

  10. #10
    Membre habitué
    Homme Profil pro
    Analyste
    Inscrit en
    Février 2012
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste

    Informations forums :
    Inscription : Février 2012
    Messages : 62
    Points : 143
    Points
    143
    Par défaut
    Bonsoir,

    Au sujet de l'interprétation des résultats de l'ACM pour décrire les classes, je voulais dire les résultats de la CAH...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $category$`1`
                                                   Cla/Mod    Mod/Cla Global p.value v.test
    Var2Mod1                                  99.25880 76.3057930  64.76  0.000000e+00 Inf
    Var1Mod3                                 100.00000 95.0142450  80.04   0.000000e+00 Inf
    Ces résultats (pour un clustering en deux classes c'est ça?), indique que la 1ère modalité de la variable 2 est fortement présente dans cette classe. C'est elle qui la "caractérise" le plus.
    Vient ensuite la 3ème modalité de la variable 1.
    Tu peux également t'intéresser aux modalités qui s'y opposent, et qui ont les coefficient les plus négatifs (tout en ayant une p_value satisfaisante).

    L'autre info est Cla/Mod, Mod/Cla et Global qui doivent être respectivement :
    - le pourcentage d'individus ayant cette modalité et qui se trouvent dans cette classe (ici sur la totalité des individus présentant cette modalité, 99.3% sont dans cette classe!);
    - le pourcentage d'individus dans cette classe à présenter cette modalité (ici 76.3%). La classe est-elle peuplée, la modalité peu présente au final, ni l'un ni l'autre? ;
    - et enfin Global, le pourcentage d'individus de l'échantillon à avoir cette modalité.

    On peut donc comprendre que la p_value s'affole un peu.
    Si les classes étaient construites de façon aléatoire, on pourrait s'attendre à ce que "seulement" 64% des individus de la classe 1 n'aient cette modalité, et que ces 64%Ind(Var2mod1,classe1) représentent la moitié des Ind(Var2mod1). Or ici c'est beaucoup plus. La p_value permet de répondre à la question "apporte-t-elle une différence significative?" Oui. Cette modalité à été importante dans la construction des classes. Sinon, as-tu obtenu un warning en réalisant la CAH ? Es-tu sûr qu'il n'y a pas de NA ou de blanc caché dans tes données?
    Sans quoi, il ne reste plus qu'à analyser les autres ^^ Pour les deux classes ^^.

    Désolé de ne pas répondre à toutes les questions aujourd'hui, mais à bientôt

    Bonne nuit/journée.

    Guinue

  11. #11
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    127
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 127
    Points : 58
    Points
    58
    Par défaut
    Merci BEAUCOUP à toi (et aux autres ) pour ces informations,

    J'y vois plus clair maintenant.
    Je vais regarder ça de plus près mais déjà ça me semble plus "clair".

    Encore merci ... et à bientôt pour d'autres questions certainement

    Bien amicalement,

    Hollow

Discussions similaires

  1. Très grosses bases de données en XML
    Par Childerique dans le forum Format d'échange (XML, JSON...)
    Réponses: 8
    Dernier message: 18/11/2014, 12h07
  2. Classification sur grosse base de données
    Par Souplixx dans le forum SAS STAT
    Réponses: 5
    Dernier message: 07/11/2014, 14h06
  3. Utiliser LEFT JOIN sur une grosse base de données
    Par bractar dans le forum Requêtes
    Réponses: 20
    Dernier message: 11/01/2014, 07h32
  4. rechercher rapidement sur une très grande base de données access
    Par unja2010 dans le forum Bases de données
    Réponses: 1
    Dernier message: 29/06/2013, 15h16
  5. [Crystal] Performance sur grosses base de données
    Par Nico118 dans le forum SAP Crystal Reports
    Réponses: 5
    Dernier message: 14/11/2003, 15h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo