我看到了許多關于 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 模型的特殊原因可能導致它?
uj5u.com熱心網友回復:
您訓練每個 SVM 的資料少于用于推理的資料 (1/20 * 500K),并且 RBF SVM 在訓練和推理方面的擴展性都很差(盡管不同)。如果您想使用 RBF SVM,您可能需要使用更快的實作,例如cuML中的實作(需要 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
- 顯卡:Quadro RTX 8000
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/480846.html
標籤:Python 机器学习 scikit-学习 支持向量机
