로지스틱 회귀(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개를 출력해보자!
출력을 하면, 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가지 경우가 아닌 다양한 경우에서 모델이 결과를 맞추는 예제를 실습해보자!
이번 예제를 직접 사용해보고 싶다면 아래 소스 코드를 올려놓은 사이트를 참고하면 된다.
전체 소스 코드 :
(이해가 다소 힘들거나, 틀린 부분이 있다면 댓글 부탁드리겠습니다! 😊)
💖댓글과 공감은 큰 힘이 됩니다!💖