Я пытаюсь вычислить случайный лес на огромных разреженных данных с несколькими метками. Набор данных имеет 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)