2016-11-16 3 views
1

CrossValidated(またはDataScience)StackExchangeに投稿することをためらっていましたが、私はここで質問しています。私は60のラベル付きオブジェクト(トレーニングに使用する)と150のラベルなしオブジェクト(テスト用)のデータセットを持っています。問題の目的は150個のオブジェクトのラベルを予測することです(これは宿題の問題として与えられていました)。各オブジェクトについて、258のフィーチャを計算しました。各オブジェクトをサンプルとして考えると、X_train : (60,258),y_train : (60,)(トレーニングに使用するオブジェクトのラベル)とX_test : (150,258)があります。宿題問題の解決策が与えられて以来、y_test : (150,)真のという150個のオブジェクトのラベルもあります。テストデータのこのパフォーマンスの低下をどのように説明できますか?

150個のオブジェクトのラベルを予測するために、LogisticRegression(Scikit学習実装)を使用することを選択します。分類器は、データが正規化された後に(X_train, y_train)で訓練され、150個のオブジェクトの予測を行うために使用されます。これらの予測はy_testと比較され、モデルの性能を評価します。再現性のために、私が使用したコードをコピーします。

from sklearn import metrics 
from sklearn.preprocessing import StandardScaler 
from sklearn.linear_model import LogisticRegression 
from sklearn.pipeline import make_pipeline 
from sklearn.model_selection import cross_val_score, crosss_val_predict 

# Fit classifier 
LogReg = LogisticRegression(C=1, class_weight='balanced') 
scaler = StandardScaler() 
clf = make_pipeline(StandardScaler(), LogReg) 
LogReg.fit(X_train, y_train) 

# Performance on training data 
CV_score = cross_val_score(clf, X_train, y_train, cv=10, scoring='roc_auc') 
print(CV_score) 

# Performance on test data 
probas = LogReg.predict_proba(X_test)[:, 1] 
AUC = metrics.roc_auc_score(y_test, probas) 
print(AUC) 

行列X_trainy_trainX_testy_testthis linkでご利用いただけます.MATファイルに保存されています。

このアプローチを使用すると、トレーニングデータ(CV_score = 0.8)では良好なパフォーマンスが得られますが、テストデータのパフォーマンスは非常に悪くなります.LogRegおよびAUC = C = 0.01の場合、0.40。ナイーブな分類器がAUC = 0.5を得なければならない場合、どのようにAUC <を得ることができますか?これは私がトレーニングのサンプル数が少ないためですか? 私は、コードを変更した場合のテストデータのパフォーマンスが向上することに気づいた:C = 0.01のためにC = 1および0.9のために、実際

y_pred = cross_val_predict(clf, X_test, y_test, cv=5) 
AUC = metrics.roc_auc_score(y_test, y_pred) 
print(AUC) 

AUC = 0.87。クロスバリデーションの予測を使用してAUCスコアが向上するのはなぜですか?それはクロス検証が、AUCを減少させるオブジェクト/サンプルを含まないテストデータのサブセットについての予測を可能にするからですか?

答えて

0

まず、60個のトレーニング項目に対して258個の機能を持つことは意味がありません。第2に、60項目のCV = 10は、データを10列車/テストセットに分割することを意味します。これらのそれぞれには、テストセット内にのみ6つの項目があります。だからあなたが得た結果は役に立たないでしょう。より多くのトレーニングデータと少ない機能が必要です。

1

オーバーフィッティングの問題が発生しているようです。つまり、トレーニングデータを使用してトレーニングされたクラシファイアがトレーニングデータにあふれているようです。それは一般化能力が低い。そのため、テストデータセットのパフォーマンスは良くありません。

cross_val_predictは実際にテストデータの一部を使用して分類器をトレーニングし、残りのデータを予測しています。だからパフォーマンスははるかに良いです。

全体として、トレーニングデータセットとテストデータセットの間にはかなりの違いがあるようです。したがって、トレーニングの精度が最も高い分類器は、テストセットでうまく機能しません。

質問に直接関係しない別の点:トレーニングサンプルの数がフィーチャのディメンションよりもはるかに小さいので、ディメンションを減らしてから分類器に入力すると便利です。

1

トレーニングとテストのプロセスが矛盾しているようです。コードからはデータを標準化しようとしていますが、テスト中はデータを標準化することはできません。意味:

clf = make_pipeline(StandardScaler(), LogReg) LogReg.fit(X_train, y_train) パイプラインを定義しても、パイプライン(clf.fit)ではなくロジスティック回帰のみに適合します。パイプライン(CV_score = cross_val_score(clf, X_train, y_train, cv=10, scoring='roc_auc'))でクロスバリデートされたスコアが計算されるため、パイプラインを予測する代わりにテスト中にLogRegしか使用しないため、テストデータは標準化されていません。

あなたが提起する2番目のポイントは異なります。 y_pred = cross_val_predict(clf, X_test, y_test, cv=5) では、列車データを無視しながら、テストデータのクロスバリデーションを行うことで予測が得られます。ここでは、clfを使用しているため、スコアが高いのでデータ標準化を行います。これは、標準化の手順が重要であるという証拠です。

まとめて、テストデータを標準化すると、テストスコアが向上すると思います。

関連する問題