Allen's 데이터 맛집

[머신러닝] 분류 : 타이타닉 생존여부 예측 본문

Project/Kaggle 분석&기계학습

[머신러닝] 분류 : 타이타닉 생존여부 예측

Allen93 2023. 9. 27. 22:01

생존여부 예측모델 만들기

 

학습용 데이터 (X_train, y_train)을 이용하여 생존 예측 모형을 만든 후, 이를 평가용 데이터(X_test)에 적용하여 얻은 예측값을 다음과 같은 형식의 CSV파일로 생성하시오.

(제출한 모델의 성능은 accuracy 평가지표에 따라 채점)

 

(가) 제공 데이터 목록

  • y_train: 생존여부(학습용)
  • X_trian, X_test : 승객 정보 (학습용 및 평가용)

(나) 데이터 형식 및 내용

  • y_trian (712명 데이터)

시험환경 세팅은 예시문제와 동일한 형태의 X_train, y_train, X_test 데이터를 만들기 위함임

 

유의사항

  • 성능이 우수한 예측모형을 구축하기 위해서는 적절한 데이터 전처리, 피처엔지니어링, 분류알고리즘, 하이퍼파라미터 튜닝, 모형 앙상블 등이 수반되어야 한다.
  • 수험번호.csv파일이 만들어지도록 코드를 제출한다.
  • 제출한 모델의 성능은 accuracy로 평가함

csv 출력형태

 

[참고]작업형2 문구

  • 출력을 원하실 경우 print() 함수 활용
  • 예시) print(df.head())
  • getcwd(), chdir() 등 작업 폴더 설정 불필요
  • 파일 경로 상 내부 드라이브 경로(C: 등) 접근 불가

데이터 파일 읽기 예제

  • import pandas as pd
  • X_test = pd.read_csv("data/X_test.csv")
  • X_train = pd.read_csv("data/X_train.csv")
  • y_train = pd.read_csv("data/y_train.csv")

사용자 코딩

답안 제출 참고

  • 아래 코드 예측변수와 수험번호를 개인별로 변경하여 활용
  • pd.DataFrame({'cust_id': X_test.cust_id, 'gender': pred}).to_csv('003000000.csv', index=False)

 


 

라이브러리 및 데이터 불러오기

 

여러 라이브러리와 X데이터, 제출용 X데이터, Y데이터를 불러옵니다.

# 시험환경 세팅 (코드 변경 X)
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split

def exam_data_load(df, target, id_name="", null_name=""):
    if id_name == "":
        df = df.reset_index().rename(columns={"index": "id"})
        id_name = 'id'
    else:
        id_name = id_name
    
    if null_name != "":
        df[df == null_name] = np.nan
    
    X_train, X_test = train_test_split(df, test_size=0.2, random_state=2021)
    
    y_train = X_train[[id_name, target]]
    X_train = X_train.drop(columns=[target])

    
    y_test = X_test[[id_name, target]]
    X_test = X_test.drop(columns=[target])
    return X_train, X_test, y_train, y_test 
    
df = pd.read_csv("../input/titanic/train.csv")
X_train, X_test, y_train, y_test = exam_data_load(df, target='Survived', id_name='PassengerId')

X_train.shape, X_test.shape, y_train.shape, y_test.shape

# 데이터 불러오기 (생략)
X_train.shape, y_train.shape, X_test.shape

X = X_train
X_submission = X_test
Y = y_train

 

EDA

shape, info, 그리고 컬럼들을 출력하여 데이터프레임의 구성을 확인합니다.

print([x.shape  for x in [X, X_submission, Y]])
print([x.info()  for x in [X, X_submission, Y]])
print([x.columns for x in [X, X_submission, Y]])
object = ['Name','Sex','Ticket','Cabin','Embarked']

 

데이터 전처리

제출용 X데이터에서 'PassengerId'를 제거 후 test_id란 변수에 저장해 줍니다

X데이터와 제출용 X데이터를 함께 전처리를 해 주기 위해 dfX변수로 concat 함수로 합친 후 unique 개수를 출력합니다.

test_id = X_submission.pop('PassengerId')

dfX = pd.concat([X, X_submission])
#print(dfX.shape, dfX.info())
dfX.nunique()

 

통계 분석에 큰 의미가 없는 'Name, PassengerId' 칼럼을 제거해 줍니다.

그리고 Fare 컬럼을 int타입으로 변경 후 info()를 찍어 확인해 봅니다.

dfX =dfX.drop(columns = ['Name','PassengerId'])

dfX.nunique()

#dfX.nunique()
pd.set_option('display.max.columns',None)
dfX['Fare'] = dfX['Fare'].astype('int')
dfX.info()

 

 

'Sex, Cabin, Embarked' 카테고리형 변수를 데이터 분석을 위해 Numeric 형태로 변환해 줍니다.

temp = pd.get_dummies(dfX[['Sex','Cabin','Embarked']])

dfX = pd.concat([dfX, temp], axis = 1)
dfX

 

 

'Sex, Cabin, Embarked'을 제와한 나머지 object 타입들은 제거를 해줍니다.

그리고 Age의 결측치를 평균으로 대체해 주고 다시 X와 제출용 X변수를 나눠줍니다.

temp = dfX.select_dtypes(include = 'object')
dfX = dfX.drop(columns = temp)
dfX.info()

dfX['Age'] = dfX.Age.fillna(dfX.Age.mean())

size = X.shape[0]
X_use = dfX.iloc[:size,:]
X_submission_use = dfX.iloc[size:,:]
print(X_use.shape, X_submission_use.shape)

>>> (712, 157) (179, 157)

 

 

모델 생성 및 학습

학습 모델링을 위해 train_test_split 함수로 데이터셋을 나눠줍니다.

from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier

xtrain, xtest, ytrain, ytest = train_test_split(X_use, Y, test_size = 0.25, stratify = Y, random_state = 7438)

print([x.shape for x in [xtrain, xtest, ytrain, ytest]])

>>> (712, 157) (179, 157)

 

 

가장 점수가 좋았던 RandomForestClassifier모델을 사용하여 예측값을 계산합니다.

submission 변수에 'PassengerId'와 예측을 하였던 값을 'Survived'란 변수에 담습니다.

model = RandomForestClassifier(max_depth = 4, random_state = 7438).fit(xtrain, ytrain.values.ravel())
pred = model.predict(X_submission_use)

#test_id.shape
submission = pd.DataFrame({'PassengerId' : test_id, 'Survived' : pred})
submission.shape

>>> (179, 2)

 

 

데이터 프레임 확인

submission.to_csv('result.csv', index = False)
df = pd.read_csv('result.csv')
df

점수 확인

model.score(X_submission_use, y_test['Survived'])

>>> 0.703910614.....

 

 

 

케글출처 : https://www.kaggle.com/code/agileteam/t2-1-titanic-simple-baseline