【问题标题】:Sklearn StackingClassifier very slow and inconsistent cpu usageSklearn StackingClassifier 非常慢且 CPU 使用率不一致
【发布时间】:2022-08-22 21:22:10
【问题描述】:

我最近一直在尝试 sklearn 的 StackingClassifier 和 StackingRegressor,但我注意到它总是很慢并且使用我的 cpu 效率低下。假设(仅出于此示例的目的)我想使用 StackingClassifier 来堆叠随机森林和 lightgbm,同时使用 lightgbm 作为最终分类器。在这种情况下,我希望运行 StackingClassifier 所需的时间大致等于运行单个随机森林所需的时间 + 运行 2 个单独的 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=490ms,但它需要大约 3000ms,超过 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)    

我还注意到(在更大的数据集上运行这个完全相同的代码时,我需要足够长的时间才能监控我的 cpu 使用情况)StackingClassifier 的 cpu 使用情况无处不在。

例如,运行单个 lightgbm 的 cpu 使用情况:

cpu usage running the individual lightgbm

(基本上始终 100%,因此有效地使用 cpu)

cpu usage running lightgbm as stackingclassifier

(到处都是,通常远不及 100%)

我是否做错了什么导致 StackingClassifier 比各部分的总和慢得多?

    标签: python machine-learning scikit-learn


    【解决方案1】:

    Sklearn 的 StackingClassifier 不为估计器实现交叉验证,只为最终的元估计器实现。实际上,它实现了一个默认设置为 5 的 cross_val_predict。StackingClassifier Documentation

    在您的代码中,您在“cross_val_score”中调用 StackingClassifier。它基本上执行 StackingClassifier 的 cross_val_predict 的次数与您设置的 cross_val_score 的外部 cv 一样多。

    这或许可以解释墙上的时差。

    【讨论】:

      猜你喜欢
      • 2019-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多