본문 바로가기
Python

python 생존자 예측 분석 모델링 연습

by soojitasan 2024. 12. 9. 22:37

python 분석 연습

처음 혼자 해본거라 잘못 처리한 부분이 많을 수 있습니다.

 

- 사용 데이터셋 : kaggle spaceship-titanic

- 연습 목표 : 전체 process 코드 짜보고 해석해보기

- 다음 목표 : 코드 한줄씩 뜯어보면서 그 필요성과 의미 이해하기

 

첫술에 배부를 수 없다. 

 

## spaceship-titanic 데이터셋
## https://www.kaggle.com/competitions/spaceship-titanic/data
## 목표 : 생존자(Trainsported) 예측을 위한 최적의 모형 찾기


#############################################################################3
# 1. 데이터 파악
import pandas as pd
import numpy as np

train = pd.read_csv("/content/train.csv")
test = pd.read_csv("/content/test.csv")

#train.head() ## 상위 5개 행
#train.info() ## null 갯수, 데이터 타입
#train.describe() ## 숫자데이터 주요 지표


#############################################################################3
# 2. 데이터 전처리 (결측치, 이상치, 정규화, 범주화)
## 결측치 처리 ... 변수 특성 잘 파악해서 대체 >> isnull() ## 특정 행이 null인 값 출력
### 결측치 대체 방법 1. 평균값 : train['열1'].fillna(train['열1'].mean())
### 결측치 대체 방법 2. 중앙값 : train['열1'].fillna(train['열1'].median())
### 결측치 대체 방법 3. 최빈값  : train['열1'].fillna(train['열1'].mode()[0])
### 결측치 대체 방법 4. 특정값 : train['열1'].fillna('ㅁ')

train['HomePlanet'] = train['HomePlanet'].fillna(train['HomePlanet'].mode()[0])  ## 1) HomePlanet : 출발 행성 > 최빈값
train['CryoSleep'] = train['CryoSleep'].fillna(train['CryoSleep'].mode()[0]) ## 2) CryoSleep : 냉동 보존 여부 > 최빈값
# train[train['Cabin'].isnull()] ## 3) Cabin : Cabin 번호 > 대체 불가
train['Destination'] = train['Destination'].fillna(train['Destination'].mode()[0]) ## 4) 도착 행성 > 최빈값
train['Age'] = train['Age'].fillna(train['Age'].median()) ## 5) 나이 > 중앙값
train['VIP'] = train['VIP'] .fillna(False) ## 6) VIP 여부 > 기본값(X)
train['RoomService'] = train['RoomService'].fillna(train['RoomService'].mean()) ## 7) 룸서비스 비용 > 평균
train['FoodCourt'] = train['FoodCourt'].fillna(train['FoodCourt'].mean()) ## 8) 푸드코드 비용 > 평균
train['ShoppingMall'] = train['ShoppingMall'].fillna(train['ShoppingMall'].mean()) ## 9) 푸드코드 비용 > 평균
train['Spa'] = train['Spa'].fillna(train['Spa'].mean()) ## 10) 스파 비용 > 평균
train['VRDeck'] = train['VRDeck'].fillna(train['VRDeck'].mean()) ## 11) VR덱 비용 > 평균
# train[train['Name'].isnull()] ## 12) 이름 > 대체 불가

## 범주화 : 명목변수의 수치화
pd.to_numeric(train['CryoSleep'])  ## 2) CryoSleep
pd.to_numeric(train['VIP'])  ## 6) VIP



''' *************** test dataset에도 전처리 동일하게 적용 *************** '''
test['HomePlanet'] = test['HomePlanet'].fillna(test['HomePlanet'].mode()[0])  ## 1) HomePlanet : 출발 행성 > 최빈값
test['CryoSleep'] = test['CryoSleep'].fillna(test['CryoSleep'].mode()[0]) ## 2) CryoSleep : 냉동 보존 여부 > 최빈값
# test[test['Cabin'].isnull()] ## 3) Cabin : Cabin 번호 > 대체 불가
test['Destination'] = test['Destination'].fillna(test['Destination'].mode()[0]) ## 4) 도착 행성 > 최빈값
test['Age'] = test['Age'].fillna(test['Age'].median()) ## 5) 나이 > 중앙값
test['VIP'] = test['VIP'] .fillna(False) ## 6) VIP 여부 > 기본값(X)
test['RoomService'] = test['RoomService'].fillna(test['RoomService'].mean()) ## 7) 룸서비스 비용 > 평균
test['FoodCourt'] = test['FoodCourt'].fillna(test['FoodCourt'].mean()) ## 8) 푸드코드 비용 > 평균
test['ShoppingMall'] = test['ShoppingMall'].fillna(test['ShoppingMall'].mean()) ## 9) 푸드코드 비용 > 평균
test['Spa'] = test['Spa'].fillna(test['Spa'].mean()) ## 10) 스파 비용 > 평균
test['VRDeck'] = test['VRDeck'].fillna(test['VRDeck'].mean()) ## 11) VR덱 비용 > 평균
# test[test['Name'].isnull()] ## 12) 이름 > 대체 불가

## 범주화 : 명목변수의 수치화
pd.to_numeric(test['CryoSleep'])  ## 2) CryoSleep
pd.to_numeric(test['VIP'])  ## 6) VIP

X_test = test.loc[:, ~test.columns.isin(['Transported', 'HomePlanet',  'Cabin', 'Destination', 'Name', 'PassengerId'])]
###########



#############################################################################3
# 3. 모델링
from sklearn.model_selection import train_test_split
target = train['Transported']
x_train, x_valid, y_train, y_valid = train_test_split(train, target, test_size = 0.2, random_state=99, stratify=target)

X_train = x_train.loc[:, ~train.columns.isin(['Transported', 'HomePlanet',  'Cabin', 'Destination', 'Name', 'PassengerId'])]
Y_train = y_train

X_valid = x_valid.loc[:, ~train.columns.isin(['Transported', 'HomePlanet',  'Cabin', 'Destination', 'Name', 'PassengerId'])]
Y_valid = y_valid


## 1) 랜덤포레스트
from sklearn.model_selection import cross_validate, KFold

from sklearn.ensemble import RandomForestRegressor
rf = RandomForestRegressor()
rf_score = cross_validate(rf, X_train, Y_train, return_train_score=True, cv=KFold(5))

## 2) 그레디언트부스팅  ## + 추가 필요
from sklearn.ensemble import GradientBoostingRegressor
gb = GradientBoostingRegressor()
gb_score = cross_validate(gb, X_train, Y_train, return_train_score=True, cv=KFold(5))

print(np.mean(rf_score['train_score']), np.mean(rf_score['test_score']))  ## 0.7175136737823016    0.35117140454371965
print(np.mean(gb_score['train_score']), np.mean(gb_score['test_score']))  ## 0.44201451235486433    0.39298701077098885

## 해석하기
### test score : 일반화 성능
### train score : test score 값과의 차이가 크면 과적합 우려 존재



#############################################################################3
# 4. 성능 평가
## 1안) 랜덤포레스트 선택
'''
from sklearn.metrics import mean_squared_error
rf.fit(X_train, Y_train)
pred = rf.predict(X_valid)
mse = mean_squared_error(Y_valid, pred)  ## 랜덤포레스트 :

predict = rf.predict(X_test)

idx = test['PassengerId']

result = pd.DataFrame({
	"index": idx,	# 문제에서 제시한 정렬/primary key/index 기준
	"ans": predict 	# 예측한 column
})

print(result)
print(mse)   ## 랜덤포레스트 : 0.16706210545588568
'''


## 2안) 그레디언트부스팅 선택
'''
from sklearn.metrics import mean_squared_error
gb.fit(X_train, Y_train)
pred = gb.predict(X_valid)
mse = mean_squared_error(Y_valid, pred)

predict = gb.predict(X_test)

idx = test['PassengerId']

result = pd.DataFrame({
	"index": idx,	# 문제에서 제시한 정렬/primary key/index 기준
	"ans": predict 	# 예측한 column
})

print(result)
print(mse)   ## 그레디언트부스팅 : 0.15705170358489629
'''

## 해석하기
### mse값은 작을 수록 성능이 좋음을 의미함. but 다른 측정값도 같이 비교해야 유의미한 해석 가능

 


참고자료

https://miiinnn23.tistory.com/103

https://www.kaggle.com/competitions/spaceship-titanic/data