2016-11-18 6 views
2

Я новичок в этом, так что извиняюсь, если это очевидно.Почему 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 - это то, что я должен искать?

Кроме того, не совсем релевантно, но пока я отправляю сообщения - для этого я не выполнил никаких нормализаций данных. Это нормально для логистической регрессии?

ответ

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_', чтобы вы могли обучать свою модель на весь набор данных; если у вас больше данных, я мог бы лучше разделить на поезд/тест (в идеале, используя временную метку для сортировки), чтобы сделать более реалистичную тестовую ситуацию. – maxymoo