BuNa_
IT Story
BuNa_
전체 방문자
오늘
어제
  • 분류 전체보기 (117)
    • CS (14)
      • 운영체제 (8)
      • 네트워크 (0)
      • Design Pattern (1)
      • OOP (4)
    • 대외활동 (24)
      • 우아한테크코스 (14)
      • DND 동아리 (4)
      • UMC 동아리 (5)
      • 해커톤 (1)
    • Android (29)
      • MVVM (2)
      • 스터디 (11)
      • Compose (3)
      • Unit Test (1)
    • Project (5)
      • 어따세워 (5)
      • DnD 과외 서비스 (0)
    • Programming (11)
      • Kotlin (4)
      • 파이썬 (7)
    • Git (1)
    • 인공지능 (22)
    • 백준 (8)
    • 기타 (3)
      • IntelliJ (1)
      • 일상 (0)

블로그 메뉴

  • 홈

공지사항

인기 글

태그

  • 선형회귀
  • UMC
  • 인공지능 분류
  • 우테코 5기
  • ViewModel
  • 딥러닝
  • Android
  • 백준
  • 셀레니움
  • 안드로이드
  • 인공지능
  • Baekjoon
  • 우테코 프리코스
  • RecyclerView
  • 객체지향 생활체조
  • K-means
  • MVVM
  • 외부 단편화
  • k-means++
  • Compose
  • 우아한테크코스
  • Ai
  • 어따세워
  • 파이썬
  • 컴공선배
  • 운영체제
  • 원시값 포장
  • External fragmentation
  • 다이나믹 프로그래밍
  • 우테코

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
BuNa_

IT Story

[인공지능][실습] 로지스틱 회귀(Logistic Regression) - 나는 과연 타이타닉 침몰에서 살아남을 수 있었을까?
인공지능

[인공지능][실습] 로지스틱 회귀(Logistic Regression) - 나는 과연 타이타닉 침몰에서 살아남을 수 있었을까?

2021. 5. 14. 19:58

 

 

로지스틱 회귀(Logistic Regression)에 대한 이론이 필요하신 분들은 아래 링크를 참조해주시기 바랍니다.

[인공지능][개념] 로지스틱 회귀(Logistic Regression)는 무엇이며, 시그모이드(Sigmoid) 함수는 왜 사용하는 것일까? : https://itstory1592.tistory.com/8

 

 

 

이번 글에서는, 영화 타이타닉 사고가 일어났을 때의 상황을 가정하여

로지스틱 회귀(Logistic Regression)를 직접 실습해보려고 한다.

 

 

타이타닉 침몰 사고 이미지
타이타닉 침몰 사건

 

'만약 그 자리에 내가 있었다면 살아남았을 수 있었을까?' 하는 의문점을 풀어주는 실습이 될 것이다.

 

 

import pandas as pd
import numpy as np

#사이킷런의 로지스틱 회귀 라이브러리
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split

 

우선 우리가 사용할 라이브러리(library)들을 임포트(import)해준다. 

이번에는 LogisticRegression 클래스를 사용할 것이다.

 

 

#타이타닉 데이터 불러오기
data = pd.read_csv('https://web.stanford.edu/class/archive/cs/cs109/cs109.1166/stuff/titanic.csv')

#맨 앞의 데이터 10개 출력
data.head(10)

 

그런 다음, 판다스(pandas) 라이브러리에서 제공하는 csv파일을 불러주는 read_csv() 메소드를 통해

해당 url에서 타이타닉 예제에서 사용할 데이터를 data변수에 불러와준다.

 

 

data에 저장된 데이터들 중, 맨 앞에 위치한 데이터 10개를 출력해보자!

 

로지스틱 회귀(Logistic Regression)에서 사용 할 타이타닉 입력 데이터(Input data) 10개
로지스틱 회귀(Logistic Regression)에서 사용 할 타이타닉 입력 데이터(Input data) 10개

 

출력을 하면, 0 ~ 9번까지 총 10개의 데이터가 출력될 것이다.

각 데이터마다 모두 독립적인 의미가 존재한다.

 

우선, 'Survived'는 '생존 여부'를 의미하는 데이터이다.

0이라면 사고로 인해 사망했으며, 1이라면 사고로부터 생존했다는 뜻이다.

우리는 이 생존 데이터를 타겟(target)으로 사용할 예정이다.

 

'Pclass'는 '티켓의 클래스'를 의미한다.

각 숫자는, 1 : 1st   2 : 2nd   3 : 3rd 로 구분되며 1등석 2등석 3등석으로 의미하면 된다.

 

'Name' 'Sex' 'Age' 는 탑승객의 이름, 성별, 나이를 의미하며,

'Siblings/Spouses Aboard'와 'Parents/Children Aboard'는 각각

'함께 탑승한 형제와 배우자의 수', '함께 탑승한 부모와 아이의 수'를 의미한다.

마지막으로, 'Fare'는 탑승료에 대한 데이터이다.

 

 

#데이터에 null이 포함되어 있는지 확인
data.isna().sum()

 

불러온 데이터 목록에 null값이 포함되어 있을 수 있기 때문에 isna()메소드로 null이 포함된 데이터를 찾고,

sum()메소드로 개수를 파악해봐야 한다.

(null값의 데이터는 회귀모델의 분석에 문제를 일으키기 때문에, 모델 훈련 미리 제거해주는 작업이 필요하다.)

 

 

 

출력 결과, 데이터 목록에 null 값이 없다고 판단되었다.

(만약 null 값이 있었다면, null이 포함된 데이터를 지우거나, 해당 변수의 평균값으로 null값을 채워주는 방법이 있다.)

 

 

#타겟 데아터 따로 저장
target = data['Survived']

data.drop(labels=['Name', 'Survived'], axis=1, inplace=True)

#성별 데이터를 숫자로 변환
data['Sex'] = data['Sex'].map({'male':0,
                               'female':1})

data

 

생존 여부에 대한 데이터는 타겟 데이터(target data)이므로 target이라는 변수를 생성하여 따로 저장해준다.

그 다음으론, 이름과 방금 따로 저장한 생존 데이터는 모델을 훈련하는데에 불필요한 데이터이므로 지워준다.

그리고 문자로 저장되어 있는 성별 데이터를 남자는 0, 여자는 1로 변경해준다

 

이렇게 하면, 모델을 훈련시킬 입력(Input) 데이터 준비는 모두 끝났다..

한 번, 출력해보자!

 

 

 

예상대로 이름(Name) 데이터와 생존(Survived)에 대한 데이터는 성공적으로 삭제되었고,

성별(Sex) 또한 정수 0과 1로 모두 변경되었다.

 

 

#훈련 데이터와 테스트 데이터 분리
train_input, test_input, train_target, test_target = train_test_split(
    data, target, random_state=42)

 

이제, 기존에 했던 것처럼 훈련 데이터셋과 테스트 데이터셋으로 나누어 준다.

train_test_split은 따로 매개변수를 설정하지 않으면 훈련 데이터로 80%, 테스트 데이터 20%로 분리하는데,

위에서 887 rows x 6 columns로 출력되었으니, 전체 데이터 개수인 887개에서

훈련 데이터는 887 * 0.8, 테스트 데이터는 887 * 0.2 개로 나누어졌을 것이다.

 

 

#로지스틱 회귀 인스턴스 생성
lr = LogisticRegression()
#훈련 데이터로 모델 훈련
lr.fit(train_input, train_target)

#예측 결과 출력
print(lr.predict(test_input))

 

선형회귀 인스턴스를 생성할 때와 동일하게 로지스틱 회귀(Logistic Regression)도 단순히 클래스를 생성해주면 된다.

그 다음으론, fit() 메소드에 훈련 데이터셋을 전달해주고 모델을 훈련시킨다.

predict() 메소드를 통해 테스트 데이터셋의 결과를 출력해보면?!

 

 

로지스틱 회귀모델을 사용하여 테스트 데이터를 예측한 결과

 

0은 사고로부터 살아남지 못한 사람이고,

반대로 1은 사고로부터 살아남은 사람이다.

결과를 보면, 불행하게도 꽤 많은 사람이 사망했다는 것을 알 수 있다.

 

 

#변수 종류 출력
print(data.head(0))
#각 특징(변수, feature)들의 가중치
print(lr.coef_)

 

과연 어떤 요인이 결과에 큰 영향을 미친 것일까?

한 번 coef_ 변수에 저장된 가중치(weight)를 통해 확인해보자.

 

 

훈련된 로지스틱 회귀 모델의 가중치

 

'Sex'의 가중치가 높은 것으로 보아 성별이 사망에 큰 영향을 미쳤다고 예상해볼 수 있다.

그 다음으로 높은 영향력을 가진 변수는 'PClass'인듯 하다.

 

(값이 음수(-)인데도 불구하고 왜 큰 영향을 미쳤는지에 대해 의문이라면,

높은 등급의 클래스일수록 숫자가 낮으므로, 가중치의 값이 음수더라도 절댓값을 취해서 고려할 필요가 있기 때문이다.)

 

 

 

그럼 이번 글에서 가장 궁금할만한..!!

👏 '과연 나는 타이타닉 침몰 사고에서 살아남을 수 있었을까?'에 대한 결과를 확인해보며 마무리 하겠다. 👏

 

 

#내가 탔을 때를 가정한 조건
pred = lr.predict([[2, 0, 23.0, 1, 0, 30.5789]])

if(pred[0] == 0):
    print('AI : 사망하실 것으로 예측됩니다.\n')
else:
    print('AI : 생존하실 것으로 예측됩니다.\n')

#음성 클래스 / 양성 클래스의 확률
print('양성 클래스 / 음성 클래스 : {}'.format(lr.predict_proba([[2, 0, 23.0, 1, 0, 30.5789]])))

 

나는 2등석 배에 탔고, 성별은 남자이며, 나이는 23세, 동생 1명과 함께 배를 탔고, 요금 30.5$를 지불하였다.

코드로는 재미를 위해, 예측 값에 따라 AI가 예측해주는 문장을 출력하도록 하였다.

그리고, 몇% 확률로 결과가 예측된 것인지도 predict_proba() 메소드를 통해 확인해보자

 

 

과연 결과는?!

 

 

 

로지스틱 모델을 통해 예측한 본인의 결과

 

결국 사망해버리고 말았다..

심지어 사망 확률은 76%..!!

이정도면 어떻게 해도 사고에서 살아남지 못했을 것 같다..😥

 

해당 예제에서는 타이타닉 사건을 기반으로,

시그모이드(Sigmoid) 사용한 로지스틱 회귀(Rogistic Regression)에 대해 알아보았다.

 

여기서 알아야 할 것은, 시그모이드 함수는 양성클래스와 음성클래스로 결과를 구분한다는 것이다.

즉, 모델은 2가지 경우에서밖에 선택할 수 없다는 의미이다.

 

하지만 실제로는 2가지가 아닌 정말 다양한 경우에서 결과를 선택해야하는 경우가 발생할 수 있다.

예를 들어,

1. 여러 생선들 중에서 특정 생선 예측하여 맞추기

2. 여러 의류 중에서 특정 옷이 무슨 종류인지 맞추기

 


 

등등 여러 상황이 있을 것이다.

 

만약 여러 경우에서 예측하고 싶다면, 시그모이드 함수 대신, 소프트맥스(softmax) 라는 활성화 함수를 사용해야 한다.

 

다음 시간에는 소프트맥스 함수를 사용하여,

2가지 경우가 아닌 다양한 경우에서 모델이 결과를 맞추는 예제를 실습해보자!

이번 예제를 직접 사용해보고 싶다면 아래 소스 코드를 올려놓은 사이트를 참고하면 된다.

 

 

 

전체 소스 코드 : 

https://colab.research.google.com/drive/106eArhKMNw3xKXJKozH5h72xFja4tT99?hl=ko#scrollTo=NtsP6w1iyO6e

 

(이해가 다소 힘들거나, 틀린 부분이 있다면 댓글 부탁드리겠습니다! 😊)

💖댓글과 공감은 큰 힘이 됩니다!💖

저작자표시 비영리 변경금지 (새창열림)

'인공지능' 카테고리의 다른 글

[인공지능][개념] 분류(Classification) - 결정 트리(Decisioin Tree)와 가지치기(Pruning)  (0) 2021.05.17
[인공지능][실습] 로지스틱 회귀(Logistic Regression) - 붓꽃 데이터(Iris Data)를 사용하여 3종류의 꽃을 분류해보자  (1) 2021.05.16
[인공지능][개념] 로지스틱 회귀(Logistic Regression)는 무엇이며, 시그모이드(Sigmoid) 함수는 왜 사용하는 것일까?  (3) 2021.05.13
[인공지능][실습] 다항회귀(Polynomial Regression)와 다중선형회귀(Mutiple Linear Regression)를 활용하여 생선의 무게를 예측해보자  (1) 2021.05.12
[인공지능][개념] 다항회귀(Polynomial Regression)와 다중선형회귀(Mutiple Linear Regression) + 규제(Regularization)에 대해 알아보자  (0) 2021.05.11
    '인공지능' 카테고리의 다른 글
    • [인공지능][개념] 분류(Classification) - 결정 트리(Decisioin Tree)와 가지치기(Pruning)
    • [인공지능][실습] 로지스틱 회귀(Logistic Regression) - 붓꽃 데이터(Iris Data)를 사용하여 3종류의 꽃을 분류해보자
    • [인공지능][개념] 로지스틱 회귀(Logistic Regression)는 무엇이며, 시그모이드(Sigmoid) 함수는 왜 사용하는 것일까?
    • [인공지능][실습] 다항회귀(Polynomial Regression)와 다중선형회귀(Mutiple Linear Regression)를 활용하여 생선의 무게를 예측해보자
    BuNa_
    BuNa_
    안드로이드 개발자를 향해 달리고 있는 공대생입니다! 🧑 Android, Kotlin, Java, Python 등 학습하고 있는 내용과 프로젝트를 주로 업로드하고 있습니다. 지적과 조언은 언제나 환영입니다!😊 github : https://github.com/tmdgh1592

    티스토리툴바