为什么当类别数量很大时,xgboost 运行得如此缓慢?

我有一个尺寸为 (40000, 21) 的稀疏数据集。我试图使用 xgboost 为其构建分类模型。不幸的是,它运行得非常慢,以至于从未完成。然而,在相同的数据集上,scikit-learn 的 RandomForestClassifer 大约需要1秒钟。这是我使用的代码:

from xgboost import XGBClassifierfrom 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)

展示 trainX 的类型:

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.6print(sklearn.__version__)0.19.1

到目前为止,我根据评论中的建议尝试了以下方法:

  • 我设置了 n_enumerators = 5。现在至少它在62秒内完成了。这仍然比 RandomForestClassifier 慢大约60倍。
  • n_enumerators = 5 的情况下,我移除了 n_jobs=-1 并设置了 n_jobs=1。然后它在大约107秒内完成(比 RandomForestClassifier 慢大约100倍)。如果我将 n_jobs 增加到4,这会加速到27秒。仍然比 RandomForestClassifier 慢大约27倍。
  • 如果我保留默认的估计器数量,它仍然永远不会为我完成。

这是使用假数据重现问题的完整代码。我为两个分类器都设置了 n_estimators=50,这使得 RandomForestClassifier 的速度减慢到大约16秒。另一方面,xgboost 仍然从未为我终止过。

#!/usr/bin/python3from sklearn.datasets import make_classificationfrom xgboost import XGBClassifierfrom sklearn.ensemble import RandomForestClassifierfrom 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)

回答:

事实证明,xgboost 的运行时间随着类别数量的增加而呈二次方增长。参见 https://github.com/dmlc/xgboost/issues/2926

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注