본문 바로가기

머신러닝/지도학습

[Machine Learning] Kaggle_연습사례 분석_Spaceship_titanic_2

320x100

 

서론

 

지난 시간에 이어서, 잘 전송된 승객의 수를 예측하는 과정을 서술하겠습니다.

첫번째 글에서는 kaggle의 Spaceship-titanic 의 데이터셋을 분석하여

LightGBM을 통해 알고리즘 모델을 넣고, 전송 승객을 예측하는 모델을 도출했습니다.

 

추가적으로 정확도 점수도 분석해보고, 변수 중요도(feature important)도 잠깐 도출했습니다.

데이터 자체가 titanic의 데이터셋과 유사한 형태와 목표를 갖고 있기 때문에 

큰 어려움은 없을 것이라고 예상됩니다.

 

이번에는 test.csv 파일 로드부터 시작합니다!

 


이번 파일에서도 PassengerId를 인덱스로 바로 들고 왔습니다.

파일 경로는 따로 원본 데이터셋을 다운받은 경로입니다.

df = pd.read_csv('C:\myPyCode\data\spaceship-titanic\test.csv',index_col = 0)
df

test파일도 결측치부터 확인합니다.

 

# test 결측치
df.isnull().mean()
HomePlanet      0.020341
CryoSleep       0.021744
Cabin           0.023381
Destination     0.021510
Age             0.021277
VIP             0.021744
RoomService     0.019172
FoodCourt       0.024784
ShoppingMall    0.022913
Spa             0.023615
VRDeck          0.018705
Name            0.021978
dtype: float64

 

결측치가 안타깝게도 train 데이터보다도 많아보입니다.

다만 이미 한번 처리했기 때문에, 새롭게 시작할 필요 없이 지난 시간에 했던 방법으로

똑같이 적용합니다.

 

Name과 Cabin은 제거하는 과정부터 VRDeck은 결측치를 평균으로 채워주는 것까지

모두 합해주었습니다.

 

# 모든 feature 결측치 처리
df.drop(['Name','Cabin'], axis = 1, inplace =True)
df.HomePlanet = df.HomePlanet.fillna('Earth')
df.Age.fillna(df.Age.median(), inplace = True)
df.RoomService.fillna(df.RoomService.mean(), inplace=True)
df.FoodCourt.fillna(df.FoodCourt.mean(), inplace=True)
df.ShoppingMall.fillna(df.ShoppingMall.mean(), inplace=True)
df.Spa.fillna(df.Spa.mean(), inplace=True)
df.VRDeck.fillna(df.VRDeck.mean(), inplace=True)

 

금방 끝났죠?

이제 범주형 변수인 Cryosleep, Destination, VIP, HomePlanet은

더미 데이터로 만들어줍니다.

 

# test 결측치 처리 완료
df = pd.get_dummies(df, columns = ['CryoSleep','Destination','VIP','HomePlanet'], drop_first=True)
df.isnull().sum()

Age                          0
RoomService                  0
FoodCourt                    0
ShoppingMall                 0
Spa                          0
VRDeck                       0
CryoSleep_True               0
Destination_PSO J318.5-22    0
Destination_TRAPPIST-1e      0
VIP_True                     0
HomePlanet_Europa            0
HomePlanet_Mars              0
dtype: int64

 

이제 직접 적용할 것이기 때문에, train_test_split은 진행하지 않아도 됩니다.

왜냐하면 종속변수 y 자체가 test에 존재하지 않거든요!

 


# test 파일의 X 시험셋 정의
test_X = df
test_X

Transported가 없기때문에 전 데이터프레임이 X가 됩니다.

 

필자는 지난 시간에 전처리를 모두 끝내고, CV 진행하고

LighbGBM까지 끝낸 모델 이름을 lg로 선언했었습니다.

 

# 모델링 test
lg_predict = model.predict(test_X)

 

제가 만든 lg에 test파일의 시험셋을 넣어줍니다.

 

# submission으로 로드
sample_submission = pd.read_csv('/kaggle/input/spaceship-titanic/sample_submission.csv')
sample_submission

함께 포함되어 있던 sample_submission 데이터도 불러와줍니다.

현재 모두 false로 되어있습니다.

 

 

거의 다 끝났습니다. 예측값을 submission파일에 포함시켜줍니다.

 

업로드할 파일 경로에 대해서는 kaggle의 업로드용 경로를 넣을지,

수정해서 제 컴퓨터 경로를 넣을지 고민을 잠깐 했는데요.

일단 따로 업로드를 하고, kaggle에서는 다른 경로를 수정해서 넣었습니다.

 

여기서는 달라지는 점은 없습니다.

sample_submission["Transported"] = lg_predict
sample_submission.to_csv('C:\myPyCode\data\spaceship-titanic/LightGBM_Classifier_submission.csv', index=False)

 

이제 예측까지 모두 끝났습니다! 누가 전송되었고, 누가 전송되지 않았는지

구분하는 데이터가 만들어졌습니다.

5명 정도만 불러와봅니다.

 

sample_submission.head()
	PassengerId 	Transported
0 	0013_01 	True
1 	0018_01 	False
2 	0019_01 	True
3 	0021_01 	True
4 	0023_01 	True

 

여기선 조회하지 않았지만 sample_submission의 전체 csv에는 전원의 전송여부가 담겨져 있습니다.

 

잠깐 보자면, 13번, 19번, 21번, 23번 승객은 다른 차원으로 전송되었는데

18번은 아쉽게도 전송되지 못했군요🛸

 

이게 전송된 것이 살아남은 것인지, 아니면 다른 차원으로 빠지게 되서

시공간에서 갇히게 된 것인지 판단은 못하겠습니다.

결정은 여러분의 몫입니다.😅

 

일단 필자는 Spaceship Titanic 탑승자 모든 분들이

부디 안전한 곳으로 귀환하기를 바라겠습니다!🚀

 

 

2022-12-28. 끝

728x90