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

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

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

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

Фон данных

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

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

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

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

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

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

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

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

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

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

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

library(mlbench)     # for PimaIndiansDiabetes2 dataset
library(tidymodels)  # for model preparation and fitting

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

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

data(PimaIndiansDiabetes2)
head(PimaIndiansDiabetes2)

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

# See the data strcuture 
glimpse(PimaIndiansDiabetes2)

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

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

Diabetes <- na.omit(PimaIndiansDiabetes2) #removing NA values
glimpse(Diabetes)

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

Уровни данных

Мы можем проверить опорный уровень зависимой переменной с помощью функции levels (). Мы можем заметить, что опорным уровнем является neg (самый первый уровень).

levels(Diabetes$diabetes)

Установка уровня референции

Для лучшей интерпретации (позже для построения кривой ROC) нам нужно зафиксировать опорный уровень нашей зависимой переменной «диабет» на положительный (положительный), используя функцию relvel ().

Diabetes$diabetes <- relevel(Diabetes$diabetes, ref = "pos")
levels(Diabetes$diabetes)

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

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

Чтобы создать разделенный объект, вы можете использовать функцию initial_split (), где вам нужно предоставить набор данных, пропорцию и аргумент strata. Если указать зависимую переменную в атрибуте strata, выполняется стратифицированная выборка. Стратифицированная выборка полезна, если ваша зависимая переменная имеет дисбаланс классов.

Следующим шагом является вызов функций training () и testing () для разделенного объекта (т. Е. диабет_split), чтобы сохранить наборы данных поезда (diver_train) и теста (dia_test).

Обучающая выборка включает 295 наблюдений, а тестовая - 97 наблюдений.

set.seed(123)
# Create data split for train and test
diabetes_split <- initial_split(Diabetes,
                                prop = 0.75,
                                strata = diabetes)

# Create training data
diabetes_train <- diabetes_split %>%
                    training()

# Create testing data
diabetes_test <- diabetes_split %>%
                    testing()
# Number of rows in train and test dataset
nrow(diabetes_train)
nrow(diabetes_test)

[1] 295

[1] 97

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

Вы можете подогнать под любой тип модели (поддерживаемой tidymodels), выполнив следующие действия.

Шаг 1: вызовите модельную функцию: здесь мы вызвали logistic_reg (), поскольку мы хотим соответствовать логистической регрессии. модель.

Шаг 2: используйте функцию set_engine (), чтобы указать семейство модели. Мы предоставили аргумент «glm», поскольку логистическая регрессия относится к семейству обобщенной линейной регрессии.

Шаг 3: используйте функцию set_mode () и укажите тип модели, которую вы хотите подогнать. Здесь мы хотим классифицировать pos и neg, так что это классификация.

Шаг 4. Затем вам нужно использовать функцию fit (), чтобы подогнать под модель и внутри нее, вы должны предоставить обозначение формулы и набор данных (dia_train).

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

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

диабет ~.

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

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

fitted_logistic_model<- logistic_reg() %>%
        # Set the engine
        set_engine("glm") %>%
        # Set the mode
        set_mode("classification") %>%
        # Fit the model
        fit(diabetes~., data = diabetes_train)
tidy(fitted_logistic_model)    # Generate Summary Table

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

Соотношение шансов

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

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

Математически можно вычислить отношение шансов, взяв показатель степени оцененных коэффициентов. Например, вы можете напрямую получить отношения шансов коэффициента, указав exponentiate = True внутри tidy () функция.

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

tidy(fitted_logistic_model, exponentiate = TRUE)

Значительные шансы

Таблицу, созданную функцией tidy (), можно фильтровать. Здесь мы отфильтровали переменные, p-значения которых меньше 0,05 (5%) уровня значимости. Для нашего образца глюкоза и масса оказывают значительное влияние на диабет.

tidy(fitted_logistic_model, exponentiate = TRUE) %>%
  filter(p.value < 0.05)

Прогнозирование модели

Прогнозирование класса тестовых данных

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

# Class prediction
pred_class <- predict(fitted_logistic_model,
                      new_data = diabetes_test,
                      type = "class")

pred_class[1:5,]

Вероятности класса тестовых данных

Мы также можем сгенерировать прогнозы для вероятностей классов, указав аргумент «prob» в атрибуте type.

# Prediction Probabilities
pred_proba <- predict(fitted_logistic_model,
                      new_data = diabetes_test,
                      type = "prob")

pred_proba[1:5,]

Окончательная подготовка данных для оценки модели

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

diabetes_results <- diabetes_test %>%
  select(diabetes) %>%
  bind_cols(pred_class, pred_proba)

diabetes_results[1:5, ]

Оценка модели

Матрица путаницы

Мы можем сгенерировать матрицу путаницы, используя функцию conf_mat (), предоставив окончательный фрейм данных, то есть diab_results , столбец истинности, т. е. диабет и прогнозируемый класс (.pred_class) в атрибуте оценки.

Матрица неточностей показала, что набор тестовых данных содержит 65 примеров отрицательных (отрицательных) и 32 положительных (положительных) наблюдений. Обученная модель точно классифицировала 61 отрицательный (отрицательный) и 18 положительный (положительный) класс.

conf_mat(diabetes_results, truth = diabetes,
         estimate = .pred_class)

Мы также можем использовать пакет marker, который поставляется с пакетом tidymodels для создания различных показателей оценки для набора тестовых данных. .

Точность

Мы можем рассчитать точность классификации, используя функцию precision (), предоставив окончательный фрейм данных, то есть Diade_results , столбец истинности, т. е. диабет и прогнозируемый класс (.pred_class) в атрибуте оценки. Точность классификации модели на тестовом наборе данных составляет около 81,4%.

accuracy(diabetes_results, truth = diabetes,
         estimate = .pred_class)

Чувствительность

Чувствительность классификатора - это соотношение между тем, сколько было правильно идентифицировано как положительное, к тому, сколько было действительно положительным.

Чувствительность = TP / FN + TP

Расчетное значение чувствительности составляет 0,562, что указывает на плохое обнаружение положительных классов в тестовом наборе данных.

sens(diabetes_results, truth = diabetes,
    estimate = .pred_class)

Специфика

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

Специфичность = TN / FP + TN.

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

spec(diabetes_results, truth = diabetes,
    estimate = .pred_class)

Точность

Сколько было правильно отнесено к положительным из всех положительных?

Точность = TP / TP + FP

Расчетное значение точности 0,818.

precision(diabetes_results, truth = diabetes,
    estimate = .pred_class)

Отзывать

Отзыв и чувствительность - одно и то же.

Отзыв = TP / FN + TP

Ориентировочная стоимость отзыва - 0,562.

recall(diabetes_results, truth = diabetes,
      estimate = .pred_class)

F-мера

F-мера - это взвешенное гармоническое среднее значение точности и отзывчивости с наилучшей оценкой 1 и худшей оценкой 0. Оценка F-мера передает баланс между точностью и отзывчивостью. Оценка F1 составляет около 0,667, что означает, что обученная модель имеет классификационную силу 66,7%.

f_meas(diabetes_results, truth = diabetes,
       estimate = .pred_class)

Каппа

Коэн Каппа дает информацию о том, насколько модель лучше случайного классификатора. Каппа может находиться в диапазоне от -1 до +1. Значение ‹0 означает отсутствие согласия, а 1.0 показывает полное совпадение. Расчетная статистика каппа показала умеренное согласие.

kap(diabetes_results, truth = diabetes,
    estimate = .pred_class)

Коэффициент корреляции Мэтьюза (MCC)

Коэффициент корреляции Мэтьюза (MCC) используется как мера качества двоичного классификатора. Диапазон значений от -1 до +1.

MCC: -1 означает полное несогласие
MCC: 0 означает отсутствие согласия
MCC: +1 означает полное согласие

Расчетная статистика MCC показала умеренное согласие.

mcc(diabetes_results, truth = diabetes,
    estimate = .pred_class)

Специальные показатели

Мы можем использовать функцию custom_metrics () для создания нескольких показателей оценки.

Шаг 1: создайте специальный набор показателей с помощью metric_set ()
Шаг 2: используйте функцию custom_metrics () и укажите фрейм данных Diabaets, столбец diabaets и прогнозируемый класс (.pred_class) .

custom_metrics <- metric_set(accuracy, sens, spec, precision, recall, f_meas, kap, mcc)
custom_metrics(diabetes_results,
               truth = diabetes,
               estimate = .pred_class)

ROC-AUC

ROC-AUC - это измерение производительности для задачи классификации при различных настройках пороговых значений. ROC_AUC сообщает, насколько модель способна различать классы. Обученная модель логистической регрессии имеет ROC-AUC 0,921, что в целом указывает на хорошие прогностические характеристики.

roc_auc(diabetes_results,
        truth = diabetes,
        .pred_pos)

Кривая ROC

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

Вы можете создать кривую ROC с помощью функции roc_curve (), где вам нужно указать столбец истинности (диабет ) и прогнозируемые вероятности для положительного класса (.pred_pos).

Наша модель имеет показатель ROC-AUC 0,921, что указывает на хорошую модель, которая может различать пациентов с диабетом и пациентов без диабета.

diabetes_results %>%
  roc_curve(truth = diabetes, .pred_pos) %>%
  autoplot()

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

Примечание:

Во втором блоге мы узнаем, как выполнять разработку функций, такую ​​как удаление коррелированных функций, фиктивное кодирование категориальных функций и применение преобразований с использованием библиотеки tidymodels.

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

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

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

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

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

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

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

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