Почему 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, матрицу путаницы: 46, 0, 35, 0. Только 1 функция имеет ненулевой коэффициент. Я возвращаюсь к своему коду, удаляю вариант 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 - это то, где я должен искать?

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


person browser    schedule 18.11.2016    source источник


Ответы (1)


clf.score(X, Y) - это оценка в наборе обучающих данных (поиск по сетке обновляет модель для всего набора данных после выбора наилучших параметров), вы не хотите использовать это для оценки своей модели. Это также не то, что gridsearch использует для внутренних целей при выборе модели, вместо этого он использует перекрестно проверенные складки и принимает среднее значение. Вы можете получить доступ к фактической оценке, использованной при выборе модели, с помощью clf.best_score_.

person maxymoo    schedule 18.11.2016
comment
Так что позвольте мне просто посмотреть, понимаю ли я. С оценкой, установленной как «roc_auc», clf.score (X, Y), который я использовал для оценки модели, фактически сообщает AUC на обучающем наборе. Однако, если я заменю эту строку на print clf.best_score, это будет сообщать лучший AUC из тестовых наборов в свернутых с перекрестной проверкой свертках? И это законная оценка модели? - person browser; 18.11.2016
comment
И если бы я использовал набор для обучения и тестирования, я бы использовал clf.fit (X_train, Y_train), а затем clf.score (X_test, Y_test), что было бы более правильной оценкой, чем clf.best_score_? - person browser; 18.11.2016
comment
Да, теперь вы правильно понимаете, хотя это открытый вопрос, хотите ли вы использовать перекрестную проверку или разделение обучения / тестирования для оценки вашей модели; если у вас только небольшой набор данных, вероятно, лучше использовать перекрестную проверку / best_score_, чтобы вы могли обучать свою модель на всем наборе данных; если у вас больше данных, лучше разделить на тренировку / тест (в идеале с использованием отметки времени для сортировки), чтобы получить более реалистичную тестовую ситуацию. - person maxymoo; 21.11.2016