【发布时间】:2013-01-19 06:00:02
【问题描述】:
我正在使用 scikit-learn 的当前稳定版本 0.13。我正在使用 sklearn.svm.LinearSVC 类对一些数据应用线性支持向量分类器。
在 scikit-learn 文档中的 chapter about preprocessing 中,我阅读了以下内容:
学习算法的目标函数中使用的许多元素(例如支持向量机的 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)
简而言之,我是否必须在训练数据上使用scaler.fit(X_train) 或scaler.fit_transform(X_train) 才能通过LinearSVC 获得合理的结果?
【问题讨论】:
标签: python scikit-learn classification svm normalization