Есть ли способ объединить несколько уравнений логистической регрессии в одно? - PullRequest
0 голосов
/ 24 января 2019

Я работаю над проблемой бинарной классификации, где уровень ответов (плохие) составляет менее 1%. Предикторы включают набор номинальных категориальных и непрерывных переменных.

Первоначально я экспериментировал с техникой передискретизации (SMOTE), чтобы сбалансировать два класса. Логистическая регрессия, выполненная для набора данных с избыточной дискретизацией, приводит к хорошей общей точности, но очень и очень высокому уровню ложноположительных результатов.

Сейчас я планирую провести недостаточную выборку и запустить несколько моделей логистической регрессии. Основной код Python, над которым я работаю, выглядит следующим образом. Требуется руководство для объединения результатов этих моделей множественной логистической регрессии в одну.

import pandas as pd
import numpy as np
from sklearn import preprocessing
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
#Set i for the number of equations required
for i in range(10):
   #Create a sample of goods, good is pandas df containing goods
   sample_good=good.sample(n=300,replace=True)

   #Create a sample of bads, bad is pandas df containing bads. There are 
   #only 100 bads in the dataset
   sample_bad=bad.sample(n=100,replace=True)

   #Append the good and bad sample
   sample=sample_good.append(sample_bad)

   X = sample.loc[:, sample.columns != 'y']
   y = sample.loc[:, sample.columns == 'y']

   from sklearn.linear_model import LogisticRegression
   from sklearn import metrics
   X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, 
   random_state=0)
   logreg = LogisticRegression()
   logreg.fit(X_train, y_train)
   y_pred = logreg.predict(X_test)
   print('Accuracy of logistic regression classifier on test set: 
   {:.2f}'.format(logreg.score(X_test, y_test)))

Вышеуказанный цикл for выполняется 10 раз и создает 10 различных моделей. Нужно руководство по объединению этих 10 моделей в одну модель. Я читал о доступных методах, таких как пакетирование и т. Д. В этом случае созданный мной образец должен каждый раз иметь все плохое из-за очень низкой скорости отклика.

1 Ответ

0 голосов
/ 24 января 2019

Я думаю, вам следует использовать BaggingClassifier от scikit-learn. Короче говоря, он подходит нескольким классификаторам для случайных подвыборок ваших данных, а затем заставляет их голосовать за выполнение классификации. Этот метаоценщик элегантно помешает вам написать цикл for. Что касается выборки (которая, как я полагаю, является вашей первоначальной мотивацией для написания цикла), вы можете отрегулировать веса в методе model.fit ().

import numpy as np
from sklearn.ensemble import BaggingClassifier
from sklearn.linear_model import LogisticRegression
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.metrics import balanced_accuracy_score

breast_cancer = datasets.load_breast_cancer()
X = breast_cancer.data
y = breast_cancer.target
X_train, X_test, y_train, y_test = train_test_split(X,y)

Как видите, набор данных несбалансирован (в конце концов, это медицинские данные):

len(y_train[y_train == 0]),len(y_train[y_train == 1]) # 163, 263

Поэтому давайте добавим выборочные веса

y0 = len(y_train[y_train == 0])
y1 = len(y_train[y_train == 1])

w0 = y1/y0
w1 = 1

sample_weights = np.zeros(len(y_train))
sample_weights[y_train == 0] = w0
sample_weights[y_train == 1] = w1

Теперь классификатор Bagging:

model = BaggingClassifier(LogisticRegression(solver = 'liblinear'), 
                      n_estimators=10, 
                      bootstrap = True, random_state = 2019)
model.fit(X,y,sample_weights)
balanced_accuracy_score(y_test,model.predict(X_test)) # 94.2%

Обратите внимание, что, если я не соответствую весам выборки, я получу только 92,1% сбалансированной точности (сбалансированная точность = средняя отзывность, что очень удобно для несбалансированных задач)

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