Время прочтения: 4 мин.

Часто в области машинного обучения стоит задача классификации, например, необходимо определить, есть ли на изображении объект заданного класса. Однако не всегда подобные задачи можно решать простыми методами, так как они могут давать смещенные результаты, и подбор метода требует более сложную технику. Одним из самых простых и распространенных методов решения поставленной задачи является логистическая регрессия, которая может строиться несколькими подходами и выдавать разные результаты.

Ввиду популярности данного метода, в статье будут описаны два разных подхода его реализации: логистическая регрессия, построенная классическим способом с помощью библиотеки Python scikit-learn и логистическая регрессия с применением байесовского подхода с помощью библиотеки Python pymc3. Методы применялись для открытого набора данных с платформы Kaggle “Telco Customer Churn”, где представлено порядка 7000 клиентов и информации про услуги, на которые зарегистрировался каждый клиент, например, телефон, Интернет, телевидение и др., демографическая характеристика, информация об учетной записи клиента. В качестве зависимой переменной выступает информация, ушел клиент или нет, в течение последнего месяца из телекоммуникационной компании.

Перед началом построения регрессий данные прошли препроцессинг и были визуализированы. Выборка поделилась на тренировочную и тестовую. После чего была построена логистическая регрессия классическим способом, результаты приведены ниже.

#building a regular Logistic regression
lr = LogisticRegressionCV(Cs= 50, cv = 5, scoring = 'f1', 
                          penalty = 'l2', random_state = 50)
lr.fit(X_test, y_test)
lr_pred = lr.predict(X_test)
calc_metrics(lr_pred, y_test)

Accuracy of Model: 79.98%
F1 Score of Model: 0.5740

Однако при оценивании классической логистической регрессии есть возможность узнать только фиксированные значения оценок коэффициентов, и в их точности мы не можем быть уверенными, эти оценки могут быть ошибочными. Например, коэффициент перед константой может отличаться в разных регионах, где расположены компании.

В байесовском же подходе есть возможность предположить априорное распределение наших оценок коэффициентов, основываясь на наших знаниях о предметной области и опыте. Например, можно предположить, что оценка константы является нормально распределенной величиной с заданным средним и стандартным отклонением. Далее была построена логистическая регрессия с помощью байесовского метода. Ниже представлен код, где в качестве априорного используется нормальное распределение. Применяется теорема Байеса для нахождения апостериорного распределения параметров модели в зависимости от предикторов. Популярным алгоритмом для нахождения апостериорного распределения является Монте-Карло (MCMC), который как раз реализуется с помощью библиотеки pymc3 на Python. Pymc3 используется для сэмплирования из апостериорного распределения, а алгоритм сэмплирования NUTS настраивает параметры автоматически. Параметр chains в представленном коде отвечает за количество цепочек, его необходимо ставить больше одного.

with pm.Model() as logistic_model:
    priors=dict()

    for variable in X_test.columns:
        priors[variable]=pm.Uniform.dist(0,1)
    priors['Intercept']=pm.Normal.dist(mu=0., sigma=100.)
    priors['MonthlyCharges']=pm.Normal.dist(mu=0., sigma=100.)
    priors['TotalCharges'] = pm.Normal.dist(mu=0., sigma=100.)

    pm.GLM.from_formula(formula, data = X_with_labels, family = pm.glm.families.Binomial(),priors=priors)

  # Using the no-uturn sampler
    sampler = pm.NUTS()
    # Sample from the posterior using NUTS
    trace_log = pm.sample(draws=2000, tune=7000, chains=4, cores=2, init="adapt_diag")

Можно также вывести графики trace_plot, которые будут показывать приблизительное апостериорное распределение для параметров модели для каждой цепочки. Важно, чтобы для каждой цепочки наблюдалось примерно одинаковое распределение, это говорит о качестве модели.

По графикам доверительного интервала можно сказать, какая объясняющая переменная сильнее влияет на зависимую переменную. Чем больше доверительный интервал, тем оценку сложнее приблизить к единому значению.

pm.forestplot(trace_log);

Метрики качества для логистической регрессии с помощью байесовского метода получились немного хуже, чем для классической логистической регрессии. Такой вывод может быть из-за неподходящего априорного распределения, параметров для обучения. Также модели можно сравнить с помощью информационного критерия WAIC.

#result
blr_probs = find_probs(trace_log, X_test.copy())
predictions = (np.array(blr_probs) > 0.5)
calc_metrics(predictions, y_test)

Accuracy of Model: 75.67%
F1 Score of Model: 0.4723

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