我在一个80k大小的数据集上使用sklearn.svr
和RBF
内核,其中包含20多个变量。我想知道如何选择终止参数tol
。我问,因为对于C和γ的某些组合(我放弃前2天),回归似乎并不收敛。有趣的是,对于某些组合,它在不到10分钟后收敛,平均运行时间约为一小时。
设置此参数是否有某种经验法则?也许是与预测的标准差或预期值的关系?
答案 0 :(得分:5)
Mike的答案是正确的:网格搜索参数的子采样可能是训练SVR
中等数据集大小的最佳策略。 SVR不可扩展,因此不要浪费时间在完整数据集上进行网格搜索。尝试1000个随机子样本,然后是2000个然后是4000个。每次找到C和gamma的最佳值,并尝试猜测它们在数据集大小加倍时如何进化。
此外,您可以使用Nystroem kernel approximation和线性回归模型(如SGDRegressor,LinearRegression,LassoCV或ElasticNetCV)来逼近真正的SVR解决方案。 RidgeCV很可能不会在n_samples >> n_features
制度中改进LinearRegression。
最后,不要忘记通过在MinMaxScaler
StandardScaler
之前的SVR
模型之前放置Pipeline
或GradientBoostingRegressor
来扩展输入数据。
我也会尝试{{1}}个模型(尽管与SVR完全无关)。
答案 1 :(得分:4)
你可能已经看过scikit了解documentation的RBF功能。考虑到C和gamma实际上做了什么,以及SVR训练时间在样本数量方面最差二次的事实,我会尝试首先对一小部分数据进行训练。通过首先获得所有参数设置的结果,然后扩大所使用的训练数据量,您可能会发现实际上只需要一小部分数据样本来获得非常接近完整集的结果。
这是我最近由我的MSc项目主管给出的建议,因为我遇到了完全相同的问题。我发现,在一组具有250个功能的120k示例中,我只需要大约3000个样本,以获得全套模型误差的2%。
对不起,这不是直接回答你的问题,但我认为这可能会有所帮助。
答案 2 :(得分:3)
你真的不应该在大数据集上使用SVR
:它的训练算法需要在二次和三次时间之间。 sklearn.linear_model.SGDRegressor
可以毫无困难地对这些数据集进行线性回归,因此请尝试使用。如果线性回归不会破解它,请在将数据转换为SGDRegressor
之前使用kernel approximation转换数据,以获得RBF-SVM的线性时间近似值。