scikit-learnの現在の安定バージョン0.13を使用しています。クラスを使用して、線形サポートベクター分類器を一部のデータに適用していsklearn.svm.LinearSVC
ます。
scikit-learnのドキュメントの前処理に関する章で、私は次のことを読みました。
学習アルゴリズムの目的関数で使用される多くの要素(サポートベクターマシンのRBFカーネルや線形モデルのl1およびl2正規化子など)は、すべての特徴がゼロを中心とし、同じ順序で分散していることを前提としています。ある特徴の分散が他の特徴よりも桁違いに大きい場合、それが目的関数を支配し、推定量が他の特徴から期待どおりに正しく学習できなくなる可能性があります。
質問1:標準化はSVM全般に役立ちますか、私の場合のように線形カーネル関数を持つ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