具有 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
我看到很多关于 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