Я новичок в этом, так что извиняюсь, если это очевидно.Почему GridSearchCV не дает C с максимальной AUC при подсчете roc_auc в логистической регрессии
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, матрицу Confusion: 46, 0, 35, 0. Только 1 функция имеет не- нулевой коэффициент. Я возвращаюсь к своему коду и удаляю параметр C = 0.001 из списка параметров и запускаю его снова. Теперь я получаю C = 1, AUC = 0,95, матрицу Confusion: 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_', чтобы вы могли обучать свою модель на весь набор данных; если у вас больше данных, я мог бы лучше разделить на поезд/тест (в идеале, используя временную метку для сортировки), чтобы сделать более реалистичную тестовую ситуацию. – maxymoo