사용데이터: Kaggle의 titanic train 데이터셋
목표 1. 탑승한 승객의 정보를 바탕으로 생존 유무를 예측하는 분류 문제
가설 1. 성별과 생존의 관계, 여성일 수록 생존확률이 높을 것이다 -> 여성은 모두 생존했고 남성은 모두 사망했다가설 2. 요금과 생존의 관계, 요금이 높은 고객일 수록 생존했을 것이다
-> 높은 요금운 모두 생존했고, 낮은 요금은 모두 사망했다가설 3. 요금/성별/좌석등급과 생존의 관계, 어릴수록 생존했을 것이다
방법: 로지스틱회귀
- Y(종속변수): 사망(0), 생존(1)
- X(독립변수): 티켓등급, 성별, 요금 등
💡순서
라이브러리 &데이터불러오기 > 데이터 살펴보기(산점도 그려보기, 기초통계량 보기,엔코딩하기) > 선형회귀 훈련하기(가중치/편향 계산) > 평가하기(정확도, f1-score)
1. 라이브러리 & 데이터 불러오기
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.linear_model import LogisticRegression
titaninc_df = pd.read_csv('/Users/t2023-m0017/Desktop/[파이썬]/ML/titanic/train.csv', encoding= 'utf-8')
titaninc_df.head(3)
2. 데이터 살펴보기
- 숫자형 데이터: age, sibsp, parch, fare
- 범주형 데이터: pclass, sex, cabin, embarked
- 이산형 데이터: survived
# info(): 데이터에 대한 결측치, 데이터전체 갯수 등을
titaninc_df.info()
null 값이 있는 데이터: cabin > age > embarked
3. 분석하기
가설 1. 성별과 생존의 관계, 여성일 수록 생존확률이 높을 것이다
방법: pivot table > 그래프
피벗테이블로 확인하기
pt = pd.pivot_table(titaninc_df, # 피벅할 데이터프레임
index= 'Sex', # 행 위치에 들어갈 열 -> female, male
columns = 'Survived', # 열 위치에 들어갈 열 -> 0,1
aggfunc = 'size') # 데이터 집계함수 -> 수량
4. 평가하기
정확도 = 예측하여 맞춘갯수 / 전체데이터
* 여성은 전부 살았고 남성은 전부 적었다 라고 가정할 때 실제로 생존한 여성: 233, 실제로 사망한 남성: 468
total_p = len(titaninc_df) # 전체데이터
(233+468)/total_p*100 # 정확도 계산
>> 78.67564534231201
약 79% 정확함
💡정확도 계산하기
(TP +TN)/(TP+FP+TN+FN) = 실제생존한 여성의 수 + 실제 사망한 남성의 수 / 전체 인원수
그래프 그리기
sns.countplot(titaninc_df, x = 'Sex', hue ='Survived')
단순로지스틱 회귀
가설 2. 요금과 생존의 관계, 요금이 높은 고객일 수록 생존했을 것이다
-> 높은 요금운 모두 생존했고, 낮은 요금은 모두 사망했다
방법: 로지스틱 회귀
- Y(종속변수): 사망(0), 생존(1)
- X(독립변수): 요금
2. 데이터확인하기
2-1) 변수지정하기
# X변수: Fare, Y변수: Survived
X_1 = titaninc_df[['Fare']]
y_true = titaninc_df[['Survived']]
2-2) 그래프/표로 분포 확인하기
sns.scatterplot(titaninc_df, x = 'Fare',y = 'Survived')
산점도로는 분표의 밀도를 알기 어렵고..요금별 차이가 보이지 않음...
sns.histplot(titaninc_df, x = 'Fare')
히스토그램에서는 10~20에 분포가 제일 많음 -> 데이터가 한쪽으로 치우침
# 수치형데이터를 확인하는 쉬운방법 describe()
titaninc_df.describe()
평균이 32로 50%다 14에 치우쳐짐
3. 선형회귀 훈련하기(가중치/편향 계산)
model_lor = LogisticRegression()
model_lor.fit(X_1, y_true)
def get_att(x):
#x모델을 넣기
print('클래스 종류', x.classes_) # 생존을 0,1로 구분
print('독립변수 갯수', x.n_features_in_) # 요금
print('들어간 독립변수(x)의 이름',x.feature_names_in_)
print('가중치',x.coef_)
print('바이어스(편향)', x.intercept_)
get_att(model_lor)
4. 평가하기(정확도, f1-score)
from sklearn.metrics import accuracy_score, f1_score
def get_metrics(true, pred):
print('정확도', accuracy_score(true, pred))
print('f1-score', f1_score(true, pred))
y_pred_1 = model_lor.predict(X_1) # x변수 요금에 대한 y값 확률
get_metrics(y_true, y_pred_1)
다중로지스틱 회귀
가설 3. 요금/성별/좌석등급과 생존의 관계, 어릴수록 생존했을 것이다
방법: 다중로지스틱 회귀
- Y(종속변수): 사망(0), 생존(1)
- X(독립변수): 요금(수치형)/성별(범주형)/좌석등급(범주형-숫자)
2. 데이터확인하기
2-1) 볌주형 데이터 encoding하기
def get_sex(x):
if x == 'female':
return 0
else:
return 1 #sex컬럼에서 female일 경우 1, 아닐 경우0
titaninc_df['Sex_en'] = titaninc_df['Sex'].apply(get_sex)
# titaninc_df 데이터프레임에서 Sex_en라는 컬럼에(만들어서) Sex컬럼에 get_sex함수를 적용시켜서 저장
titaninc_df.head(3)
2-2) 변수지정하기
X_2 = titaninc_df[['Pclass','Sex_en','Fare']] #x_2변수에 'Pclass','Sex_en','Fare' 저장
y_true = titaninc_df[['Survived']] #y_true 변수에 'Survived'지정
3. 선형회귀 훈련하기
model_lor_2 = LogisticRegression() # 모델 학습
model_lor_2.fit(X_2,y_true) # 훈련하기
get_att(model_lor_2)
4. 평가하기(정확도, f1-score)
from sklearn.metrics import accuracy_score, f1_score
def get_metrics(true, pred):
print('정확도', accuracy_score(true, pred))
print('f1-score', f1_score(true, pred))
y_pred_2 = model_lor_2.predict(X_2) # x변수 요금,성별,좌석등급에 대한 y값 확률
get_metrics(y_true, y_pred_1) # X변수가 Fare
get_metrics(y_true, y_pred_2) # X변수가 Fare, Pclass, Sex
정확도와 f-score가 올라감!
'학습노트 > Python' 카테고리의 다른 글
[강의노트] Python - 머신러닝 - 예측모델링 프로세스 (1) (0) | 2024.01.31 |
---|---|
[강의노트] Python - 머신러닝 - 로지스틱 회귀 (0) | 2024.01.31 |
[강의노트] Python - 머신러닝 - 선형회귀-실습(2) (1) | 2024.01.30 |
[강의노트] Python - 머신러닝 - 선형회귀-실습(1) (2) | 2024.01.30 |
[강의노트] Python - 머신러닝 - 선형회귀 (1) | 2024.01.30 |