로지스틱 회귀란?
로지스틱 회귀는 범주형 종속변수의 확률을 예측하는 데 사용되는 지도 머신 러닝 분류 알고리즘입니다. 종속변수는 1 또는 0, 즉 참 혹은 거짓으로 코딩된 데이터를 포함하는 이진변수로, 회귀가 아닌 이진 분류자로 활용됩니다. 로지스틱 회귀는 연속 및 이산변수와 비선형 기능을 포함하여 다양한 기능을 사용할 수 있습니다. 로지스틱 회귀에서는 시그 모이드 일명 로지스틱 함수가 사용됩니다.
0과 1 사이의 확률, 즉 S 자형을 예측하는 모델링을 한다고 가정합시다. 다수의 S 자 모양의 곡선이 존재합니다. 이 때 다음과 같은 로지스틱 모델을 사용합니다. Probability = 1 / [1 + exp (B0 + b1X)] 또는 loge [P / (1-P)] = B0 + B1X 과 같은 모델을 쓸 수 있습니다. loge [P / (1-P)]를 로지스틱 함수라고 부릅니다.
SAS Trainer Christa Cody는 이 튜토리얼에서 로지스틱 회귀에 대한 개요를 설명하고 있습니다.
SAS Enterprise Guide를 사용한 로지스틱 모델 구축
교육 및 테스트 데이터 세트가 포함된 Kaggle.com의 Titanic 데이터 세트를 활용합니다. 여기서 우리는 생존(survived) 또는 사망과 같은 분류를 예측하고자 합니다. 목표 변수는 '생존'입니다. 이 데이터 세트를 분석하기 위해 SAS Enterprise 가이드를 사용하고 있습니다.
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입니다. 기타 카테고리 변수로서 Cabin, sex, Pclass (호실, 성별, 사회적 직위) 가 있으며 숫자 변수로서는 Passenger ID, SibSp, Parch, Survived, Age 및 Fare(승객 신분증, 형제 자매 수, 부모 자식 수, 생존자, 나이), 마지막으로 텍스트 변수 는 Ticket과 Name (티켓과 이름)이 있습니다.
생존자수는 342 명이며, 549 명은 그렇지 못하다는 결과값을 보여줍니다. 총 관측 수치는 891 명입니다.
title "Survived vs Gender"; proc sgplot data=prac.titanic pctlevel=group; vbar sex / group=Survived stat=percent 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; |
여기에서 우리는 남성보다 여성이 더 많이 살아남는 추세를 볼 수 있습니다. 3 등급으로 여행 한 사람들이 가장 많이 사망했습니다. 그래도 데이터를 시각화하는 방법에는 여러 가지가 있습니다. 자세히 설명하지 않겠습니다.
proc means를 사용하여 누락 된 값 확인
/* 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를 기준으로 대치합니다.
/* 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; |
우리 모델에 영향을 미칠 것 같지 않아 cabin 변수를 삭제하고 중간값을 사용하여 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; |
값이 1 인 Selected 변수는 훈련 부분의 목표 대상이 됩니다. 또한 중요한 열만 남겨두고 변수 이름을 올바르게 지정하기 위해 빠른 설정 처리를 수행해 보겠습니다.
모델 구축
우리는 모든 결측값을 파악후 채웠으므로, 이제 데이트 세트를 활용하여 모델을 구축 할 차례입니다. 이제 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의 장점은 범주형 변수의 경우 더미 변수를 만들 필요가 없다는 것입니다. 여기에서 클래스의 모든 범주 변수를 지정할 수 있습니다.
변수 선택 알고리즘은 모델에 Age, Pclass 및 Sex 변수가 포함되도록 결정했습니다.
Good = 1은 훈련 세트 (Part = 1)와 검증 세트 (Part = 0) 모두에 대한 근사치입니다. 훈련 및 검증 세트의 경우 각각 82.56 % 및 80.08 %에 달합니다. 안정적인 모델에 속하지만 Hosmer 검정을 보면 p- 값이 더 낮은 것을 확일 할 수 있습니다. 잘 알고계시다 시피, p- 값이 높을수록 모델이 더 적합합니다.
부합성 혹은 콘코던스 값은 86.6 %입니다. 콘코던스는 스코어 카드가 개발 샘플에서 좋은 계정과 나쁜 계정을 얼마나 잘 구분하는지 평가하는 데 사용됩니다. 부합성이 좋은 계정과 나쁜 계정간 스코어 테스트 데이터 세트 테스팅차가 커집니다.
테스트 데이터 세트 테스팅
테스트 데이터 세트를 사용하여 학습 모델을 테스트 할 수 있습니다. Proc 가져오기를 사용하여 SAS에서 테스트 데이터 세트를 불러와 모든 결측값을 비교하는 절차는 동일합니다.
모델을 사용하여 테스트 데이터 세트 테스팅
/* Testing with our model titanic_logisitic */ proc plm source=titanic_logistic; score data=test1 out=test_scored predicted=p / ilink; run; |
proc 내보내기를 사용하여 결과를 CSV 파일로 저장합니다. 확률 0.5를 사용하고 결과에 PassengerIdandSurvivedvariable 만 유지하여 생존율을 분리했습니다.
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; |
proc 내보내기를 사용하여 결과를 CSV 파일로 저장합니다. 확률 0.5를 사용하고 결과에 PassengerIdandSurvivedvariable 만 유지하여 생존율을 분리했습니다.
모델에는 Age, Class, Sex 등의 세 가지 변수만 사용되었으며 결과는 74.64 %였습니다. 나쁜 모델은 아니지만 다른 변수를 사용하여 모델을 개선 할 수 있는 가능성이 존재합니다.
다음 단계
다음 기사에서는 다른 변수를 추가하여 모델을 개선하는 방법을 다룹니다. 또한 의사 결정 트리, 랜덤 포레스트와 같은 다른 알고리즘을 적용하여 정확도 수준을 확인할 수 있습니다. 자세한 사항은 다음 포스팅을 통해 확인하실 수 있습니다.
개선이 필요한 부분이 있으면 언제든지 의견을 남겨주시면 감사하겠습니다.
Join us for SAS Innovate 2025, our biggest and most exciting global event of the year, in Orlando, FL, from May 6-9. Sign up by March 14 for just $795.