【发布时间】: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