Machine learning 当您有大量的类时,为什么xgboost这么慢?

Machine learning 当您有大量的类时,为什么xgboost这么慢?,machine-learning,scikit-learn,xgboost,Machine Learning,Scikit Learn,Xgboost,我有一个稀疏的维度数据集(40000,21)。我正在尝试使用xgboost为它构建一个分类模型。不幸的是,它是如此缓慢,它从来没有终止对我来说。然而,在同一数据集上,scikit learn的RandomForestClassifier大约需要1秒。这是我正在使用的代码: 从xgboost导入XGBClassifier 从sklearn.employ导入随机林分类器 [...] t0=时间() rf=随机林分类器(n_作业=-1) 右前安装(列车X、列车Y) 打印(“射频分数”,射频分数(tes

我有一个稀疏的维度数据集
(40000,21)
。我正在尝试使用
xgboost
为它构建一个分类模型。不幸的是,它是如此缓慢,它从来没有终止对我来说。然而,在同一数据集上,scikit learn的RandomForestClassifier大约需要1秒。这是我正在使用的代码:

从xgboost导入XGBClassifier
从sklearn.employ导入随机林分类器
[...]
t0=时间()
rf=随机林分类器(n_作业=-1)
右前安装(列车X、列车Y)
打印(“射频分数”,射频分数(testX,testY))
打印(“拟合和评分随机林的时间”,时间()-t0)
t0=时间()
clf=XGBClassifier(n_作业=-1)
clf.fit(trainX,trainY,verbose=True)
打印(clf.分数(testX,testY))
打印(“适应和评分xgboost所用的时间”,时间()-t0)
要显示trainX的类型:

打印(报告(列车X))
请注意,我使用的是除n_作业之外的所有默认参数

我做错了什么


[3]中的
:打印(xgboost.\uuuuuuu版本)
0.6
打印(sklearn.\uuuu版本\uuuuu)
0.19.1
我在评论中尝试了以下建议:

  • 我设置了
    n\u枚举数=5
    。现在它至少在62秒内完成。这仍然比RandomForestClassifier慢60倍左右
  • 使用
    n_枚举数=5
    I删除
    n_作业=-1
    并设置
    n_作业=1
    。然后它在大约107秒内完成(大约比RandomForestClassifier慢100倍)。如果我将
    n_jobs
    增加到4,则速度最快可达27秒。仍然比随机分类器慢27倍左右
  • 如果我保留默认的估计数,它仍然不会为我完成

下面是使用假数据重现问题的完整代码。我为两个分类器设置了n_估计器=50,这将使随机森林分类器的速度降低到16秒左右。另一方面,Xgboost对我来说永远不会终止

#/usr/bin/python3
从sklearn.dataset导入make_分类
从xgboost导入XGBClassifier
从sklearn.employ导入随机林分类器
从时间导入时间
(trainX,trainY)=进行分类(n_信息=10,n_冗余=0,n_样本=50000,n_类=120)
打印(“trainX和trainY的形状”,trainX.Shape,trainY.Shape)
t0=时间()
rf=随机森林分类器(n_估计器=50,n_作业=-1)
右前安装(列车X、列车Y)
打印(“RandomForestClassifier经过的时间为:”,Time()-t0)
t0=时间()
xgbrf=XGBClassifier(n_估计器=50,n_作业=-1,verbose=True)
xgbrf.配合(列车X、列车Y)
打印(“XGBClassifier经过的时间为:,Time()-t0)

事实证明xgboost的运行时间与类的数量成二次比例。参见。

事实证明xgboost的运行时间与类的数量成二次比例。请参阅。

那么,它用verbose输出了什么?@sascha您从clf.fit中根本没有得到任何输出。它只使用所有的核,而且永远不会结束。例如,看看n_估计量=5会发生什么。或者对数据进行二次采样。这些是我首先尝试的简单步骤。看看是算法复杂还是有什么问题。哦,我在你使用sklearn的gradientboosting的表达式下面。但是根据,这个参数应该存在。你在用这个包装纸吗?没有xgboost的任何经验;我认为在numpy/scipy sparse->xgboost的内部稀疏数据格式转换方面存在一些问题。也许不相关。但它并不像人们想象的那么完美。如果你设置
n_jobs=1
?XGBoost如果还有其他同时使用python的
多处理的进程,那么它会用verbose输出什么呢?@sascha您从clf.fit中根本没有得到任何输出。它只使用所有的核,而且永远不会结束。例如,看看n_估计量=5会发生什么。或者对数据进行二次采样。这些是我首先尝试的简单步骤。看看是算法复杂还是有什么问题。哦,我在你使用sklearn的gradientboosting的表达式下面。但是根据,这个参数应该存在。你在用这个包装纸吗?没有xgboost的任何经验;我认为在numpy/scipy sparse->xgboost的内部稀疏数据格式转换方面存在一些问题。也许不相关。但它并不像人们想象的那么完美。如果你设置
n_jobs=1
?XGBoost如果还有其他同时使用python的
多处理
的进程。