расчет случайного леса с огромными разреженными данными - PullRequest
0 голосов
/ 31 марта 2020

Я пытаюсь вычислить случайный лес на огромных разреженных данных с несколькими метками. Набор данных имеет 94 цели, некоторые из них используются «ячмень» (2 из 650000), а некоторые вообще не используются. Но у меня нет (32 ГБ) оперативной памяти, и я не могу рассчитать все в одном go. Поэтому я следовал Руководству по «пакетированию» случайного леса:

https://stats.stackexchange.com/questions/327335/batch-learning-w-random-forest-sklearn

Когда я пытался что-то предсказать, я получил ошибку (ниже).

Поэтому я попробовал другой подход: вычисление случайного леса по частям данных и их последующее объединение:

forest_model = None

forest_model_final = None
start = time.time()
for e in range(5): # 5 passes through the data
    print("Epoch:", e)
    for batch_index, (X, y) in enumerate(dataloader_dict['Train_and_Validation']):
        forest_model = RandomForestClassifier(warm_start = False, n_estimators = 1, n_jobs=parameters['num_workers'])
        X = np.squeeze(X.numpy(), axis=1)
        y = np.squeeze(y.numpy(), axis=1)
        y_one_hot = np.array(y > parameters['threshold'], dtype=int)
        forest_model.fit(X,y_one_hot)

        if forest_model_final is not None:
            forest_model_final = combine([forest_model_final, forest_model])
        else:
            forest_model_final = forest_model
end = time.time()
print("Time (s): %s"%(end-start))
def combine(all_ensembles):
    """Combine the sub-estimators of a group of ensembles

        >>> from sklearn.datasets import load_iris
        >>> from sklearn.ensemble import ExtraTreesClassifier
        >>> iris = load_iris()
        >>> X, y = iris.data, iris.target

        >>> all_ensembles = [ExtraTreesClassifier(n_estimators=4).fit(X, y)
        ...                  for i in range(3)]
        >>> big = combine(all_ensembles)
        >>> len(big.estimators_)
        12
        >>> big.n_estimators
        12
        >>> big.score(X, y)
        1.0

    """
    final_ensemble = copy(all_ensembles[0])
    final_ensemble.estimators_ = []

    for ensemble in all_ensembles:
        final_ensemble.estimators_ += ensemble.estimators_

    # Required in old versions of sklearn
    final_ensemble.n_estimators = len(final_ensemble.estimators_)

    return final_ensemble

Я получаю ту же ошибку, когда пытаюсь что-то предсказать с помощью вычисленного случайного леса .

Ошибка: ValueError: non-broadcastable output operand with shape (50,1) doesn't match the broadcast shape (50,2)

Я нашел похожий вопрос Неожиданное исключение при объединении случайных лесных деревьев , но я не понимаю, что мне теперь делать.

Полная трассировка:

ValueError                                Traceback (most recent call last)
<ipython-input-10-4f8ce9181286> in <module>
      7     yval = np.squeeze(yval.numpy(), axis=1)
      8     y_one_hot = yval > parameters['threshold']
----> 9     yval_pred = forest_model_final.predict_proba(Xval)
     10     #Todo stuff
     11     acc_batch = accuracy_score(y_one_hot, yval_pred)

~/anaconda3/envs/column-labeling/lib/python3.6/site-packages/sklearn/ensemble/_forest.py in predict_proba(self, X)
    667             delayed(_accumulate_prediction)(e.predict_proba, X, all_proba,
    668                                             lock)
--> 669             for e in self.estimators_)
    670
    671         for proba in all_proba:

~/.local/lib/python3.6/site-packages/joblib/parallel.py in __call__(self, iterable)
   1014
   1015             with self._backend.retrieval_context():
-> 1016                 self.retrieve()
   1017             # Make sure that we get a last message telling us we are done
   1018             elapsed_time = time.time() - self._start_time

~/.local/lib/python3.6/site-packages/joblib/parallel.py in retrieve(self)
    906             try:
    907                 if getattr(self._backend, 'supports_timeout', False):
--> 908                     self._output.extend(job.get(timeout=self.timeout))
    909                 else:
    910                     self._output.extend(job.get())

~/anaconda3/envs/column-labeling/lib/python3.6/multiprocessing/pool.py in get(self, timeout)
    642             return self._value
    643         else:
--> 644             raise self._value
    645
    646     def _set(self, i, obj):

~/anaconda3/envs/column-labeling/lib/python3.6/multiprocessing/pool.py in worker(inqueue, outqueue, initializer, initargs, maxtasks, wrap_exception)
    117         job, i, func, args, kwds = task
    118         try:
--> 119             result = (True, func(*args, **kwds))
    120         except Exception as e:
    121             if wrap_exception and func is not _helper_reraises_exception:

~/.local/lib/python3.6/site-packages/joblib/_parallel_backends.py in __call__(self, *args, **kwargs)
    598     def __call__(self, *args, **kwargs):
    599         try:
--> 600             return self.func(*args, **kwargs)
    601         except KeyboardInterrupt:
    602             # We capture the KeyboardInterrupt and reraise it as

~/.local/lib/python3.6/site-packages/joblib/parallel.py in __call__(self)
    254         with parallel_backend(self._backend, n_jobs=self._n_jobs):
    255             return [func(*args, **kwargs)
--> 256                     for func, args, kwargs in self.items]
    257
    258     def __len__(self):

~/.local/lib/python3.6/site-packages/joblib/parallel.py in <listcomp>(.0)
    254         with parallel_backend(self._backend, n_jobs=self._n_jobs):
    255             return [func(*args, **kwargs)
--> 256                     for func, args, kwargs in self.items]
    257
    258     def __len__(self):

~/anaconda3/envs/column-labeling/lib/python3.6/site-packages/sklearn/ensemble/_forest.py in _accumulate_prediction(predict, X, out, lock)
    453         else:
    454             for i in range(len(out)):
--> 455                 out[i] += prediction[i]
    456
    457

ValueError: non-broadcastable output operand with shape (50,1) doesn't match the broadcast shape (50,2)
...