본문 바로가기

[Titanic] Model Development(ML) - Randomforest (지도학습)

Derrick 발행일 : 2022-12-04
728x90
반응형

 

※ 타이타닉에 승선한 사람들의 데이터로 승객들의 생존여부를 예측하는 모델 구축 / 개발
※ Dataset Check, EDA, Feature Engineering 이후 머신러닝(ML) 모델을 만들고, 예측하기
 → 지도학습, Sklearn

 

1. Model 생성 및 테스트 (ML, Randomforest)

  - RandomForestClassifier : 이진 분류 (Classifier 알고리즘)

  - Forest : Decision Tree를 랜덤하게 만들고, ensemble 시킨 형태

1.1. 필요한 라이브러리 선언

- 데이터분석과 머신러닝은 'Sklearn' 라이브러리를 반드시 숙지해야 한다.
- 학습하지 않은 Test set을 입력해도 성능도 확인!

 

from sklearn.ensemble import RandomForestClassifier
from sklearn import metrics
from sklearn.model_selection import train_test_split

1.2. Train / Test 분리

Train data를 학습하고 만들어진 모델로 바로 예측하면, 성능도가 일정하지 않을 수 있으므로 Train set을 다시 'Train'과 'Val' Set 으로 나누어서 학습하는 게 좋다

 

# Train dataset 나누기
X_train = df_train.drop('Survived', axis=1).values
target_label = df_train['Survived'].values
X_test = df_test.values

# Test size를 설정해서 Validation set으로 할당
# 'test_size = 0.3' : train set의 30%를 랜덤하게 validation으로 할당한다
X_tr, X_vld, y_tr, y_vld = train_test_split(X_train, target_label, test_size=0.3, random_state=2000)

1.3. 모델 생성 및 학습(fit)

- X_tr, y_tr : 모델 학습용 (랜덤하게 30% 비중으로 할당)
- X_vld : 학습된 모델에 예측하기
- y_vld : 예측한 값과 비교하여 모델의 성능도 확인

 

# 모델 생성 및 학습
model = RandomForestClassifier()
model.fit(X_tr, y_tr)

1.4. 예측(prediction) & 정답률

 

# 학습한 모델로 validation set 예측
prediction = model.predict(X_vld)

# 예측값 출력
prediction

 

>>

 

# 생존률 출력
print("총 {}명 중 {:.2f}% 정확도로 생존도 일치"
	.format(y_vld.shape[0], 100*metrics.accuracy_score(prediction, y_vld)))

>>

총 268명 중 80.22% 정확도로 생존도 일치

 

# 정답률(모델의 성능도) 출력
(prediction == y_vld).sum() / prediction.shape[0]

>>

0.8022388059701493

 

2. Feature importance & Prediction

- 모델의 성능에 어떤 Feature에 대해 가장 큰 영향을 받았는지 그 중요도(Importance)를 확인하는 과정
- 생성한 모델에 Train 데이터를 학습시키면 각 Feature에 대한 Importance를 가지게 된다.

2.1. Feature간 importance 확인 및 출력

- 먼저 feature importance를 Array로 출력해보고, 그래프로 출력해서 비교해보자
- 출력 그래프를 통해 해당 모델이 각 Feature별 중요도로 비교분석할 수 있다
아래 결과를 통해 Survived 예측하는 모델에는 Fare, Sex .. 등의 순으로 중요한 지표가 된다고 가설을 세울 수 있다.

 

model.feature_importances_

>>

 

# 필요한 Series import 
from pandas import Series

feature_importance = model.feature_importances_
Series_feat_imp = Series(feature_importance, index=df_test.columns)

# 그래프 출력
plt.figure(figsize=(8,8))
Series_feat_imp.sort_values(ascending=True).plot.barh()
plt.xlabel('Feature importance')
plt.ylabel('Feature')
plt.show()

>>

2.2. Prediction ( Test data )

 X_test 데이터를 선언한 모델에 넣어서 예측하고 이를 Submission 파일에 넣어주면 끝

 

# 만약, X_test 학습 시 ValueError 발생할 경우 NaN 값을 채워줘야 된다.
# Fare에서 NaN값이 있다는 가정 하에, Fare의 평균값을 넣어주는 작업
# df_test['Fare'].fillna(35.6, inplace=True)
# X_test = df_test.values

# 예측하기
prediction = model.predict(X_test)

 

3. Submission & 정답 디렉토리 저장

3.1. Submission 불러오기 & 예측값 넣어주기

위에서 예측한 'Survived' 값을 불러온 Submission 파일에 넣어주고 csv.파일로 생성 (과제 제출용)

 

# submission 파일 불러오기 - Gdrive에 저장된 경로
submission = pd.read_csv('/content/drive/MyDrive/Colab Notebooks/Titanic_file/submission.csv')

# submission 파일에 예측된 'Survived' 값 넣어주기
submission['Survived'] = prediction

 

# 정답파일에 예측값이 잘 삽입되었는지 검토
submission

>>

 

# csv파일로 변환 후, 특정 디렉토리에 저장하기
submission.to_csv('/content/drive/MyDrive/Colab Notebooks/Titanic_file/rf_submission.csv', index=False)

 

여기까지 Kaggle Titanic Machine Learnign from Disaster 기초 실습을 모두 마치고, 이후 한단계씩 심화된 모델을 공부하고 머신러닝 실습을 하는 것을 기록할 예정

 

댓글