Давайте рассмотрим простой способ анализа модели с помощью SAS.

Что такое логистическая регрессия?

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

Нам нужна модель, которая предсказывает вероятности от 0 до 1, то есть S-образную форму. Есть много S-образных кривых. Мы используем логистическую модель: вероятность = 1 / [1 + exp (B0 + b1X)] или loge [P / (1-P)] = B0 + B1X. Функция слева, loge [P / (1-P)], называется логистической функцией.

Построение логистической модели с помощью SAS Enterprise Guide

Я использую набор данных Titanic с Kaggle.com, который содержит набор данных для обучения и тестирования. Здесь мы попытаемся предугадать классификацию - выжившие или умершие. Наша целевая переменная «выжила». Я использую руководство SAS Enterprise для анализа этого набора данных. SAS дает много результатов, поэтому я опубликовал только ту часть, которая имеет отношение к нашему анализу.

Setting the library path and importing the dataset using proc import
/* Setting the library path */
%let path=C:\dev\projects\SAS\PRACDATA;
libname PRAC “&path”;
/* Importing dataset using proc import */
proc import datafile = “C:/dev/projects/sas/pracdata/train.csv”
out = PRAC.titanic
dbms = CSV;
run;
Checking the contents of the dataset by using proc contents function
/* Checking the contents of the data*/
proc contents data=work.train;
run;

У нас есть 12 переменных. Наша целевая переменная - «Выжившие», в которой 1 и 0. 1 для выживших и 0 для невыживших. Переменные категории: салон, пол, класс. Числовые переменные: идентификатор пассажира, SibSp, Parch, Survived, Age и Fare. Текстовая переменная: билет и имя.

Проверка частоты целевой переменной «Выжил» с помощью частоты срабатывания

/ * Проверка частоты выживания целевой переменной * /

proc freq data = work.train;

таблица выжила;

запустить;

Мы ясно видим, что 342 человека выжили и 549 человек не выжили. Общее количество наблюдений = 891.

Визуализация данных

Обычно рекомендуется исследовать данные с помощью визуализации. Я использую proc sgplot для визуализации класса Embark.

title "Analysis of embarkation locations";
proc sgplot data=prac.titanic;
vbar Embarked / datalabel missing;
label Embarked = "Passenger Embarking Port";
run;

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

title "Survived vs Gender";
proc sgplot data=prac.titanic pctlevel=group;
vbar sex / group=Survived stat=percent missing;
label Embarked = "Passenger Embarking Port";
run;

Здесь мы видим тенденцию к тому, что выживает больше женщин, чем мужчин. Больше всего умирали люди, путешествовавшие в третьем классе. Тем не менее, есть много способов визуализировать данные. Я не буду вдаваться в подробности.

Проверка отсутствующих значений с помощью средств проверки

/* Checking the missing value and Statistics of the dataset */
proc means data=work.train N Nmiss mean std min P1 P5 P10 P25 P50 P75 P90 P95 P99 max;
run;

Мы видим, что у Age 177 пропущенных значений и никаких выбросов не обнаружено.

Checking for categorical variables:
title “Frequency tables for categorical variables in the training set”;
proc freq data=PRAC.TITANIC nlevels;
tables Survived; tables Sex; tables Pclass; tables SibSp; tables Parch; tables Embarked; tables Cabin;
run;

Нам не хватает значений для Age, Embarked и Cabin. Нам нужно заполнить весь недостающий возраст вместо того, чтобы отбрасывать недостающие строки. Один из способов заполнения с использованием среднего возраста. Однако мы можем проверить средний возраст по классам пассажиров, используя прямоугольную диаграмму. В SAS нам нужно отсортировать его от переменной класса и возраста, прежде чем сделать коробчатую диаграмму.

/* Sorting out the Pclass and Age for creating boxplot */
proc sort data=work.train out=sorted;
by Pclass descending Age;
run;
title ‘Box Plot for Age vs Class’;
proc boxplot data=sorted;
plot Age*Pclass;
run;

Мы видим, что более обеспеченные пассажиры в более высоких классах, как правило, старше, что имеет смысл. Мы будем использовать эти средние значения возраста для условного исчисления на основе Pclass for Age.

/* Imputing Mean value for the age column */
data work.train2;
set work.train;
if age=”.” and Pclass = 1 then age = 37;
else if age = “.” and Pclass = 2 then age = 29;
else if age = “.” and Pclass = 3 then age = 24;
run;

Я отбросил переменную кабины, так как не думаю, что она повлияет на нашу модель, и заполнил недостающее значение в поле "embarked" с использованием медианы. (Медиана выбрана из-за переменной категории).

Раздел данных

Разделение набора данных на обучение и проверку с использованием соотношения 70:30. Во-первых, мне нужно отсортировать данные с помощью proc sort и разбить с помощью proc surveyselect.

/* Splitting the dataset into traning and validation using 70:30 ratio */
proc sort data = prac.train6 out = train_sorted;
by Survived;
run;
proc surveyselect data = train_sorted out = train_survey outall
samprate = 0.7 seed = 12345;
strata Survived;
run;

Чтобы проверить правильный раздел данных, я создаю таблицу частот, используя proc freq.

/* Generating frequency table */
proc freq data = train_survey;
tables Selected*Survived;
run;

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

Модель здания

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

/* Creating Logistic regression model */
proc logistic data=titanic descending;
where part=1;
class Embarked Parch Pclass Sex SibSp Survived;
model Survived(event=’1') = Age Fare Embarked Parch Pclass Sex SibSp /
selection=stepwise expb stb lackfit;
output out = temp p=new;
store titanic_logistic;
run;

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

Алгоритм выбора переменных решил, что модель будет включать переменные возраста, класса P и пола.

Good = 1 является приблизительным значением как для обучающего набора (Part = 1), так и для набора проверки (Part = 0). Он составляет 82,56% и 80,08% для обучающего и проверочного наборов соответственно. Это стабильная модель, однако, если мы увидим тест Хосмера, p-значение будет меньше. Согласно книге, чем выше значение p, тем лучше подходит модель.

Если мы можем увидеть пары Concordant, это 86,6%. Согласованность используется для оценки того, насколько хорошо оценочные карты разделяют хорошие и плохие учетные записи в выборке для разработки. Чем выше соответствие, тем больше разница в оценках между хорошими и плохими счетами.

Тестирование тестового набора данных

Мы можем протестировать нашу обучающую модель, используя тестовый набор данных. Это та же процедура для импорта набора тестовых данных в SAS с использованием импорта Proc и импортирования всех пропущенных значений.

Тестирование тестового набора данных с помощью нашей модели

/* Testing with our model titanic_logisitic */
proc plm source=titanic_logistic;
score data=test1 out=test_scored predicted=p / ilink;
run;

Теперь мы экспортируем результат в файл CSV с помощью proc export. Я разделил процент выживших, используя вероятность 0,5 и оставив в результате только переменные PassengerId и Survived.

data test_scored;
set test_scored;
if p > 0.5 then Survived = 1;
else Survived = 0;
keep PassengerId Survived;
run;
/* Exporting the output into csv file */
proc export data=test_scored
file=”C:/dev/projects/sas/pracdata/Result.csv” replace;
run;
Note:

В модели использовались только три переменные (возраст, класс и пол), и результат составил 74,64%. Это неплохая модель; однако у нас есть большие возможности для улучшения модели за счет использования других переменных.

Что дальше

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

Если вы обнаружите какие-либо ошибки или требуемые улучшения, не стесняйтесь комментировать.

Ссылка:

1) https://support.sas.com/en/documentation.html

2) https://en.wikipedia.org/wiki/Logistic_regression

3) https://www.kaggle.com/c/titanic