web-dev-qa-db-fra.com

définition de valeurs pour ntree et mtry pour le modèle de régression forestière aléatoire

J'utilise le package R randomForest pour effectuer une régression sur certaines données biologiques. La taille de mes données d'entraînement est 38772 X 201.

Je me demandais juste --- quelle serait une bonne valeur pour le nombre d'arbres ntree et le nombre de variables par niveau mtry? Existe-t-il une formule approximative pour trouver de telles valeurs de paramètres?

Chaque ligne de mes données d'entrée est un caractère de 200 représentant la séquence d'acides aminés, et je veux construire un modèle de régression pour utiliser une telle séquence afin de prédire les distances entre les protéines.

38
DOSMarter

La valeur par défaut pour mtry est tout à fait raisonnable, il n'est donc pas vraiment nécessaire de la nettoyer. Il existe une fonction tuneRF pour optimiser ce paramètre. Cependant, sachez que cela peut provoquer des biais.

Il n'y a pas d'optimisation pour le nombre de répliques bootstrap. Je commence souvent par ntree=501, puis tracez l'objet forêt aléatoire. Cela vous montrera la convergence d'erreur basée sur l'erreur OOB. Vous voulez suffisamment d'arbres pour stabiliser l'erreur, mais pas autant que vous corrélez trop l'ensemble, ce qui conduit à une sur-adaptation.

Voici la mise en garde: les interactions variables se stabilisent à un rythme plus lent que l'erreur donc, si vous avez un grand nombre de variables indépendantes, vous avez besoin de plus de répétitions. Je garderais le ntree un nombre impair pour que les liens puissent être rompus.

Pour les dimensions de votre problème, je commencerais par ntree=1501. Je recommanderais également d'examiner une des approches de sélection de variables publiées pour réduire le nombre de vos variables indépendantes.

36
Jeffrey Evans

La réponse courte est non.

La fonction randomForest a bien sûr des valeurs par défaut pour ntree et mtry. La valeur par défaut pour mtry est souvent (mais pas toujours) sensée, alors qu'en général les gens voudront augmenter ntree de sa valeur par défaut de 500 un peu.

La valeur "correcte" de ntree n'est généralement pas très préoccupante, car il sera tout à fait évident avec un peu de bricolage que les prédictions du modèle ne changeront pas beaucoup après un certain nombre d'arbres.

Vous pouvez passer (lire: perdre) beaucoup de temps à bricoler des choses comme mtry (et sampsize et maxnodes et nodesize etc.), probablement pour certains avantages, mais selon mon expérience pas beaucoup. Cependant, chaque ensemble de données sera différent. Parfois, vous pouvez voir une grande différence, parfois pas du tout.

Le paquet caret a une fonction très générale train qui vous permet de faire une recherche simple dans la grille sur des valeurs de paramètres comme mtry pour une grande variété de modèles. Ma seule mise en garde serait que le faire avec des ensembles de données assez volumineux risque de prendre du temps assez rapidement, alors faites attention à cela.

De plus, j'ai en quelque sorte oublié que le package ranfomForest lui-même a une fonction tuneRF qui est spécifiquement pour rechercher la valeur "optimale" pour mtry.

18
joran

Ce document pourrait-il aider? Limiter le nombre d'arbres dans les forêts aléatoires

Abstrait. Le but de cet article est de proposer une procédure simple qui détermine a priori un nombre minimum de classificateurs à combiner afin d'obtenir un niveau d'exactitude de prédiction similaire à celui obtenu avec la combinaison d'ensembles plus grands. La procédure est basée sur le test de signification non paramétrique de McNemar. Connaître a priori la taille minimale de l'ensemble classificateur donnant la meilleure précision de prédiction, constitue un gain de temps et de coûts mémoire notamment pour les énormes bases de données et les applications temps réel. Ici, nous avons appliqué cette procédure à quatre systèmes de classificateurs multiples avec un arbre de décision C4.5 (Breiman’s Bagging, Ho’s Random subspaces, leur combinaison que nous avons appelée ‘Bagfs’ et Breiman’s Random forest) et cinq grandes bases de données de référence. Il convient de noter que la procédure proposée peut facilement être étendue à d'autres algorithmes d'apprentissage de base qu'un arbre de décision. Les résultats expérimentaux ont montré qu'il est possible de limiter significativement le nombre d'arbres. Nous avons également montré que le nombre minimum d'arbres requis pour obtenir la meilleure précision de prédiction peut varier d'une méthode de combinaison de classificateurs à une autre

Ils n'utilisent jamais plus de 200 arbres.

enter image description here

5
bastaPasta

Une bonne astuce que j'utilise est de commencer par commencer par prendre la racine carrée du nombre de prédicteurs et de brancher cette valeur pour "mtry". C'est généralement à peu près la même valeur que la fonction tunerf dans une forêt aléatoire choisirait.

1
KHAN irfan

J'utilise le code ci-dessous pour vérifier la précision lorsque je joue avec ntree et mtry (changez les paramètres):

results_df <- data.frame(matrix(ncol = 8))
colnames(results_df)[1]="No. of trees"
colnames(results_df)[2]="No. of variables"
colnames(results_df)[3]="Dev_AUC"
colnames(results_df)[4]="Dev_Hit_rate"
colnames(results_df)[5]="Dev_Coverage_rate"
colnames(results_df)[6]="Val_AUC"
colnames(results_df)[7]="Val_Hit_rate"
colnames(results_df)[8]="Val_Coverage_rate"


trees = c(50,100,150,250)
variables = c(8,10,15,20)

for(i in 1:length(trees))
{
  ntree = trees[i]
  for(j in 1:length(variables))
  {
    mtry = variables[j]
    rf<-randomForest(x,y,ntree=ntree,mtry=mtry)
    pred<-as.data.frame(predict(rf,type="class"))
    class_rf<-cbind(dev$Target,pred)

    colnames(class_rf)[1]<-"actual_values"
    colnames(class_rf)[2]<-"predicted_values"
    dev_hit_rate = nrow(subset(class_rf, actual_values ==1&predicted_values==1))/nrow(subset(class_rf, predicted_values ==1))
    dev_coverage_rate = nrow(subset(class_rf, actual_values ==1&predicted_values==1))/nrow(subset(class_rf, actual_values ==1))

    pred_prob<-as.data.frame(predict(rf,type="prob"))
    prob_rf<-cbind(dev$Target,pred_prob)
    colnames(prob_rf)[1]<-"target"
    colnames(prob_rf)[2]<-"prob_0"
    colnames(prob_rf)[3]<-"prob_1"
    pred<-prediction(prob_rf$prob_1,prob_rf$target)
    auc <- performance(pred,"auc")
    dev_auc<-as.numeric([email protected])

    pred<-as.data.frame(predict(rf,val,type="class"))
    class_rf<-cbind(val$Target,pred)

    colnames(class_rf)[1]<-"actual_values"
    colnames(class_rf)[2]<-"predicted_values"
    val_hit_rate = nrow(subset(class_rf, actual_values ==1&predicted_values==1))/nrow(subset(class_rf, predicted_values ==1))
    val_coverage_rate = nrow(subset(class_rf, actual_values ==1&predicted_values==1))/nrow(subset(class_rf, actual_values ==1))

    pred_prob<-as.data.frame(predict(rf,val,type="prob"))
    prob_rf<-cbind(val$Target,pred_prob)
    colnames(prob_rf)[1]<-"target"
    colnames(prob_rf)[2]<-"prob_0"
    colnames(prob_rf)[3]<-"prob_1"
    pred<-prediction(prob_rf$prob_1,prob_rf$target)
    auc <- performance(pred,"auc")
    val_auc<-as.numeric([email protected])
    results_df = rbind(results_df,c(ntree,mtry,dev_auc,dev_hit_rate,dev_coverage_rate,val_auc,val_hit_rate,val_coverage_rate))
  }
}   
1
Hillary Murefu