Подбор параметров для логистической регрессии
Подскажите, пожалуйста, как для доработать код ниже, чтобы для логистической регрессии подобрать два любых гиперпараметра в цикле?
model = LogisticRegression(random_state=12345, solver='liblinear', class_weight='balanced')
scores = cross_val_score(model,features_train, target_train, cv=5, scoring='f1')
final_score = sum(scores)/len(scores)
print('Средняя оценка качества модели:', final_score)
Ответы (2 шт):
Делаете цикл (или несколько вложенных циклов) с перебором гиперпараметров и запоминаете значение скора и гиперпараметров в список. Потом просто берёте максимум (для f1 вроде бы чем больше, тем скор лучше):
score_list = []
for hyperparam1 in (...):
for hyperparam2 in (...):
#
# здесь ваш код, использующий hyperparam1 и hyperparam2
# в качестве параметров модели и вычисляющий final_score
#
score_list.append((final_score, hyperparam1, hyperparam2))
print(max(score_list))
В итоге у вас напечатается максимальный достигнутый скор и значение гиперпараметров при этом скоре. Но вообще для sanity check я бы посмотрел несколько лучших значений и параметров:
print(sorted(score_list, reverse=True)[:3])
Так то есть прямо целые библиотеки, которые подбирают гиперпараметры. И в sklearn есть несколько методов подбора гиперпараметров.
Для подбора гиперпараметров действительно существуют уже реализованные в sklearn и других библиотеках методы. Например, GridSearchCV, который берет алгоритм и сетку возможных параметров для него в виде словаря, перебирает варианты на кросс-валидации с cv фолдами и выбирает лучший алгоритм, отталкиваясь от метрики scoring
Пример работы с GridSearchCV (https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.GridSearchCV.html):
from sklearn.model_selection import GridSearchCV
model = lr(random_state=12345, solver='liblinear',class_weight='balanced')
parameters = {'solver': ['newton-cg', 'lbfgs', 'liblinear', 'sag', 'saga']}
grid_clf = GridSearchCV(model, parameters, cv=5, scoring='f1')
grid_clf.fit(features_train, target_train)
print(grid_clf.best_estimator_)
print(grid_clf.best_params_)
print(grid_clf.best_score_)
О гиперпараметрах логистической регрессии иожно почитать в документации (https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html)
Также бывает любопытно попробовать RandomizedSearchCV, который берет лишь часть комбинаций параметров, соответственно, работает гораздо быстрее (https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.RandomizedSearchCV.html)