Sklearn StackingClassifier очень медленно и непоследовательно использует процессорPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Sklearn StackingClassifier очень медленно и непоследовательно использует процессор

Сообщение Anonymous »

Недавно я пробовал StackingClassifier и StackingRegressor из sklearn, но заметил, что они всегда работают очень медленно и неэффективно используют мой процессор. Допустим (только ради этого примера), что я хочу использовать StackingClassifier для сложения случайного леса и Lightgbm, также используя Lightgbm в качестве окончательного классификатора. В этом случае я ожидаю, что время, необходимое для запуска StackingClassifier, будет примерно равно времени, необходимому для запуска отдельного случайного леса + время для запуска двух отдельных LightGBM + некоторый небольшой запас (по сути, это сумма частей + время на обучение самого StackingClassifier + небольшой запас), однако на практике это занимает в несколько раз больше времени. Пример:

Код: Выделить всё

import numpy as np
from sklearn.datasets import load_iris
from sklearn.ensemble import RandomForestClassifier
from sklearn.ensemble import StackingClassifier
import lightgbm as ltb
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import StratifiedKFold

X,y = load_iris(return_X_y=True)
cv = StratifiedKFold(n_splits=10)
lgbm = ltb.LGBMClassifier(n_jobs=4)
rf = RandomForestClassifier()
Сначала только LightGBM, на моем компьютере это занимает около 140 мс:

Код: Выделить всё

%%time
scores = cross_val_score(lgbm, X, y, scoring='accuracy', cv=cv, n_jobs=4, error_score='raise')
np.mean(scores)
И просто случайный лес, у меня это занимает около 220 мс:

Код: Выделить всё

%%time
scores = cross_val_score(rf, X, y, scoring='accuracy', cv=cv, n_jobs=-1, error_score='raise')
np.mean(scores)
А теперь StackingClassifier, который объединяет эти два. Поскольку в основном выполняются два вышеуказанных блока кода + еще один раунд LightGBM, я ожидаю, что это займет примерно 250+120+120=490 мс, но вместо этого это занимает около 3000 мс, что более чем в 6 раз больше:

Код: Выделить всё

%%time
estimators = [
('rf', rf),
('lgbm,', lgbm)
]

clf = StackingClassifier(
estimators=estimators, final_estimator=lgbm, passthrough=True)

scores = cross_val_score(clf, X, y, scoring='accuracy', cv=cv, n_jobs=4, error_score='raise')
np.mean(scores)
Я также заметил (при запуске этого же кода на большем наборе данных, поэтому мне требуется достаточно времени, чтобы отслеживать использование моего процессора), что использование процессора с помощью StackingClassifier повсюду.
Например, использование ЦП при работе отдельного LightGBM:
Использование ЦП при работе отдельного LightGBM
(в основном стабильно 100%, что позволяет эффективно использовать процессор)
Использование процессора при запуске Lightgbm в качестве классификатора стекирования
(повсюду, обычно это далеко не 100%)
Я делаю что-то не так, из-за чего StackingClassifier работает намного медленнее, чем сумма частей?

Подробнее здесь: https://stackoverflow.com/questions/730 ... -cpu-usage
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»