Je manque de mémoire sur un serveur de 8 Go normal travaillant avec un ensemble de données assez petit dans un contexte d'apprentissage de la machine:
library(caret) library(Matrix) library(doMC) registerDoMC(2) response = 'class' repr = 'dummy' do.impute = F xmode = function(xs) names(which.max(table(xs))) read.orng = function(path) { # read header hdr = strsplit(readLines(path, n=1), '\t') pairs = sapply(hdr, function(field) strsplit(field, '#')) names = sapply(pairs, function(pair) pair[2]) classes = sapply(pairs, function(pair) if (grepl('C', pair[1])) 'numeric' else 'factor') # read data dfbase = read.table(path, header=T, sep='\t', quote='', col.names=names, na.strings='?', colClasses=classes, comment.char='') # switch response, remove meta columns df = dfbase[sapply(pairs, function(pair) !grepl('m', pair[1]) && pair[2] != 'class' || pair[2] == response)] df } train.and.test = function(x, y, trains, method) { m = train(x[trains,], y[trains,], method=method) ps = extractPrediction(list(m), testX=x[!trains,], testY=y[!trains,]) perf = postResample(ps$pred, ps$obs) list(m=m, ps=ps, perf=perf) } # From sparse.cor = function(x){ memory.limit(size=10000) n 200 levels') badfactors = sapply(mergef, function(x) is.factor(x) && (nlevels(x) 200)) mergef = mergef[, -which(badfactors)] print('remove near-zero variance predictors') mergef = mergef[, -nearZeroVar(mergef)] print('create model matrix, making everything numeric') if (repr == 'dummy') { dummies = dummyVars(as.formula(paste(response, '~ .')), mergef) mergem = predict(dummies, newdata=mergef) } else { mat = if (repr == 'sparse') model.matrix else sparse.model.matrix mergem = mat(as.formula(paste(response, '~ .')), data=mergef) # remove intercept column mergem = mergem[, -1] } print('remove high-correlation predictors') merge.cor = (if (repr == 'sparse') sparse.cor else cor)(mergem) mergem = mergem[, -findCorrelation(merge.cor, cutoff=.75)] print('try a couple of different methods') do.method = function(method) { train.and.test(mergem, mergef[response], mergef$istrain, method) } res.gbm = do.method('gbm') res.glmnet = do.method('glmnet') res.rf = do.method('parRF')
3 Réponses :
Vous pouvez essayer d'utiliser le paquet FF, qui implémente "le stockage de la mémoire à l'efficacité de la mémoire de données importantes sur les fonctions de disque et d'accès rapide". P>
Ne jetez pas au hasard des recommandations pour FF ou BigMemorie. L'OP a demandé à propos de l'aide avec le paquet Caret et ni FF ni BigMemory ne fonctionne avec elle. Donc, cette réponse est quelque part entre la base de la base et la trompeuse.
Vérifiez que le code aléatoire fort> aléatoire sous-jacent ne stocke pas la forêt des arbres. Peut-être réduire la longueur de tunéline code> de sorte que moins de valeurs de En outre, je serais probablement adapté à une seule forêt aléatoire à la main pour voir si je pouvais installer un tel modèle sur ma machine. Si vous ne pouvez pas en dire un directement, vous ne pourrez pas utiliser Caret Strong> pour s'adapter beaucoup en un. P>
À ce stade, je pense que vous devez déterminer ce qui cause la mémoire à ballon et comment vous pourriez contrôler le modèle de modèle de sorte qu'il ne contrôle pas de contrôle. Alors, ouvrez comment mTRR code> sont essayées. P>
aléatoireForest () code> et quelles options il utilise. Vous pourrez peut-être transformer une partie de celles-ci (comme stocker la forêt que j'ai mentionnée plus tôt, mais aussi les mesures d'importance variable). Une fois que vous avez déterminé la valeur optimale pour
MTRY code>, vous pouvez ensuite essayer d'adapter le modèle avec tous les extras que vous pourriez souhaiter aider interpréter l'ajustement. P>
J'avais peur que tu dis ça. La forêt aléatoire elle-même consomme une quantité de mémoire ridicule. ntree = 500 donne "Erreur: impossible d'allouer le vecteur de taille 384.7 Mo." ntree = 200 fonctionne, mais faillit matiner la mémoire. On dirait que je devrais devoir traiter spécialement RF (et d'autres modèles comme GBM) ou Juste Ditch R. Argh, pourquoi tout est-il en train de prendre autant de mémoire? J'espérais vraiment que je faisais quelque chose de mal ou de manquer quelque chose. Je vais marquer votre réponse comme accepté si je n'entends rien d'autre.
@Yang avez-vous appelé cela avec garder.forest = false code>? Sinon, faites cela. Aussi, avez-vous adapté l'interface de formule ou l'interface normale? Assurez-vous d'utiliser des matrices et non des cadres de données. Pourquoi
MERGMEM CODE> a-t-il deux fois plus de lignes que
BASTAINAINF CODE>? Je comprends pourquoi le nombre de colonnes est plus grand, mais pas pourquoi il y a deux fois plus de rangées. Nous montrant exactement b> Qu'est-ce que vous avez aidé, afin que nous ne puissions pas deviner. Veuillez éditer votre Q avec exemple de code que vous avez essayé (les appels réels).
@YANG R Tenez tous les objets en mémoire et les fonctions peuvent souvent copier des objets lorsqu'ils sont tranchés (sous-ensemble) ou réaffectés. C'est un problème avec R en général, mais il existe des moyens de contourner certains problèmes et vous pourriez toujours jeter plus de RAM à un problème ces jours-ci.
Gratter tout ça. Même Ntree = 200 déclenche finalement le tueur OMM. Donc, ce que j'ai dit plus tôt devrait être lu: "On dirait que je devrais te réécrire à la RF (et à d'autres modèles comme GBM) ou Ditch R." Je modifie ma réponse maintenant pour fournir plus de détails, mais la raison pour laquelle Mergem a 2 fois que les rangées de Basetrainf sont dues à la suréchantillonnage que j'ai mentionnée. Aussi j'utilise des matrices.
Code Premier Plein Source. En outre, je
@Yang vous avez posté du code qui utilise Caret B>. Lorsque vous dites au-dessus que vous avez fait RF avec Ntree = 200 code>, appeliez-vous le code YourSlef comme
aléato-foreste (x, y, ntree = 200, mTRy = 10) code> dire ou Où utilisez-vous le code que vous avez collé? Si ce dernier essaie le premier. Quant aux poids,
aléatoireForest code> a
classwt code> et
strata code> pour aider à l'échantillonnage dans les classes plus petites.
À ce stade, vous devez probablement demander une assistance d'experts de l'auteur de aléatoire forestiers () code> - les personnes utilisent R pour ces types de tâches sur les grands ensembles de données. Deuxièmement, vous pouvez essayer de profiler la mémoire utilisée, mais pour cela, vous devez compiler R avec support pour le profilage de la mémoire. Nettoyez votre espace de travail avant d'appeler le code - si vous n'avez pas besoin des autres objets de l'espace de travail R, éliminez-les d'eux. Essayez également de réduire l'autre bélier utilisé. Qu'est-ce qui occupe l'autre 2,6 Go de votre RAM?
@Gavin J'appelle directement la forêt aléatoire (non montré dans la source colletée). Merci pour le conseil à propos de Classwt / Strata. L'autre 2,6 Go de RAM est occupé par d'autres utilisateurs sur le serveur.
Je n'ai vu personne mentionner le paramètre nodesize code> dans
aléatoireForest code>, que vous pouvez définir pour contrôler la taille des arbres cultivés. Il n'est souvent pas nécessaire de faire pousser des arbres «plein» avec cette quantité de données. De plus, si vous souhaitez effectuer des prédictions sur de nouvelles données avec la sortie de la forêt en mémoire, vous pouvez utiliser l'argument
xtest code> (si vous avez les nouvelles données à la main, évidemment).
En outre, il n'est souvent pas nécessaire (avec de grands ensembles de données) de rééchantillonner l'ensemble des données définies pour obtenir de bonnes performances à partir de aléatorforest code>. Si vous définissez
Sampsize code> sur quelque chose de raisonnable, vous verrez probablement une réduction de dramatie de la mémoire ...
Avec cette quantité de données, les estimations d'erreur rééchappées et les estimations d'erreur de forêt de forêt aléatoire doivent être assez proches. Essayez d'utiliser Aussi, évitez l'interface de formule comme la peste. P>
Vous pouvez également essayer d'emballer à la place. Comme il n'existe pas de sélection aléatoire de prédicteurs à chaque broche, vous pouvez obtenir un bon résultat avec 50-100 Récrises (au lieu de beaucoup plus besoin de forêts aléatoires pour être efficace). P>
Les autres peuvent être en désaccord, mais je pense aussi que la modélisation de toutes les données que vous avez n'est pas toujours la meilleure approche. À moins que l'espace de prédicteur est important, bon nombre des points de données seront très similaires aux autres et ne contribuent pas beaucoup à l'ajustement du modèle (en plus de la complexité de calcul supplémentaire et de l'empreinte de l'objet résultant). TrainControl (méthode = "oob") code> et
train () code> ne correspondra pas aux modèles supplémentaires sur des ensembles de données ré-échantillonnés. P>
caret code> a une fonction appelée
maxdissim code> qui pourrait être utile pour éclaircir les données (bien qu'il ne soit pas terriblement efficace) P>
Avez-vous fini par changer de logiciel ou proposez une solution dans R? Je serais curieux d'entendre ce que certaines de vos approches plus prometteuses étaient, alors que j'ai des problèmes similaires. Je prévois d'utiliser de plus en plus de machines EC2 Spec'D Spec'd, car elles sont pratiques et je sais très très bien (jusqu'à ce que je dois mettre en œuvre une autre solution).
@Lockedoff j'ai fini par faire beaucoup plus de sous-échantillonnage (l'une des solutions «non idéales» que j'ai mentionnées - qui devrait également inclure «acheter plus de RAM»)!
Je suis maintenant capable d'évaluer les grilles de paramètres 3x3x3 à l'aide de
Caret CODE> sur un fichier de données de 350 000 x 30 Assez rapidement. C'était tuant mon 8 Go Quadcore MacBook Pro lorsqu'il est en cours d'exécution en parallèle (chaque noyau utilisait trop de mémoire), mais j'ai découvert hier que cela fonctionne très vite sur l'instance de haut niveau supplémentaire de haute mémoire d'Amazon ( aws.amazon.com/ec2/instance-types @ à environ 0,42 $ / h comme instance de point).