Давайте рассмотрим простой способ анализа модели с помощью 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