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

 

Discussion: Quel modèle sous R ?

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Sans emploi
    Inscrit en
    mai 2018
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Sans emploi

    Informations forums :
    Inscription : mai 2018
    Messages : 12
    Points : 6
    Points
    6

    Par défaut Quel modèle sous R ?

    Bonjour,

    Actuellement je travaille sur un "projet". Je dispose d'un train qui contient deux variables qualitatives et plusieurs autres quantitatives (p=122, plus de 1010 observations, et oui cela demandera beaucoup de temps...) et d'un output binaire (0 et 1).

    Je cherche à réduire le nombre de variables en employant des méthodes de sélection des variables (Lasso, AIC, BIC, etc) ensuite à supprimer les individus aberrants/trop influents. Mais avant de commencer, je me demande si je dois faire ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    modele <- lm(output~.,data=train)
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    modele <- glm(output~.,data=train,family='binomial')
    glm puisque je suis dans le cas d'une régression logistique, n'est-ce pas ?

    Merci infiniment.

  2. #2
    Membre habitué
    Homme Profil pro
    Data scientist
    Inscrit en
    février 2017
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Data scientist
    Secteur : Conseil

    Informations forums :
    Inscription : février 2017
    Messages : 90
    Points : 173
    Points
    173

    Par défaut

    Bonjour,

    Si ta variable est binaire il faut plutôt modéliser ta variable avec un modèle glm (avec une régression logistique par exemple), du coup plutôt la deuxième proposition. Vu le nombre important de variables explicatives, il faut penser à les réduire. Plusieurs possibilités existent, par exemple :
    Dans le cas d'une régression logistique on suppose un lien linéaire, peut être commencer par calculer la corrélation entre le output et les variables explicatives et de garder que celles corrélées. Il faut penser aussi à calculer des corrélations entre variables explicatives et supprimer quelques-unes ou bien regrouper ou transformer ou autres... Pour ensuite penser aux méthodes de sélection du genre (BIC, AIC, etc). Il faut peut-être penser à d'autres modèles comme du random forest qui peuvent aussi donner de bons résultats.

    Bon courage.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Sans emploi
    Inscrit en
    mai 2018
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Sans emploi

    Informations forums :
    Inscription : mai 2018
    Messages : 12
    Points : 6
    Points
    6

    Par défaut

    Bonjour Marou,

    Merci de ta réponse.

    Justement dans un premier temps j'ai pensé à une matrice de corrélation sous forme de heatmap mais ça n'a pas vraiment aidé. Je mets le résultat ici (soit Y le output) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    sort(abs(mat_cor["Y",]))
    Résultat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
     
    X11_diffRefinery.intake.kmt.   X9_diffSumClosing.stocks.kmt. 
                        0.000884757                     0.001032880 
         X7_diffClosing.stocks.kmt.  X9_diffSumRefinery.intake.kmt. 
                        0.001343633                     0.001431370 
                         X5_diffWTI   X2_diffSumClosing.stocks.kmt. 
                        0.001958504                     0.002050878 
                X3_diffImports.kmt.                      X2_diffWTI 
                        0.002225036                     0.002325955 
             X3_diffSumImports.kmt.                      X8_diffWTI 
                        0.002409202                     0.002675259 
      X7_diffSumClosing.stocks.kmt.     X11_diffClosing.stocks.kmt. 
                        0.002923717                     0.003007989 
         X2_diffClosing.stocks.kmt.             X8_diffImports.kmt. 
                        0.003550260                     0.004210182 
        X12_diffClosing.stocks.kmt.     X3_diffRefinery.intake.kmt. 
                        0.004415497                     0.004565846 
         X5_diffClosing.stocks.kmt.      X1_diffClosing.stocks.kmt. 
                        0.005336938                     0.005377100 
                X4_diffExports.kmt.   X6_diffSumClosing.stocks.kmt. 
                        0.005831569                     0.006249086 
             X4_diffSumImports.kmt.      X8_diffClosing.stocks.kmt. 
                        0.006275335                     0.006878193 
                         X1_diffWTI                      X4_diffWTI 
                        0.007434680                     0.007474812 
          X4_diffSumProduction.kmt.     X10_diffClosing.stocks.kmt. 
                        0.008037896                     0.009218373 
         X9_diffClosing.stocks.kmt.   X8_diffSumClosing.stocks.kmt. 
                        0.009308070                     0.009681218 
                        X11_diffWTI            X10_diffExports.kmt. 
                        0.009903907                     0.010242897 
                X9_diffExports.kmt.             X4_diffImports.kmt. 
                        0.010691364                     0.011730258 
         X3_diffClosing.stocks.kmt.     X4_diffRefinery.intake.kmt. 
                        0.012000757                     0.012506469 
         X6_diffClosing.stocks.kmt.     X9_diffRefinery.intake.kmt. 
                        0.012982117                     0.013117168 
     X12_diffSumClosing.stocks.kmt.    X10_diffRefinery.intake.kmt. 
                        0.014397758                     0.014858110 
      X5_diffSumClosing.stocks.kmt.     X7_diffRefinery.intake.kmt. 
                        0.014883848                     0.015162887 
            X10_diffSumExports.kmt.            X10_diffImports.kmt. 
                        0.017261213                     0.017282067 
                X9_diffImports.kmt.      X4_diffClosing.stocks.kmt. 
                        0.018037476                     0.018385178 
    X10_diffSumRefinery.intake.kmt.  X4_diffSumRefinery.intake.kmt. 
                        0.018519562                     0.019462099 
          X9_diffSumProduction.kmt.     X5_diffRefinery.intake.kmt. 
                        0.019609240                     0.019724199 
                        X12_diffWTI             X2_diffImports.kmt. 
                        0.021102659                     0.021505298 
        X2_diffRefinery.intake.kmt.                      X9_diffWTI 
                        0.022002998                     0.022657470 
      X1_diffSumClosing.stocks.kmt.                      X3_diffWTI 
                        0.023096984                     0.023535819 
        X8_diffRefinery.intake.kmt.            X11_diffExports.kmt. 
                        0.023588041                     0.024539524 
     X8_diffSumRefinery.intake.kmt.  X5_diffSumRefinery.intake.kmt. 
                        0.025841818                     0.026057887 
                X3_diffExports.kmt.             X5_diffImports.kmt. 
                        0.026215826                     0.026487286 
        X6_diffRefinery.intake.kmt.                      X6_diffWTI 
                        0.028412836                     0.029618235 
                X5_diffExports.kmt.         X10_diffSumImports.kmt. 
                        0.031633011                     0.032322195 
                X7_diffImports.kmt.  X3_diffSumRefinery.intake.kmt. 
                        0.032998514                     0.035291335 
                         X7_diffWTI             X6_diffImports.kmt. 
                        0.035403312                     0.035957371 
             X9_diffSumImports.kmt.       X3_diffSumProduction.kmt. 
                        0.036095821                     0.036362558 
             X8_diffSumImports.kmt.            X11_diffImports.kmt. 
                        0.036924512                     0.038759652 
                X8_diffExports.kmt.      X10_diffSumProduction.kmt. 
                        0.039113724                     0.041225458 
      X4_diffSumClosing.stocks.kmt.             X2_diffExports.kmt. 
                        0.043819100                     0.044616792 
        X1_diffRefinery.intake.kmt.  X11_diffSumClosing.stocks.kmt. 
                        0.045549548                     0.047638205 
             X5_diffSumExports.kmt.            X12_diffImports.kmt. 
                        0.048678148                     0.049236706 
             X4_diffSumExports.kmt.   X3_diffSumClosing.stocks.kmt. 
                        0.050255418                     0.053532605 
                        X10_diffWTI  X10_diffSumClosing.stocks.kmt. 
                        0.054829652                     0.055946796 
       X12_diffRefinery.intake.kmt. X11_diffSumRefinery.intake.kmt. 
                        0.059600183                     0.060590503 
             X9_diffSumExports.kmt.             X7_diffExports.kmt. 
                        0.060813461                     0.064498832 
                X1_diffImports.kmt.         X11_diffSumExports.kmt. 
                        0.068701952                     0.074089290 
     X2_diffSumRefinery.intake.kmt.          X3_diffSumExports.kmt. 
                        0.077026249                     0.077239259 
                X6_diffExports.kmt.       X8_diffSumProduction.kmt. 
                        0.077461081                     0.081172585 
               X12_diffExports.kmt.          X2_diffSumImports.kmt. 
                        0.081792869                     0.085663549 
             X5_diffSumImports.kmt.       X5_diffSumProduction.kmt. 
                        0.090538409                     0.094498571 
     X6_diffSumRefinery.intake.kmt.         X11_diffSumImports.kmt. 
                        0.097467454                     0.098253536 
                X1_diffExports.kmt.          X8_diffSumExports.kmt. 
                        0.111983924                     0.122335521 
     X7_diffSumRefinery.intake.kmt.          X7_diffSumImports.kmt. 
                        0.138077054                     0.141063919 
         X11_diffSumProduction.kmt.       X2_diffSumProduction.kmt. 
                        0.151163044                     0.155940407 
             X6_diffSumImports.kmt.          X2_diffSumExports.kmt. 
                        0.160530512                     0.164776356 
          X7_diffSumProduction.kmt.          X6_diffSumExports.kmt. 
                        0.174201187                     0.175942913 
    X12_diffSumRefinery.intake.kmt.          X7_diffSumExports.kmt. 
                        0.178838546                     0.181618344 
          X6_diffSumProduction.kmt.  X1_diffSumRefinery.intake.kmt. 
                        0.187092778                     0.204796332 
            X12_diffSumExports.kmt.         X12_diffSumImports.kmt. 
                        0.236835846                     0.242992622 
             X1_diffSumImports.kmt.          X1_diffSumExports.kmt. 
                        0.255821239                     0.274853835 
         X12_diffSumProduction.kmt.       X1_diffSumProduction.kmt. 
                        0.296062282                     0.310710246 
                                  Y 
                        1.000000000
    Toutes les corrélations sont inférieures à 0.31. Par conséquent les variables explicatives ne sont pas corrélées avec la variable Y

    Quant à la méthode de sélection AIC, je viens de stopper la procédure car ce travail est très coûteux en temps (plus de 3h30 !)

    D'autre part, le vif est largement supérieur à 100, j'ai peur d'être dans un problème de multi-colinéarité...

    Des idées ?

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Sans emploi
    Inscrit en
    mai 2018
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Sans emploi

    Informations forums :
    Inscription : mai 2018
    Messages : 12
    Points : 6
    Points
    6

    Par défaut

    Et si je supprimais d'abord les individus aberrants/trop influents avant la sélection de variables ?

  5. #5
    Membre habitué
    Homme Profil pro
    Data scientist
    Inscrit en
    février 2017
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Data scientist
    Secteur : Conseil

    Informations forums :
    Inscription : février 2017
    Messages : 90
    Points : 173
    Points
    173

    Par défaut

    Bonjour,

    Supprimer les individus aberrants à ce stade ne servira à rien. Essaye de croiser la corrélation entre la var à expliquer et la corrélation entre variable explicatives. L'idée est de réduire au max le nombre de variables explicatives. Prendre que la corrélation supérieure à 30% c'est un bon début. Enlever les variables corrélées entre elles peut aussi aider. Essaye aussi du faire du calcul distribué vu le nombre de variables c'est une bonne alternative.

    Bonne courage.

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Sans emploi
    Inscrit en
    mai 2018
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Sans emploi

    Informations forums :
    Inscription : mai 2018
    Messages : 12
    Points : 6
    Points
    6

    Par défaut

    Merci !

    On peut utiliser aussi Lasso n’est-ce pas ? Car j’ai pu passer de 122 à 30 variables

  7. #7
    Membre habitué
    Homme Profil pro
    Data scientist
    Inscrit en
    février 2017
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Data scientist
    Secteur : Conseil

    Informations forums :
    Inscription : février 2017
    Messages : 90
    Points : 173
    Points
    173

    Par défaut

    Bonjour,

    C'est une bonne alternative.

    Cdlt

  8. #8
    Membre averti
    Inscrit en
    février 2011
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : février 2011
    Messages : 165
    Points : 344
    Points
    344

    Par défaut

    Bonjour,

    Tu dois pouvoir aussi regarder du côté de la generalized partial least square regression (gPLS). Sinon tu as tout ce qui concerne les random forest.

    cdlt

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Sans emploi
    Inscrit en
    mai 2018
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Sans emploi

    Informations forums :
    Inscription : mai 2018
    Messages : 12
    Points : 6
    Points
    6

    Par défaut

    Merciiiii.
    Je n’ai que 20% de mal classes. Ça convient quand même?
    Merci.
    Je ne connais pas gPLS... J’ai essayé avec rpart mais je ne vois pas toutes les variables lisibles... Merci quand même

    Il me reste plus qu’à tracer une courbe ROC.

    Bien à vous

  10. #10
    Membre habitué
    Homme Profil pro
    Data scientist
    Inscrit en
    février 2017
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Data scientist
    Secteur : Conseil

    Informations forums :
    Inscription : février 2017
    Messages : 90
    Points : 173
    Points
    173

    Par défaut

    Bonjour,

    C'est un bon taux quand même félicitation. Essaye aussi du coté des GBM du package gbm

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    gbm(formula = formula(data),
    distribution = "bernoulli",
    data = list(),
    weights,
    var.monotone = NULL,
    n.trees = 100,
    interaction.depth = 1,
    n.minobsinnode = 10,
    shrinkage = 0.001,
    bag.fraction = 0.5,
    train.fraction = 1.0,
    cv.folds=0,
    keep.data = TRUE,
    verbose = "CV",
    class.stratify.cv=NULL,
    n.cores = NULL)

  11. #11
    Futur Membre du Club
    Homme Profil pro
    Sans emploi
    Inscrit en
    mai 2018
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Sans emploi

    Informations forums :
    Inscription : mai 2018
    Messages : 12
    Points : 6
    Points
    6

    Par défaut

    Bonjour Marou.

    Je m'excuse pour le temps de répondre.

    J'ai essayé avec le gbm, je ne sais pas trop choisir le n.trees (par défaut =100 : seules les trois variables ont beaucoup d'impacts sur Y...)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    library('gbm')
     
    m_gbm=gbm(ytrain~.,data=xtrain,distribution='bernoulli',n.trees=2500)
    print(head(summary(m_gbm),8))
    R affiche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
                                                      var     rel.inf
    country                                       country 52.48175598
    month                                           month 45.08762598
    X1_diffSumProduction.kmt.   X1_diffSumProduction.kmt.  1.20462654
    X12_diffSumProduction.kmt. X12_diffSumProduction.kmt.  1.15948216
    X1_diffExports.kmt.               X1_diffExports.kmt.  0.06650934
    X1_diffImports.kmt.               X1_diffImports.kmt.  0.00000000
    X1_diffSumImports.kmt.         X1_diffSumImports.kmt.  0.00000000
    X2_diffExports.kmt.               X2_diffExports.kmt.  0.00000000
    Et pour le nombre optimal d'itérations Boosting, je ne comprends pas bien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    best.iter <- gbm.perf(m_gbm)#,method="cv") # ça ne fonctionne pas avec la CV car "cv.folds<1"
    Using OOB method...
    Warning message:
    In gbm.perf(m_gbm) :
      OOB generally underestimates the optimal number of iterations although predictive performance is reasonably competitive. Using cv.folds>0 when calling gbm usually results in improved predictive performance.
    (J'essayerai avec la gPLS ultérieurement, comme tototode l'a suggéré)
    Merci beaucoup

  12. #12
    Membre habitué
    Homme Profil pro
    Data scientist
    Inscrit en
    février 2017
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Data scientist
    Secteur : Conseil

    Informations forums :
    Inscription : février 2017
    Messages : 90
    Points : 173
    Points
    173

    Par défaut

    Bonjour,

    Normal, t'as pas précisé de cv.folds dans ta fonction gbm.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    m_gbm=gbm(ytrain~. , data=xtrain,distribution='bernoulli',n.trees=2500, cv.folds = 2,  train.fraction= 0.7)
     
    v = gbm.perf(object = gbm)
    #essaye de relancer ta modélisation avec n.trees = best.iter, et regarde le taux d'erreur et compare avec l'autre modèle. 
    m_gbm1=gbm(ytrain~.,data=xtrain,distribution='bernoulli',n.trees= best.iter, cv.folds = 2, train.fraction= 0.7)

  13. #13
    Futur Membre du Club
    Homme Profil pro
    Sans emploi
    Inscrit en
    mai 2018
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Sans emploi

    Informations forums :
    Inscription : mai 2018
    Messages : 12
    Points : 6
    Points
    6

    Par défaut

    Ah je vois maintenant !

    Quand j'augmente le nombre de n.trees, le paramètre optimal est égal à ce n.trees ! Bon, j'ai choisi 50 000 et j'ai 21.69 % des mal classés...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    m_gbm1=gbm(ytrain~.,data=xtrain,distribution='bernoulli',
              n.trees=best.iter,cv.folds = 2,  train.fraction= 0.7) #best.iter=49648
     
    f.predict <- predict(m_gbm1,xtrain,n.trees=best.iter,type='response')
     
    > MC(ytrain,round(abs(f.predict))) # MC : fonction qui calcule le taux d'erreur
     
    [1] "Error rate : 21.69 %"
     
    > MC(ytrain,Y1_pred) # Y1_pred=round(abs(predict.glm...))
     
    [1] "Error rate : 21.63 %"
    Je dois avoir mal sélectionné les variables, n'est-ce pas ? Tout ce que j'ai fait, c'est que j'ai utilisé le lasso et il sélectionne les variables qualitatives et quantitatives. Ensuite j'ai supprimé les qualitatives sélectionnées et réintroduit les variables qualitatives depuis le xtrain car factor... J'espère être clair ?

  14. #14
    Membre habitué
    Homme Profil pro
    Data scientist
    Inscrit en
    février 2017
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Data scientist
    Secteur : Conseil

    Informations forums :
    Inscription : février 2017
    Messages : 90
    Points : 173
    Points
    173

    Par défaut

    Bonjour,

    Désolé, mais c'est pas clair !

Discussions similaires

  1. [alim] quel modèle ?
    Par Piccolo_son dans le forum Composants
    Réponses: 4
    Dernier message: 06/01/2007, 16h20
  2. [JDBC] récuperer n'importe quel champ sous forme de String
    Par Hervé Saladin dans le forum JDBC
    Réponses: 3
    Dernier message: 31/05/2006, 10h04
  3. Quel compilateur sous Windows ?
    Par SteelBox dans le forum Distributions
    Réponses: 1
    Dernier message: 04/10/2005, 10h16
  4. [JTree] Quel modèle de données utiliser ?
    Par speedster dans le forum Composants
    Réponses: 2
    Dernier message: 11/07/2005, 20h44
  5. [CONCEPTION] quel modèle de base ?
    Par izioto dans le forum Décisions SGBD
    Réponses: 4
    Dernier message: 23/05/2005, 18h48

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