Как выполнить оценку регрессии Logisti c с несбалансированным набором данных с использованием sklearn? - PullRequest
0 голосов
/ 17 марта 2020

Я делаю 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 (?)), Моя модель будет хуже.

Большое спасибо всем за помощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...