我正在使用scikit-learn的当前稳定版本0.13。 我正在使用类sklearn.svm.LinearSVC
将线性支持向量分类器应用于一些数据。
在scikit-learn文档的预处理章节中,我读到了以下内容:
许多学习算法目标函数中使用的元素(例如支持向量机的RBF核或线性模型的l1和l2正则化器)都假设所有特征都以零为中心并且方差相同。 如果某个特征的方差比其他特征高出几个数量级,它可能会支配目标函数,并使估计器无法从其他特征中正确学习。
问题1:标准化对于SVM通常是有用的,也适用于像我这种具有线性核函数的情况吗?
问题2:据我所理解,我必须在训练数据上计算均值和标准差,并使用类sklearn.preprocessing.StandardScaler
将同样的转换应用于测试数据。 但是,我不明白是否必须在馈送给SVM分类器之前转换训练数据以及测试数据。
也就是说,我是否需要执行以下操作:
scaler = StandardScaler()
scaler.fit(X_train) # only compute mean and std here
X_test = scaler.transform(X_test) # perform standardization by centering and scaling
clf = LinearSVC()
clf.fit(X_train, y_train)
clf.predict(X_test)
还是我必须做这个:
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train) # compute mean, std and transform training data as well
X_test = scaler.transform(X_test) # same as above
clf = LinearSVC()
clf.fit(X_train, y_train)
clf.predict(X_test)
简而言之,为了在使用LinearSVC
时获得合理的结果,我是否必须在训练数据上使用scaler.fit(X_train)
或scaler.fit_transform(X_train)
?
X_train
上是否使用fit()
或fit_transform()
。 - pemistahl