Почему xgboost такой медленный, когда у вас большое количество классов?

У меня есть редкий набор данных измерений (40000, 21), Я пытаюсь построить классификационную модель для него, используя xgboost, К сожалению, это так медленно, что никогда не заканчивается для меня. Однако на том же наборе данных RandomForestClassifer scikit-learn занимает около 1 секунды. Это код, который я использую:

from xgboost import XGBClassifier
from sklearn.ensemble import RandomForestClassifier
[...]
t0 = time()
rf = RandomForestClassifier(n_jobs=-1)
rf.fit(trainX, trainY)
print("RF score", rf.score(testX, testY))
print("Time to fit and score random forest", time()-t0)

t0 = time()
clf = XGBClassifier(n_jobs=-1)
clf.fit(trainX, trainY, verbose=True)
print(clf.score(testX, testY))
print("Time taken to fit and score xgboost", time()-t0)

Чтобы показать тип поезда X:

print(repr(trainX))    
<40000x21 sparse matrix of type '<class 'numpy.int64'>'
    with 360000 stored elements in Compressed Sparse Row format>

Обратите внимание, что я использую все параметры по умолчанию, кроме n_jobs.

Что я делаю неправильно?


In [3]: print(xgboost.__version__)
0.6
print(sklearn.__version__)
0.19.1

Я постарался так далеко от совета в комментариях:

  • Я поставил n_enumerators = 5, Теперь, по крайней мере, это заканчивается за 62 секунды. Это все еще примерно в 60 раз медленнее, чем RandomForestClassifier.
  • С n_enumerators = 5 Я удалил n_jobs=-1 и установить n_jobs=1, Затем он завершился примерно за 107 секунд (примерно в 100 раз медленнее, чем RandomForestClassifier). Если я увеличу n_jobs до 4 это ускоряет до 27 секунд. Все еще примерно в 27 раз медленнее, чем RandomForestClassifier.
  • Если я оставлю количество оценок по умолчанию, оно все равно никогда не закончится для меня.

Вот полный код для воспроизведения проблемы с использованием поддельных данных. Я установил n_estimators=50 для обоих классификаторов, что замедляет RandomForestClassifier примерно до 16 секунд. Xgboost, с другой стороны, никогда не заканчивается для меня.

#!/usr/bin/python3

from sklearn.datasets import make_classification
from xgboost import XGBClassifier
from sklearn.ensemble import RandomForestClassifier
from time import time

(trainX, trainY) = make_classification(n_informative=10, n_redundant=0, n_samples=50000, n_classes=120)

print("Shape of trainX and trainY", trainX.shape, trainY.shape)
t0 = time()
rf = RandomForestClassifier(n_estimators=50, n_jobs=-1)
rf.fit(trainX, trainY)
print("Time elapsed by RandomForestClassifier is: ", time()-t0)
t0 = time()
xgbrf = XGBClassifier(n_estimators=50, n_jobs=-1,verbose=True)
xgbrf.fit(trainX, trainY)
print("Time elapsed by XGBClassifier is: ", time()-t0)

1 ответ

Решение

Оказывается, что время работы xgboost масштабируется квадратично с количеством классов. См. https://github.com/dmlc/xgboost/issues/2926.

Другие вопросы по тегам