Я делаю Logisti c Регрессия, используя python scikit-learn. У меня есть несбалансированный набор данных с 2/3 точек данных, имеющих метку y = 0, и 1/3 с меткой y = 1.
Я делаю стратифицированное разбиение:
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, shuffle=True, stratify=y)
Моя сетка для поиск по гиперметру:
grid = {
'penalty': ['l1', 'l2', 'elasticnet'],
'C': [0.001, 0.01, 0.1, 1.0, 10.0, 100.0, 1000.0],
'solver': ['newton-cg', 'lbfgs', 'liblinear', 'sag', 'saga']
}
Затем я выполняю поиск по сетке, включая class_weight='balanced'
:
grid_search = GridSearchCV(
estimator=LogisticRegression(
max_iter=200,
random_state=1111111111,
class_weight='balanced',
multi_class='auto',
fit_intercept=True
),
param_grid=grid,
scoring=score,
cv=5,
refit=True
)
Мой первый вопрос касается score
. Это метод выбора «лучшего» классификатора в GridSearchCV, чтобы найти лучшие гиперпараметры. Поскольку я выполнил LogisticRegression с class_weight='balanced'
, должен ли я использовать classi c score='accuracy'
или мне все еще нужно использовать score='balanced_accuracy'
? И почему?
Итак, я go включил и нашел лучший классификатор:
best_clf = grid_search.fit(X_train, y_train)
y_pred = best_clf.predict(X_test)
А теперь я хочу вычислить метрики оценки, например, также точность (опять же) и f1-оценка.
Второй вопрос: Нужно ли здесь использовать «нормальную» точность / f1 или сбалансированную / взвешенную точность / f1?
» Нормальный ":
acc = accuracy_score(y_test, y_pred)
f1 = f1_score(y_test, y_pred, pos_label=1, average='binary')
Или сбалансированный / взвешенный:
acc_weighted = balanced_accuracy_score(y_test, y_pred, sample_weight=y_weights)
f1_weighted = f1_score(y_test, y_pred, sample_weight=y_weights, average='weighted')
Если мне следует использовать сбалансированную / взвешенную версию, мой третий вопрос касается параметра sample_weight=y_weights
. Как мне установить весы? Чтобы получить баланс (хотя, как я уже сказал, я не уверен, что баланс уже достигнут или нет class_weight='balanced'
), я должен масштабировать метку y = 0 с помощью 1/3 и y = 1 с 2/3, верно? Например:
y_weights = [x*(1/3)+(1/3) for x in y_test]
Или я должен ввести здесь реальное распределение и масштабную метку y = 0 с 2/3 и метку y = 1 с 1/3? Вот так:
y_weights = [x*(-1/3)+(2/3) for x in y_test]
Мой последний вопрос: Для оценки, с какой базовой точностью я буду сравнивать свою точность?
0.33 (класс 1) , 0,5 (после балансировки) или 0,66 (класс 0)?
Редактировать: Под базовой линией я подразумеваю модель, которая наивно классифицирует все данные как «1», или модель, которая классифицирует все данные как «0». Проблема в том, что я не знаю, могу ли я свободно выбирать. Например, я получаю точность или сбалансированную точность 0,66. Если сравнить с базовой линией «всегда 1» (cc 0,33 (?)), Моя модель лучше. Если я сравню с базовой линией «всегда 0» (cc 0,66 (?)), Моя модель будет хуже.
Большое спасибо всем за помощь.