scikit-learn的SVM基于LIBSVM。LIBSVM/SVM 要求对数据进行缩放,建议特征值应位于两个范围 [0, 1] 或 [-1, 1] 之一。也就是说,在典型的矩阵中,每列都是一个特征,缩放是按列完成的。
LIBSVM FAQ 建议进行简单的缩放,以获取 [0, 1] 之间的功能:
x'=(x-min)/(Max-min)
scikit-learn是否支持这种"简单缩放"?对于扩展要与 SVM 和 RBF 内核一起使用的功能,是否有其他建议?有什么参考资料吗?我找到了一篇基于 LIBSVM 的参考文章,名为"支持向量分类的实用指南",他们建议缩放到 [0, 1] 或 [-1, 1]。
是的,包含此功能。您描述的确切公式将在下一个版本中显示为 sklearn.preprocessing.MinMaxScaler
.目前,sklearn.preprocessing.Scaler
(将在下一个版本中重命名为StandardScaler
,但旧名称将保留以向后兼容)将特征居中并缩放为均值 0 和方差 1,这应该足以将数据传递给 SVM 学习器。
此外,sklearn.preprocessing.Normalizer
(以及用于文本分类的TfidfVectorizer
)将每个样本的值规范化为范围 [0, 1]。这相当于文本分类和信息检索中常见的长度规范化。
您可以使用 Pipeline
对象来构造居中、缩放的 SVM 分类器:
clf = Pipeline([('scale', Scaler()),
('svm', SVC())])
您正在寻找标准缩放器,至少对于 [-1,1] 情况。