これは明らかです。ロジスティック回帰で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を組み合わせることがわかっています - それは私が探しているはずの場所ですか?
また、完全に関連するものではありませんが、私が投稿している間に、私はこれについてデータの正規化を行っていません。ロジスティック回帰ではこれは正常ですか?
私は分かりますか? 'roc_auc'としてスコアリングを設定すると、モデルを評価するために使用していたclf.score(X、Y)が実際にトレーニングセットのAUCを報告します。しかし、その行をprint clf.best_scoreに置き換えると、クロスバリデーションされたフォールト内のテストセットから最良のAUCがレポートされます。それがモデルの正当な評価ですか? – browser
トレーニングとテストセットを使用していた場合、clf.fit(X_train、Y_train)とclf.score(X_test、Y_test)を使用すると、clf.best_score_よりも正確な評価が得られますか? – browser
はい、あなたは今正しく理解していますが、クロスバリデーションやトレーニング/テストの分割を使用してモデルを評価するかどうかは未解決です。小さなデータセットしか持っていない場合は、クロスバリデーション/ best_score_を使用する方がいいでしょう。そうすれば、データセット全体でモデルを訓練することができます。より多くのデータがあるなら、より現実的なテスト状況を作るためにtrain/test(理想的にはタイムスタンプを使用してソートする)に分割する方が良いかもしれません。 – maxymoo