具有 SVR 的 Scikit-learn BaggingRegressor 训练速度快但预测速度慢

Scikit-learn BaggingRegressor with SVR fast to train but slow to predict

我看到很多关于 SVM 速度的问题,但没有关于训练和预测之间差异的问题。这是相关模型的代码:

from sklearn.svm import SVR
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
from sklearn.compose import TransformedTargetRegressor 
from sklearn.ensemble import BaggingRegressor

svr = SVR(C=1e-1, epsilon=0.1, tol=1e0)
pipeline = Pipeline([('scaler', StandardScaler()), ('model', svr)])
model = TransformedTargetRegressor(regressor=pipeline, transformer=StandardScaler())
model = BaggingRegressor(base_estimator=model, n_estimators=20, max_samples=1/20, n_jobs=-1)

以上能够在不到 2 分钟的时间内训练近 500,000 个具有 50 个特征的样本,但预测一半的样本需要 > 20 分钟。附带说明一下,在没有装袋的情况下训练 TransformedTargetRegressor 花费了将近 10 个小时,做出预测花费了几个小时。因此,不仅训练比 bagging 预测快得多,而且 bagging 为训练节省的时间也比预测节省的时间多得多。

有什么可以解决的吗?或者至少,是否有关于 SVM/SVR 模型的特定问题可能导致它?

您训练每个 SVM 使用的数据少于用于推理的数据 (1/20 * 500K),并且 RBF SVM 在训练和推理方面的扩展性都很差(尽管有所不同)。如果你想使用 RBF SVM,你可能想使用更快的实现,例如 cuML 中的实现(需要 NVIDIA GPU)(免责声明:我在这个项目上工作)。 (已编辑)

我在机器 [0] 上使用随机 500K x 20 数据集获得以下性能。

import cuml

from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
from sklearn.compose import TransformedTargetRegressor 
from sklearn.ensemble import BaggingRegressor
from sklearn.datasets import make_regression

X, y = make_regression(n_samples=500000, n_features=20)

svr = cuml.svm.SVR(C=1e-1, epsilon=0.1, tol=1e0)
pipeline = Pipeline([('scaler', StandardScaler()), ('model', svr)])
model = TransformedTargetRegressor(regressor=pipeline, transformer=StandardScaler())
model = BaggingRegressor(base_estimator=model, n_estimators=20, max_samples=1/20)

%time model.fit(X,y)
%time preds = model.predict(X)

CPU times: user 1.58 s, sys: 156 ms, total: 1.73 s
Wall time: 1.73 s
CPU times: user 7.23 s, sys: 485 ms, total: 7.72 s
Wall time: 7.73 s

[0] 系统

  • CPU:Intel(R) Xeon(R) Gold 6128 CPU @ 3.40GHz,CPU(s):12
  • GPU:Quadro RTX 8000