[실전 머신러닝] 로지스틱 회귀 – 타이타닉 생존자 예측하기 ❸

직접 로지스틱 회귀 분석 모델로 타이타닉 데이터셋을 분석해 생존자를 예측하고 작동 원리를 이해합니다. 또한 분류(Classification) 문제를 예측하고 평가합니다. 총 3편입니다.

 

로지스틱 회귀 – 타이타닉 생존자 예측하기

 

7. 이해하기 : 피처 엔지니어링

피처 엔지니어링(Feature Engineering)이란 기존 데이터를 손보아 더 나은 변수를 만드는 기법입니다(특징 공학 또는 특성 공학이라고도 합니다). 앞에서 경험한 더미 변수를 만드는 일도 일종의 피처 엔지니어링입니다. 더미 변수를 쓰지 않았다면 해당 컬럼(Sex와 Embarked)을 모두 버려야 했으나,더미변수로만들어예측에도움이되는변수를얻은겁니다.

피처 엔지니어링은 머신러닝에 있어서 엄청 중요합니다. 적합한 머신러닝 알고리즘을 선택하고 하이퍼파라미터를 튜닝하는 일도 중요하지만 좋은 피처를 하나 더 마련하는 일만큼 강력한 무기는 없습니다. 여기서 피처라 함은 독립변수의 다른 표현입니다. 독립변수는 흔히 통계 영역에서 쓰이는 용어이고, 피처는 머신러닝에서 더 흔하게 사용됩니다.

피처 엔지니어링에서는 도메인 지식의 활용이 중요합니다. 데이터에 대한 사전 지식이 있으면 어떤 변수를 어떻게 바꾸면 더 나은 피처를 얻을 수 있을지 생각해볼 여지가 있습니다. 물론 도메인 지식 없이 몇몇 변수를 단순히 곱하거나 나누어서 무작위로 다양한 변수들을 만들어내는 것만으로도 도움이 될 때도 있습니다만, 도메인 지식을 바탕으로 정확한 목적을 가지고 수행하는 피처 엔지니어링이 더욱 효율적입니다.

선형 회귀 분석과 로지스틱 회귀 분석을 선형 모델이라고 하는데, 이러한 선형 모델에서는 다중공선성(Multicollinearity) 문제를 주의해야 합니다. 다중공선성은 독립변수 사이에 상관관계가 높은 때에 발생하는 문제입니다. 예를 들어 두 독립변수 A, B는 모두 목표 변수를 양의 방향으로 이끄는 계수를 가지고 있을 때 A와 B의 상관관계가 매우 높다면, y가 증가한 이유가 A 때문인지 B 때문인지 명확하지 않습니다. 그래서 그때그때 데이터의 특성에 따라 변덕스러운 결과를 보여주는 문제가 발생합니다. 다중공선성 문제는 상관관계가 높은 변수 중 하나를 제거하거나, 둘을 모두 포괄시키는 새로운 변수를 만들거나, PCA와 같은 방법으로 차원 축소를 수행해 해결할 수 있습니다. 이번에 다루는 데이터에서는 Parch와 SibSp가 그나마 조금 강한 상관관계를 보였으므로 이 둘을 새로운 변수로 만들겠습니다.

 

💡PCA: PCA는 Principal Component Analysis의 약자로, 주성분 분석이라고도 부릅니다. 차원 축소는 데이터의 차원, 즉 독립변수의 개수를 줄이는 방법을 뜻합니다.

💡다중공선성 문제: 변수 간의 강한 상관관계가 있을 때 발생하는 문제. 선형 모델은 독립변수 간의 독립성을 전제로 하기 때문에, 다중공선성 문제를 해결해주는 것이 좋습니다.

 

사실 꼭 상관관계 수치 때문이 아니더라도, 직관적으로 이 두 변수를 합쳐보고 싶다는 생각이 들수도 있습니다. Parch는 부모와 자식, SibSp는 형제/자매와 배우자로, 결국 모두 가족구성원이라는 공통점이 있습니다. 그렇다면 이 두 변수를 합하여 가족구성원 숫자를 나타내는 변수로 만들어보면 어떨까요? 두 변수를 합하여 family라는 컬럼을 만들고 Parch와 SibSp 컬럼을 제거하겠습니다.

 

data['family'] = data['SibSp'] + data['Parch'] # SibSp와 Parch 변수 합치기
data.drop(['SibSp','Parch'], axis=1, inplace=True) # SibSp와 Parch 변수 삭제
data.head() # 5행 출력

 

 

원하던 형태로 잘 변경되었습니다. 드디어 피처 엔지니어링을 마쳤으니 이 데이터를 가지고 모델링 과정부터 평가까지 다시 진행하겠습니다.

 

X = data.drop('Survived', axis = 1)
y = data['Survived']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 100) # 학습셋, 시험셋 준비
model = LogisticRegression() # 모델 생성
model.fit(X_train, y_train) # 학습
pred = model.predict(X_test) # 예측
accuracy_score(y_test, pred) # 정확도 계산

0.7921348314606742

 

총 독립변수 수가 하나 줄어지만 기존보다 정확도가 0.012 정도 높아졌습니다. 이렇게 모델링은 한 번만에 끝내는 것이 아니라, 다양한 시도를 해가며 수없이 재반복해 더 나은 결과물을 얻어내는 과정입니다.

여기서는 0.4 정도의 상관관계가 있는 변수를 합쳐주면 더 좋은 결과를 얻을 수 있을 겁니다. 그런데 언제나 유효한 기준은 아닙니다. 피처 엔지니어링에는 정답이 없습니다. 데이터 특성이나 도메인 지식에 따라 무궁무진하게 확장할 수 있습니다. 물론, 그 어떤 피처 엔지니어링도 수행할 수 없는 경우도 있겠죠. 그렇기 때문에 피처 엔지니어링은 매우 중요하면서도 아주 까다롭습니다.

 

8. 이해하기 : 로지스틱 회귀

우선 아주 근본적인 질문에서부터 시작하겠습니다. 타이타닉 데이터와 같은 이진분류 문제에, 즉 목푯값이 0과 1로 구성된 때는 왜 선형 회귀 분석을 사용하지 않을까요? 0과 1도 어차피 숫자인데 말이죠. 선형 회귀 분석을 적용시킬 수 없는 건 아닙니다만 그 결괏값은 우리가 예상하는 형태가 아니게 됩니다. 아래 그래프를 예시로 들어 설명하겠습니다.

 

 

독립변수가 단 1개만 존재하고(x축), 목푯값은 0과 1만 있는 데이터입니다. 각 데이터는 점으로 표시했으며, 이를 선형 회귀 분석으로 모델링하면 빨간선 같은 형태의 모델을 얻을 수 있습니다. 전반적으로 독립변수 x가 클 수록 y값이 1일 확률이 높아지는 형태입니다. 그런데 문제는, x값이 특정 범위가 넘어서면 크게는 1 이상으로 넘어가고, 작게는 0 아래로 내려가서 마이너스의 값을 예측합니다.

목푯값은 0과 1입니다. 따라서 예측값이 그 사이에 있어야 합니다. 물론 범위를 넘어선 값들을 강제로 1과 0으로 귀속시킬 수도 있습니다. 예를 들어 예측값이 1.7이라면 1로 강제로 변경해주고, -0.3이 나오면 0으로 변경해주도록 알고리즘을 만드는 거죠. 하지만 이러한 예측은 그다지 정확하지 못할 겁니다.

우리는 이진분류 문제에서 목푯값은 0과 1이므로 예측값이 해당 범위 안에서 나오기를 바랍니다.로지스틱 회귀 분석은 이러한 문제를 해결해줍니다. 로지스틱 회귀 분석은 로지스틱 함수(Logistic Function)를 사용하여 선형 회귀 분석의 직선 형태를 다음과 같은 그림으로 변형시켜줍니다.

 

 

곡선을 그리면서 한없이 1과 0에 가까워지는 형태입니다. 때문에 로지스틱 회귀 분석에서의 예측값은 절대 1과 0사이를 벗어나지 않게 됩니다.

그런데 우리가 코딩을 통하여 로지스틱 회귀 분석의 예측값을 확인했을 때 분명 값들이 0과 1로만 구성되어 있습니다. 하지만 위 그래프를 보면 0과 1 사이의 수많은 수들, 예를 들어 0.3이나 0.7 같은 예측값도 나올 수 있을 것으로 보입니다. 이미 알아차리신 분도 계시겠지만, 예측값 0.3은 Yes일 확률이 30%, 0.7은 70%를 의미합니다. 실제로 이 모델은 0과 1로만 구성된 결괏값이 아닌 수많은 다른 예측값을 계산해내지만, 기본적으로 0.5를 기준으로 1과 0으로 변환시킨 값을 보여줍니다. 0과 1사이의 구체적인 수들을 얻고 싶다면 predict( ) 대신 predict_proba( ) 를 사용해야 합니다.

다음은 로지스틱 회귀 분석의 공식입니다. e는 자연로그의 밑 (2.718)이고, 지수부 a+bX는 《데싸노트의 실전에서 통하는 머신러닝》 4장에서 다룬 1차 함수의 형태와 같습니다. 즉, 로지스틱 회귀 분석은 선형 회귀 분석의 공식을 한 번 더 변환한 형태입니다.

 

 

머신러닝 입문자를 대상으로 하는 만큼, 여기에서는 수식에 대한 도출까지는 다루지 않겠습니다. 수식의 도출보다는 알고리즘의 기본적인 원리를 이해하는 데 집중해주세요.

 

학습 마무리

타이타닉 승객 정보 데이터셋을 이용해 생존 여부를 예측하는 모델을 만들어보았습니다. 이 과정을 되짚어보겠습니다.

 

되짚어보기

 

과제

피처 엔지니어링 과정에서 family 변수를 만드는 대신, Parch나 SibSp 중 하나를 제거하는 방법으로 했을 때의 예측률도 확인해보세요. 피처 엔지니어링에 대한 또 다른 아이디어가 떠오른다면 다양하게 시도해보고 더 나은 예측률이 나오는 모델을 만들어봅시다.

 

핵심 용어 정리

  1. 로지스틱 회귀: 선형 회귀 분석을 기반으로 한 모델로, 연속형 종속변수가 아닌 이진분류 문제를 위한 알고리즘입니다.
  2. 피처 엔지니어링: 기존 변수에서 더 나은 변수를 도출해내는 작업입니다. Parch와 SibSp를 사용해 새로운 변수 family를 만들어보았습니다.
  3. 상관관계 : 두 변수 간의 연관성을 나타내는 것으로, 상관관계가 높으면 절댓값이 1에 가깝습니다.
  4. PCA: Principal Component Analysis의 약자로, 주성분 분석이라고도 부릅니다.
  5. 다중공선성 문제: 변수 간의 강한 상관관계가 있을 때 발생하는 문제. 선형 모델은 독립변수 간의 독립성을 전제로 하기 때문에 다중공선성 문제를 해결해 주는 것이 좋습니다.
  6. 더미 변수와 원-핫 인코딩 : 범주 형태(혹은 문자 형태)의 변수를 숫자로 표현하는 방법입니다. 변수에 속해 있는 고윳값에 대한 새로운 변수들을 만들어 1과 0으로 표현합니다(해당 변수는1,나머지변수는0).

 

로지스틱 회귀 – 타이타닉 생존자 예측하기 전부 보기

1편: https://bit.ly/3TlUEB3

2편: https://bit.ly/3wH3Kzr

권시현(데싸노트)

삼성전자에 마케팅 직군으로 입사하여 앱스토어 결제 데이터를 운영 및 관리했습니다. 데이터에 관심이 생겨 미국으로 유학을 떠나 지금은 모바일 서비스 업체 IDT에서 데이터 사이언티스트로 일합니다. 문과 출신이 미국 현지 데이터 사이언티스트가 되기까지 파이썬과 머신러닝을 배우며 많은 시행착오를 겪었습니다. 제가 겪었던 시행착오를 덜어드리고, 머신러닝에 대한 재미를 전달하고자 유튜버로 활동하고 책을 집필합니다.

현) IDT Corporation (미국 모바일 서비스 업체) 데이터 사이언티스트
전) 콜롬비아 대학교, Machine Learning Tutor, 대학원생 대상
전) 콜롬비아 대학교, Big Data Immersion Program Teaching Assistant
전) 콜롬비아 대학교, M.S. in Applied Analytics
전) 삼성전자 무선사업부, 스마트폰 데이터 분석가
전) 삼성전자 무선사업부, 모바일앱 스토어 데이터 관리 및 운영

강의 : 패스트캠퍼스 〈파이썬을 활용한 이커머스 데이터 분석 입문〉

SNS : www.youtube.com/c/데싸노트

Leave a Reply

©2020 GoldenRabbit. All rights reserved.
상호명 : 골든래빗 주식회사
(04051) 서울특별시 마포구 양화로 186, 5층 512호, 514호 (동교동, LC타워)
TEL : 0505-398-0505 / FAX : 0505-537-0505
대표이사 : 최현우
사업자등록번호 : 475-87-01581
통신판매업신고 : 2023-서울마포-2391호
master@goldenrabbit.co.kr
개인정보처리방침
배송/반품/환불/교환 안내