2016-11-18 3 views
2

これは明らかです。ロジスティック回帰でroc_aucを採点する際に、GridSearchCVがAUCが最も高いCを与えるのはなぜですか?

lr = LogisticRegression(penalty = 'l1') 
parameters = {'C': [0.001, 0.01, 0.1, 1, 10, 100, 1000]} 
clf = GridSearchCV(lr, parameters, scoring='roc_auc', cv = 5) 
clf.fit(X, Y) 
print clf.score(X, Y) 
tn, fp, fn, tp = metrics.confusion_matrix(Y, clf.predict(X)).ravel() 
print tn, fp, fn, tp 

ロジスティック回帰を実行したい - 使用する機能の数を減らしたいので、L1ペナルティを使用しています。私はGridSearchCVを使用してロジスティック回帰の最良のC値を見つける

これを実行してC = 0.001、AUC = 0.59、コンフュージョンマトリックス:46,0,35,0を得る。ゼロ係数。 私のコードに戻って、私のパラメータリストからC = 0.001のオプションを削除し、再度実行します。 ここでは、C = 1、AUC = 0.95、混同行列:42,4,6,29が得られます。

私は 'roc_auc'としてスコアリングしているので、より良いAUCでモデルを作成すべきではないと思いましたか?

これは私のl1ペナルティと関係があると考えると、私はl2に切り替えました。しかし、これはC = 0.001、AUC = 0.80、CM = 42,4,16,19を与え、オプションとしてC = 0.001を除いたときに、C = 0.01、AUC = 0.88、CM = 41,5,13,​​22 。

l2ペナルティには問題はありませんが、l1ではかなり大きな違いがあるようです。ペナルティなの?

私の読書の中には、ElasticNetがいくつかのl1とl2を組み合わせることがわかっています - それは私が探しているはずの場所ですか?

また、完全に関連するものではありませんが、私が投稿している間に、私はこれについてデータの正規化を行っていません。ロジスティック回帰ではこれは正常ですか?

答えて

1

clf.score(X, Y)はトレーニングデータセットのスコアです(gridsearchは最良のパラメータを選択した後にデータセット全体をモデル化します)。これを使用してモデルを評価することは望ましくありません。これは、gridsearchがモデル選択で内部的に使用するものではなく、クロスバリデートされたフォールドを使用して平均を取るものです。モデル選択で使用された実際のスコアにはclf.best_score_でアクセスできます。

+0

私は分かりますか? 'roc_auc'としてスコアリングを設定すると、モデルを評価するために使用していたclf.score(X、Y)が実際にトレーニングセットのAUCを報告します。しかし、その行をprint clf.best_scoreに置き換えると、クロスバリデーションされたフォールト内のテストセットから最良のAUCがレポートされます。それがモデルの正当な評価ですか? – browser

+0

トレーニングとテストセットを使用していた場合、clf.fit(X_train、Y_train)とclf.score(X_test、Y_test)を使用すると、clf.best_score_よりも正確な評価が得られますか? – browser

+0

はい、あなたは今正しく理解していますが、クロスバリデーションやトレーニング/テストの分割を使用してモデルを評価するかどうかは未解決です。小さなデータセットしか持っていない場合は、クロスバリデーション/ best_score_を使用する方がいいでしょう。そうすれば、データセット全体でモデルを訓練することができます。より多くのデータがあるなら、より現実的なテスト状況を作るためにtrain/test(理想的にはタイムスタンプを使用してソートする)に分割する方が良いかもしれません。 – maxymoo

関連する問題