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.
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.
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
.
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.
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.
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))
}
}