《Python大规模机器学习》—3.2.3 探究通过子采样改善非线性SVM
3.2.3 探究通过子采样改善非线性SVM
相比于其他机器学习算法,SVM具有很多优势:
能处理大多数监督学习问题,例如回归、分类和异常检测。尽管实际上最适合二分类问题。
能够很好处理噪声数据和异常值,而且与仅使用支持向量相比,常常进行较小的过拟合。
更适用于宽数据集(比示例有更多的特征),虽然与其他机器学习算法一样,SVM会同时采用降维和特征选择。
当然也存在以下缺点:
只能得到估计值,除非使用Platt缩放方法运行某些耗时和计算量密集的概率校准方法,否则没有概率。
与示例数量呈超线性比例。
尤其是最后一个缺点严重限制了对大数据集使用SVM。优化算法是此学习技术的
核心,这就是二次规划,它在Scikit-learn实现中运行规模介于O(特征数量*样本数量^2)和O(特征数量*样本数量^3)之间,其算法复杂度将算法的可操作性
严重限制于不超过有
10^4个实例的数据集。
同样,如上一章所见,当提供批处理算法和大量数据时仅有几个选项:子采样、并行化和通过流化进行非核心学习。子采样和并行化很少被当作最佳解决方法,流化是实现SVM以处理大规模问题的首选方法。
可是,尽管使用较少,但利用蓄水池采样技术很容易实现子采样,该技术可以从数据集和无限在线数据流中快速生成随机样本。通过子采样,能生成多个SVM模型,然后对其结果取平均值以获得更好结果。多个SVM模型的预测甚至可以叠加,以创建一个新数据集,
用于构建一个融合所有预测能力的新模型,这将在第6章中介绍。
蓄水池采样是从数据流中随机选择样本,而不需事先知道该流的长度的算法。事实上,每次在流中观察都有相同的被选择概率。
样本中的每个元素都以
流中的第一次观察所得到的样本进行初始化,它们都可以根据概率被流中的实例随时替代,而概率与到目前为止流入的元素数量成比例。所以,(例如)当流的第i个元素到达时,它可能以某概率***入样本中某个随机元素的位置。这种插入概率相当于样本维数除以i,因此,它会随流长度逐渐减小。如果流无限,那么通过随时停止可确保样本能代表迄今为止所看到的元素。
在我们的示例中,将从流中抽取两个随机且互斥的样本,一个用于训练,一个用于测试。我们将从森林覆盖类型数据库的原始有序文件从中提取这些样本。(由于采样前会流化所有数据,因此随机采样不会受排序影响。)我们选定5000个实例用于训练样本,这个数量应该在大多数台式计算机上都能得到很好扩展。测试集选用20 000个实例:
该算法在超过500 000行数据矩阵上运行非常快。事实上,为尽可能保持最快速度,在流化过程中未作任何预处理。因此,现在需要将数据转换为NumPy数组并标准化特征:
一旦处理完训练数据X、y,我们必须以相同方式处理测试数据;特别是必须在训练样本中使用标准参数标准化特征(均值和标准差):
当训练和测试集都准备就绪时,可以拟合SVC模型并预测结果:
- 点赞
- 收藏
- 关注作者
评论(0)