26

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

4

2 に答える 2

38

ない。

scaler.transform(X_train)効果はありません。transform操作は適切ではありません。あなたはしなければならない

X_train = scaler.fit_transform(X_train)

X_test = scaler.transform(X_test)

また

X_train = scaler.fit(X_train).transform(X_train)

トレーニングデータとテストデータの両方で常に同じ前処理を行う必要があります。そして、はい、データに対するあなたの信念を反映していれば、標準化は常に良いことです。特にkernel-svmsの場合、それはしばしば重要です。

于 2013-02-04T18:45:05.273 に答える
8

Pipelineトランスと推定器を一度にチェーン(または組み合わせ)するために使用してみませんか?データを個別にフィッティングして変換し、Estimatorを使用する手間を省きます。スペースも節約できます。

from sklearn.pipeline import Pipeline

pipe_lrSVC = Pipeline([('scaler', StandardScaler()), ('clf', LinearSVC())])
pipe_lrSVC.fit(X_train, y_train)
y_pred = pipe_lrSVC.predict(X_test)
于 2016-09-16T20:26:04.677 に答える