Почему 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.