3.4SGD中的非线性
将非线性插入线性SGD学习器中的最快方法(基本不麻烦),是将从数据流接收的实例向量转换为包括能量转换和特征的组合到一定程度的新向量。
组合可以表示特征之间的相互作用(说明两个特征何时共同对响应产生特殊影响),从而有助于SVM线性模型包含一定量的非线性。例如,双向交互是通过两个特征相乘实现的,三向交互是乘以三个特征等,从而为更高程度的扩展创建更复杂的交互。
在Scikit-learn中,预处理模块包含PolynomialFeatures类,该类可以通过多项式展开期望的程度来自动转换特征向量:
PolynomialFeatures要求输入稠密矩阵而不是稀疏矩阵。pull_examples函数允许设置一个稀疏参数,该参数通常设置为True,但可以设为False以返回稠密矩阵。
高维映射
虽然多项式展开是非常强大的转换,但当试图将其扩展到更高维度时,计算成本很高,并且由于过参数化所引起的过拟合而使其与捕捉重要非线性的积极效果迅速形成反差(有太多冗余且无用特征时)。正如在SVC和SVR中所看到的,核变换能帮助我们。隐式SVM核变换需要内存中的数据矩阵才能工作。Scikit-learn中包含一个基于随机逼近的变换类,它可以在线性模型上下文中获得与核SVM非常相似的结果。
sklearn.kernel_approximation模块包含以下算法:
RBFSampler:近似于RBF核的特征映射。
Nystroem:近似于使用训练数据子集的核映射。
AdditiveChi2Sampler:近似于附加的chi2核的特征映射,chi2核主要用于计算机视觉功能。
SkewedChi2Sampler:近似于与斜卡方核类似的特征映射,后者在计算机视觉中也会用到。
除Nystroem方法之外,上述类都不需要从数据样本中学习,这使它们成为在线学习的完美选择。它们只需知道示例矢量的形状(有多少特征),然后就能产生许多随机非线性来很好地拟合你的数据问题。
在这些近似算法中,没有需要解释的复杂的优化算法,事实上,优化本身被随机化取代,结果在很大程度上取决于输出特征的数量,这由n_components参数指示。输出特征越多,偶然获得可与你的问题完美结合的非线性的概率就越高。
值得注意的是,如果机会在创建正确特征来改善预测方面真的起到如此重要的作用,那么结果的可复现性就变得非常重要,必须努力获得它,否则将无法一致地重新训练,并以相同方式调整你的算法。注意,每个类都有random_state参数,用于控制随机特征生成,并能够在以后重新创建它,就像在不同计算机上一样。
有关这些特征创建技术的理论基础,请参阅A.Rahimi和Benjamin Recht撰写的科学论文:“Random Features for Large-Scale Kernel Machines”(http://www.eecs.berkeley.edu/~brecht/papers/07.rah.rec.nips.pdf)和“Weighted Sums of Random Kitchen Sinks: Replacing minimizationwith randomization in learning”(http://www.eecs.berkeley.edu/~brecht/papers/08.rah.rec.nips.pdf)。
对于读者来说,知道如何实现该技术并且有助于改进SGD模型就足够了,包括基于线性和SVM的模型: