2012-10-03 41 views
3

scikit-learn的SVM基于LIBSVM。 LIBSVM/SVM要求应缩放数据,建议特征值应在两个范围[0,1]或[-1,1]之一中。也就是说,在典型的矩阵中,每列都是一个特征,缩放是按每列完成的。scikit支持在[0,1]或[-1,1]之间缩放功能

LIBSVM FAQ表明一个简单的缩放得到[0,1]之间的特征:

x'=(x-min)/(Max-min) 

是否scikit学习支持这种“简单的缩放”?是否还有其他建议来扩展要与SVM和RBF内核一起使用的功能。任何参考?我发现了一篇名为“支持向量分类的实用指南”的参考文章,该文章基于LIBSVM,并建议缩放为[0,1]或[-1,1]。

回答

5

是的,包括此功能。您所描述的确切公式将在下一个版本中作为sklearn.preprocessing.MinMaxScaler。现在,sklearn.preprocessing.Scaler(将在下一版本中改名为StandardScaler,但旧名称将保持周围向后compat的)中心和缩放功能,具有均值为0,方差为1,这应该是足够好将数据传递到SVM学习。

另外,sklearn.preprocessing.Normalizer(以及用于文本分类TfidfVectorizer)规格化每个样品值到范围[0,1]。这相当于文本分类和信息检索中常见的长度标准化。

可以使用Pipeline对象构造一个中心,缩放SVM分类:

clf = Pipeline([('scale', Scaler()), 
       ('svm', SVC())]) 
+0

谢谢拉斯曼!很明显,预处理.Scaler()是标准化列(平均值为零,var = 1)。但是,我没有得到范围[-1,+ 1]中的值。我有一个矩阵a。我使用下面的代码:scal = preprocessing.Scaler(),scal.fit(a),scal.transform(a)。结果不在[-1,+ 1]的范围内。 – user963386

+1

@ user963386确保您的矩阵包含浮点值。否则,缩放器将无法正常工作。 –

1

我认为你正在寻找的StandardScaler,至少为[-1,1]的情况。

+0

只有在带血的版本;这个班级在最新版本中仍然称为“Scaler”。详情请参阅我的回答。 –