Эта статья даст вам практический обзор настройки модели бинарной логистической регрессии с использованием языка программирования R.

Вступление

В мире машинного обучения с учителем часто выполняются алгоритмические задачи двух типов. Один называется регрессией (прогнозирование непрерывных значений), а другой - классификацией (прогнозирование дискретных значений). В этом блоге я представил пример алгоритма двоичной классификации под названием Двоичная логистическая регрессия, который относится к семейству Биномиальное с логитом функция ссылки. Бинарная логистическая регрессия используется для прогнозирования бинарных классов. Например, в случаях, когда вы хотите предсказать да / нет, выигрыш / проигрыш, отрицательный / положительный результат, истину / ложь и так далее. Существует небольшая разница между обучением / подгонкой модели для производства и публикацией исследований. Этот блог проведет вас через ориентированный на исследования практический обзор моделирования и интерпретации, то есть того, как можно смоделировать бинарную логистическую регрессию и интерпретировать ее для публикации в журнале / статье.

Краткое содержание статьи

  • Фон данных
  • Цель моделирования
  • Загрузка данных
  • Базовый исследовательский анализ
  • Подготовка данных
  • Примерка модели / обучение
  • Интерпретация описания модели
  • Оценка модели на наборе тестовых данных
  • использованная литература

Фон данных

В этом примере мы собираемся использовать набор данных Индийский диабет 2, полученный из репозитория баз данных машинного обучения UCI (Newman et al. al. 1998).

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

Набор данных Pima Indian Diabetes 2 является уточненной версией (все пропущенные значения были присвоены как NA) данных о диабете Pima Indian. Набор данных содержит следующие независимые и зависимые переменные.

Независимые переменные (символ: I)

  • I1: беременна: количество беременных.
  • I2: глюкоза: концентрация глюкозы в плазме (тест на толерантность к глюкозе).
  • I3: давление: диастолическое артериальное давление (мм рт. Ст.).
  • I4: трицепс: толщина кожной складки трицепса (мм)
  • I5: инсулин: 2-часовой сывороточный инсулин (мкЕ / мл)
  • I6: масса: индекс массы тела (вес в кг / (рост в м) \ ²)
  • I7: родословная: функция родословной диабета.
  • I8: возраст: возраст (лет)

Зависимая переменная (символ: D)

  • D1: диабет: случай диабета (положительный / отрицательный)

Цель моделирования

  • подгонка модели машинного обучения бинарной логистической регрессии, которая точно предсказывает, есть ли у пациентов в наборе данных диабет
  • понимание влияния значимых переменных на прогнозирование диабета
  • проверка силы обобщения (оценки модели) обученной модели на невидимом / тестовом наборе данных.

Загрузка библиотек и набора данных

Шаг 1: сначала нам нужно установить следующие пакеты с помощью функции install.packages () и загрузить их с помощью Функция library ().

library(mlbench)     # for PimaIndiansDiabetes2 dataset
library(dplyr)       # for data manipulation (dplyr) 
library(broom)       # for making model summary tidy
library(visreg)      # for potting logodds and probability 
library(margins)     # to calculate Average Marginal Effects
library(rcompanion)  # to calculate pseudo R2
library(ROCR)        # to compute and plot Reciever Opering Curve

Шаг 2. Затем нам нужно загрузить набор данных из пакета mlbench с помощью data ().

# load the diabetes dataset
data(PimaIndiansDiabetes2)

Исследовательский анализ данных

Шаг 1: после загрузки данных следующим важным шагом является выполнение исследовательского анализа данных, который поможет в ознакомлении с данными. Используйте функцию head () для просмотра шести верхних строк данных.

head(PimaIndiansDiabetes2)

Шаг 2. Прежде чем перейти к части подбора модели, часто бывает важно узнать о типах различных переменных / столбцов и о том, содержат ли они какие-либо пропущенные значения. Функция str () или glimpse () помогает определять типы данных.

Функция glimpse () пакета dplyr выявила, что набор данных о диабете содержит 768 наблюдений и 9 переменных. Первые 8 переменных имеют числовой / двойной тип, а зависимая / выходная переменная имеет факторный / категориальный тип. Также заметно, что многие переменные содержат значения NA. Итак, наша следующая задача - уточнить / изменить данные, чтобы они были совместимы с алгоритмом моделирования.

# See the data strcuture 
glimpse(PimaIndiansDiabetes2)

Подготовка данных

Шаг 1. Первый шаг - удалить строки данных со значениями NA с помощью na.omit (). функция.

Шаг 2: преобразование зависимой переменной «диабет» в целочисленные значения (neg: 0 и pos: 1) с помощью level () функция.

Шаг 3: проверка уточненной версии данных с помощью функции glimpse ().

Diabetes <- na.omit(PimaIndiansDiabetes2) #removing NA values
levels(Diabetes$diabetes) <- 0:1
glimpse(Diabetes) 

Окончательные (подготовленные) данные содержат 392 наблюдения и 9 столбцов. Независимые переменные имеют числовой / двойной тип, в то время как зависимая / выходная двоичная переменная имеет тип фактор / категория, содержащий отрицательное значение, равное 0, и положительное значение, равное 1.

Подбор модели (двоичная логистическая регрессия)

Следующим шагом является разделение набора данных о диабете на тренировочную и тестовую части путем создания случайных векторных индексов с помощью функции sample () .

Тренировка и тестовый сплит

Весь набор данных обычно делится на набор данных 80% для поездов и 20% для тестирования (общее практическое правило). 80% данных поезда используются для обучения модели, а остальные 20% используются для проверки того, как модель обобщается на невидимом наборе данных.

# Total number of rows in the Diabetes data frame
n <- nrow(Diabetes)
# Number of rows for the training set (80% of the dataset)
n_train <- round(0.80 * n)
# Create a vector of indices which is an 80% random sample
set.seed(123)
train_indices <- sample(1:n, n_train)
# Subset the Diabetes data frame to training indices only
train <- Diabetes[train_indices, ]
# Exclude the training indices to create the test set
test <- Diabetes[-train_indices, ]

Проверка размера поезда и набора тестовых данных

paste("train sample size: ", dim(train)[1])
paste("test sample size: ", dim(test)[1])

Подбор логистической регрессии

Чтобы соответствовать модели логистической регрессии, вам необходимо использовать функцию glm (), а внутри нее вы должны предоставить обозначение формулы, данные для обучения и family = " биномиальный »

плюс обозначение →
диабет ~ ind_variable 1 + ind_variable 2 + …… .so on

Обозначение тильды →

диабет ~.
означает, что диабет предсказывается остальными переменными во фрейме данных (означает все независимые переменные), кроме зависимой переменной, то есть диабета.

#Fitting a binary logistic regression
model_logi <- glm(diabetes~., data = train, family = "binomial")
#Model summary
summary(model_logi)

Интерпретация описания модели

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

Статистика соответствия модели показала, что модель была подогнана с использованием метода Оценка максимального правдоподобия (MLE). Модель сошлась правильно, без ошибок.

Таблица коэффициентов показала, что только переменные глюкозы, массы и родословной имеют значительное положительное влияние (значения p

Каждое изменение уровня глюкозы на одну единицу увеличивает логарифмическую вероятность наличия диабета на 0,036, а его значение p указывает на то, что оно является значимым для определения диабета. Точно так же с каждым увеличением родословной увеличивается логарифм шансов иметь диабет на 1,212, и значение p также становится значительным.

Статистика соответствия модели

Функция nagelkerke () пакета rcompanion предоставляет три типа значений псевдо-R-квадрата (McFadden, Cox и Снелл, Крэгг и Улер) и результаты теста отношения правдоподобия. Значение Псевдо-R-квадрат Макфаддена - это обычно сообщаемый показатель для соответствия модели бинарной логистической регрессии. Результат таблицы показал, что значение Псевдо-R-квадрат Макфаддена равно 0,282, что указывает на хорошее соответствие модели.

Кроме того, в таблице представлен тест отношения правдоподобия. Тест отношения правдоподобия (часто называемый LR-тестом) - это тест согласия, используемый для сравнения двух моделей; нулевая модель и окончательная модель. Тест показал, что разница логарифма-правдоподобия между моделью только с перехватом (нулевая модель) и моделью, оснащенной всеми независимыми переменными, составляет 56,794, что указывает на улучшение соответствия модели. Улучшение подгонки также является значительным (p-значение <0,05).

# Pseudo R_squared values and Likelyhood ratio test
nagelkerke(model_logi)

График вероятности

Чтобы понять, как изменяются вероятности диабета при заданных значениях независимых переменных, можно сгенерировать графики вероятностей с помощью visreg библиотеки visreg () функция . Здесь мы построили родословную по оси абсцисс и вероятность диабета. по оси ординат. Вертикальные линии коврика указывают плотность наблюдения по оси x. темная полоса вдоль синей линии указывает полосу доверительного интервала 95%.

# Probabilities of diabetes wrt pedigree
visreg(model_logi, "pedigree", scale="response", rug=2, xlab="pedigree level",
       ylab="P(diabetes)")

Коэффициент ODDS

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

ODDS - это отношение вероятности того, что событие произойдет, к тому, что событие не произойдет. Когда мы берем соотношение двух таких шансов, оно называется отношением шансов.

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

(exp(coef(model_logi))) #obtaining odds ratio

Точно так же отношение ODDS можно получить в красивой аккуратно отформатированной таблице с помощью функции tidy () для метла пакет.

tidy(model_logi, exponentiate = TRUE, conf.level = 0.95) #odds ratio

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

Расчет предельных эффектов

Предельные эффекты - это альтернативный показатель, который можно использовать для описания воздействия предиктора на переменную результата. Предельные эффекты можно описать как изменение результата как функцию изменения режима (или независимой переменной, представляющей интерес), при которой все другие переменные в модели являются постоянными. При линейной регрессии расчетные коэффициенты регрессии являются маргинальными эффектами и их легче интерпретировать. Вы можете узнать больше о том, зачем нам нужны маржинальные эффекты, загрузив презентацию [источник: Марсело Кока Перрайон (Университет Колорадо)] по следующей ссылке.

Щелкните здесь: Ссылка на« зачем нам маржинальные эффекты »

Исследователи сообщают о трех типах предельных эффектов: Предельный эффект при репрезентативных значениях (MER), Предельный эффект при средних значениях (MEM) и Средние предельные эффекты для каждого наблюдаемого значения x и среднего по результатам (AME), (Leeper, 2017). Для категориальных переменных рассчитывались средние предельные эффекты для каждого дискретного изменения, соответствующего контрольному уровню.

В областях исследований STEM очень популярны средние предельные эффекты, о которых исследователи часто сообщают. В нашем случае мы оценили AME переменных-предикторов с помощью функции margins () пакета margins и распечатал сводку отчета.

В таблице «Средние предельные эффекты» представлены AME, стандартная ошибка, z-значения, p-значения и 95% доверительные интервалы. Интерпретация AME аналогична линейным моделям. Например, значение AME для родословной составляет 0,1810, что можно интерпретировать как увеличение значения родословной на единицу, увеличивающее вероятность заболевания диабетом на 18,10%.

# Calculate average marginal effect
effects_logit_dia = margins(model_logi)
# Summary of marginal effect
summary(effects_logit_dia)

График полей

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

plot(effects_logit_dia) #plotting marginal effects

Оценка модели на наборе тестовых данных

Следующим шагом после подбора модели бинарной логистической регрессии является проверка того, насколько хорошо подобранная модель работает с невидимыми данными, то есть с 20% тестовых данных.

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

  • Первый шаг - это прогнозирование вероятности диабета по набору тестовых данных с помощью функции прогноз ().
  • Установка порогового значения (0,5 для двоичной классификации). С вероятностью ниже 0,5 относился к диабету как отрицательный (0) и выше положительный (1)
  • Используйте функцию table (), чтобы создать матрицу путаницы между фактическим / эталонным (отрицательный: 0, положительный: 1) и прогнозируемым (отрицательный: 0, положительный: 1).
  • Используйте функцию precision () пакетов критерий, чтобы вычислить точность классификации для набора тестовых данных.

Матрица неточностей и точность классификации

Матрица путаницы показала, что в наборе тестовых данных имеется 55 примеров отрицательных (0) и 23 положительных (1). Обученная модель точно классифицировала 52 отрицательных (отрицательных: 0) и 17 положительных (положительных: 1) классов.

# predict the test dataset
pred <- predict(model_logi, test, type="response") 
predicted <- round(pred) # round of the value; >0.5 will convert to 
                         # 1 else 0
# Creating a contigency table
tab <- table(Predicted = predicted, Reference = test$diabetes)
tab

Затем мы можем рассчитать точность вручную, используя следующую формулу. Результаты показали, что точность классификатора составляет около 88,46% при классификации невидимых / тестовых данных.

Точно так же точность также можно оценить с помощью функции precision () из библиотеки критерия.

# Creating a dataframe of observed and predicted data
act_pred <- data.frame(observed = test$diabetes, predicted = 
                      factor(predicted))
# Calculating Accuracy
accuracy_est <- accuracy(act_pred, observed, predicted)
print(accuracy_est)
# Note: the accuracy( ) function gives rounded estimate i.e. 0.885

Значения отсечки против точности

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

pred.rocr <- prediction(pred, test$diabetes)
eval <- performance(pred.rocr, "acc")
plot(eval)

Оценка показывает, что пороговое значение 0,5629690 обеспечивает максимальную точность классификации 0,8846154.

# Identifying the best cutoff value that maximizes accuracy
max <- which.max(slot(eval, "y.values")[[1]])
acc <- slot(eval, "y.values")[[1]][max] #y.values are accuracy 
                                        #measures
cut <- slot(eval, "x.values")[[1]][max] #x.values are cutoff 
                                        #measures
print(c(Accuracy = acc, Cutoff = cut))

Точность, отзывчивость и оценка F1

Отчет о классификации (включает: точность, отзыв и оценку F1) часто используется для измерения качества прогнозов алгоритма классификации. Сколько прогнозов верны, а сколько ложны. Отчет о классификации использует Истинно-положительный, Истинно-отрицательный, Ложноположительный и Ложноотрицательный при создании отчета о классификации.

  1. TP / истинно положительный: когда фактическое наблюдение было положительным, и прогноз модели также положительный.
  2. TN / True Negative: когда фактическое наблюдение было отрицательным, и прогноз модели также отрицательный.
  3. FP / ложноположительный: когда фактическое наблюдение было отрицательным, но прогноз модели положительный.
  4. FN / False Negative: когда фактическое наблюдение было положительным, но прогноз модели отрицательный.

Отчет о классификации предоставляет информацию о точности, отзывчивости и F1-балле.

Мы уже рассчитали точность классификации, тогда возникает очевидный вопрос: зачем нужны точность, отзывчивость и оценка F1? Ответ заключается в том, что точность не является хорошим показателем, когда в наборе данных существует дисбаланс классов. Набор данных называется сбалансированным, если зависимая переменная включает примерно равную долю обоих классов (в случае двоичной классификации). Например, если набор данных диабета включает 50% образцов с диабетическим и 50% недиабетическим терпением, то говорят, что набор данных сбалансирован, и в таком случае мы можем использовать точность в качестве показателя оценки. Но в реальном мире часто бывает не так.

Давайте конкретизируем это на примере. Допустим, вы собрали набор данных о диабете, содержащий 1000 образцов. Вы передали набор данных через свою обученную модель, и модель предсказала, что все образцы не страдают диабетом. Но позже, когда вы просмотрите свой набор данных, вы заметили, что из 1000 выборочных данных 3 пациента страдают диабетом. Таким образом, наша модель неверно классифицировала трех пациентов, заявив, что они не страдают диабетом (ложноотрицательный результат). Даже после трех ошибочных классификаций, если мы рассчитаем точность прогноза, мы все равно получим высокую точность 99,7%.

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

Чтобы справиться с этой проблемой, было введено понятие точности и отзыва.

Точность: определяет точность положительных прогнозов.

Напомнить: определяет долю правильно идентифицированных положительных результатов.

Оценка F1: это взвешенное гармоническое среднее значение точности и отзыва с наилучшей оценкой 1 и худшей оценкой 0. Оценка F1 отражает баланс между точностью и отзывом.

Метрики оценки модели показали, что значения точности и отзыва составляют 0,897 и 0,945 соответственно. Оценка F1 составляет около 0,92, что означает, что обученная модель имеет классификационную силу 92%.

library(yardstick)
# Creating a actual/observed vs predicted dataframe
act_pred <- data.frame(observed = test$diabetes, predicted =  
                       factor(predicted))
# Calculating precision, recall and F1_score
prec <- precision(act_pred, observed, predicted)
rec <- recall(act_pred, observed, predicted)
F1_score <- f_meas(act_pred, observed, predicted) #called f_measure
print(prec)
print(rec)
print(F1_score)

Площадь под рабочей кривой приемника

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

Кривая ROC построена с отношением TPR к FPR, где TPR находится по оси y, а FPR - по оси x. Линия, проведенная по диагонали для обозначения разбиения графа на 50–50. Если кривая ближе к линии, снизьте производительность классификатора, что не лучше, чем простая случайная догадка. Наша модель имеет показатель AUC-ROC 0,8972, что указывает на хорошую модель, которая может различать пациентов с диабетом и пациентов без диабета.

perf_rocr <- performance(pred.rocr, measure = "auc",
                         x.measure = "cutoff")
[email protected][[1]] <- round([email protected][[1]], digits = 
                                 4)
perf.tpr.fpr.rocr <- performance(pred.rocr, "tpr", "fpr")
plot(perf.tpr.fpr.rocr, colorize=T, 
     main = paste("AUC:", ([email protected])))
abline(a = 0, b = 1)

Бинарная логистическая регрессия по-прежнему является очень популярным алгоритмом машинного обучения (для двоичной классификации) в области исследований STEM. Его по-прежнему очень легко обучать и интерпретировать по сравнению со многими изощренными и сложными моделями черного ящика.

Набор данных и код

Нажмите здесь, чтобы просмотреть данные и код диабета

** Надеюсь, этот блог поможет **

Увидимся в следующий раз!

использованная литература

Липер, Т.Дж., (2017). Интерпретация результатов регрессии с использованием средних предельных эффектов с полями R. Tech. респ.

Марсело Кока Перрайон (2019). Интерпретация результатов модели: Marginal Effects and Margins Command, University of Colorado, Anschutz Medical Campus

Ньюман, К. Б. Д. и Мерц, К. (1998). Репозиторий баз данных машинного обучения UCI, Технический отчет, Калифорнийский университет, Ирвин, Департамент информации и компьютерных наук.

Шрикант И. Бангдивала (2018). Регрессия: бинарная логистика, Международный журнал по контролю за травмами и содействию безопасности, DOI: 10.1080 / 17457300.2018.1486503

Рахул Раоньяр

  • Если вам понравилось, подпишитесь на меня на medium, чтобы узнать больше
  • Свяжитесь со мной в Twitter, LinkedIn, YouTube и Github