我在具有 20 多个变量的 80k 大小的数据集上使用内核sklearn.svr
。RBF
我想知道如何选择终止参数tol
。我问是因为对于 C 和 gamma 的某些组合(我放弃前 2 天以上),回归似乎没有收敛。有趣的是,对于某些平均运行时间约为一小时的组合,它在不到 10 分钟后收敛。
设置此参数是否有某种经验法则?也许与预测的标准偏差或预期值有关?
我在具有 20 多个变量的 80k 大小的数据集上使用内核sklearn.svr
。RBF
我想知道如何选择终止参数tol
。我问是因为对于 C 和 gamma 的某些组合(我放弃前 2 天以上),回归似乎没有收敛。有趣的是,对于某些平均运行时间约为一小时的组合,它在不到 10 分钟后收敛。
设置此参数是否有某种经验法则?也许与预测的标准偏差或预期值有关?
Mike 的回答是正确的:网格搜索参数的子采样可能是SVR
在中等大小的数据集上训练的最佳策略。SVR 不可扩展,因此不要浪费时间在整个数据集上进行网格搜索。尝试 1000 个随机子样本,然后是 2000 个,然后是 4000 个。每次都找到 C 和 gamma 的最佳值,并尝试在将数据集大小加倍时猜测它们是如何演变的。
您还可以使用Nystroem 内核近似和线性回归模型(例如 SGDRegressor、LinearRegression、LassoCV 或 ElasticNetCV)来近似真正的 SVR 解决方案。RidgeCV 可能不会改进该n_samples >> n_features
机制中的 LinearRegression。
最后,不要忘记通过将 aMinMaxScaler
或 a放在 a 中的模型StandardScaler
之前来缩放输入数据。SVR
Pipeline
我也会尝试GradientBoostingRegressor
模型(尽管与 SVR 完全无关)。
You really shouldn't use SVR
on large data sets: its training algorithm takes between quadratic and cubic time. sklearn.linear_model.SGDRegressor
can fit a linear regression on such datasets without trouble, so try that instead. If linear regression won't hack it, transform your data with a kernel approximation before feeding it to SGDRegressor
to get a linear-time approximation of an RBF-SVM.
您可能已经看过 RBF 函数的 scikit learn文档。考虑到 C 和 gamma 的实际作用以及 SVR 训练时间在样本数量上最多是二次方的事实,我会先尝试在一小部分数据上进行训练。通过首先获取所有参数设置的结果,然后扩大使用的训练数据量,您可能会发现实际上只需要一小部分数据样本即可获得非常接近完整集的结果。
这是我的理学硕士项目主管最近给我的建议,因为我遇到了完全相同的问题。我发现在具有 250 个特征的 120k 个示例中,我只需要大约 3000 个样本就可以将误差控制在完整模型的 2% 以内。
抱歉,这不是直接回答您的问题,但我认为它可能会有所帮助。