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_train
、y_train
、X_test
とy_test
はthis 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を減少させるオブジェクト/サンプルを含まないテストデータのサブセットについての予測を可能にするからですか?