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