View
지난 글에 이어서 작성합니다.
pycaret에서 제공하는 기본 시각화 기능을 살펴보고, 최종 예측을 해보겠습니다.
3. 시각화
3-1. ROC 곡선과 AUC
#둘 다 같은 의미의 코드
plot_model(model_cat)
#plot_model(estimator = model_cat, plot = 'auc')
3-2. 오차 행렬
plot_model(estimator = model_cat, plot = 'confusion_matrix')
3-3. Feature Importance
plot_model(estimator = model_cat, plot = 'feature')
4. 최종 예측
4-1. 테스트 데이터셋 불러오기
캐글에서 제공하는 타이타닉 데이터는 train과 test 두개로 나뉘어져 있습니다.
test 파일이 train셋과 똑같은 형식을 갖도록 전처리에 썼던 코드를 다시 실행해줍니다.
이번에는 편의상 모든 전처리 코드를 한 블록에 담았습니다.
#불러오기
test= pd.read_csv(r'./test.csv')
#필요없는 속성을 지운다. Ticket과 PassengerId는 삭제한다.
test.drop(['Ticket', 'PassengerId'], axis=1, inplace=True)
#성별 속성의 값을 male = 0, female = 1 로 수정한다.
gender_mapper = {'male': 0, 'female': 1}
test['Sex'].replace(gender_mapper, inplace=True)
#승객 이름에 지위, 직업, 명칭 등 특별한 정보가 붙는지 확인한다.
test['Title'] = test['Name'].apply(lambda x: x.split(',')[1].strip().split(' ')[0])
test['Title'] = [0 if x in ['Mr.', 'Miss.', 'Mrs.'] else 1 for x in test['Title']]
test = test.rename(columns={'Title': 'Title_Unusual'})
test.drop('Name', axis=1, inplace=True)
#선실의 정보도 새로운 속성에 저장한다.
test['Cabin_Known'] = [0 if str(x) == 'nan' else 1 for x in test['Cabin']]
test.drop('Cabin', axis=1, inplace=True)
#승선지에 관한 가변수 생성 - dummy variables
emb_dummies = pd.get_dummies(test['Embarked'], drop_first=True, prefix='Embarked')
test = pd.concat([test, emb_dummies], axis=1)
test.drop('Embarked', axis=1, inplace=True)
#비어있는 나이 값은 평균으로 채운다.
test['Age'] = test['Age'].fillna(int(test['Age'].mean()))
test.head() #확인
4-2. finalize_model(), predict_model()
예측하기 전에, setup()으로 생성했던 모델에는 학습에 사용되지 않는 데이터가 일부 존재합니다.
이 데이터들은 과소적합을 확인하기 위해 별도로 사용된다고 합니다.
그렇기에, 모든 데이터셋으로 학습한 최종모델을 만드는 과정이 필요합니다.
모델을 확정한다고 보면 될 것 같습니다.
참고: https://pycaret.org/finalize-model/
#Finalize model_cat
cat_final = finalize_model(model_cat)
#Predict - 최종모델로 예측 진행!
predict_cat = predict_model(cat_final, test)
4-3. 최종 예측값 확인
predict_model()로 만들어진 데이터셋에서, Label이 최종 예측값입니다.
Label = 1인 경우가 생존입니다.
predict_cat.head()
5. 제출하기
캐글에서 요구하는 제출양식대로 csv 파일을 생성합니다.
[승객ID: 생존여부] 형식대로 맞추면 되겠습니다.
ID_list = pd.read_csv(r'./test.csv')['PassengerId']
predict_list = [predict_cat]
name = ['cat']
def submission_csv(predict_list, name):
for i in range(len(predict_list)):
submission = pd.DataFrame({
"PassengerId": ID_list,
"Survived": predict_list[i]['Label']
})
submission.to_csv('submission_'+name[i]+'.csv', index=False)
submission_csv(predict_list,name)
저는 추가적으로 다른 모델들도 함께 예측해서 최종결과가 여러개가 나왔기에
한번에 저장하기 쉽도록 코드를 짜서 조금 복잡해보이네요.
파일 하나만 생성할 때는 아래처럼 작성하면 됩니다.
submission = pd.DataFrame({
"PassengerId": pd.read_csv(r'./test.csv')['PassengerId'],
"Survived": predict_cat['Label']})
submission.to_csv('submission_cat'+'.csv', index=False)
이제 기념비적인 첫 제출!
리더보드를 쭉 내리다보면 순위가 나옵니다.
정확도는 약 78%인데 모델링할 때 나왔던 약 83%보다 낮은 값이네요.
타이타닉의 경우, 캐글에서 정확도가 80%를 넘으면 좋은 결과라고 합니다.
데이터 전처리와 EDA에 좀 더 신경쓰면 다른 결과가 나올지도 모르겠습니다.
기회가 되면 다시 도전해보는걸로!
'Data Science' 카테고리의 다른 글
[pandas] 옵션 수정, 생략 없이 출력하기 (0) | 2021.01.20 |
---|---|
[pandas] csv와 json이 혼합된 파일 형식 (0) | 2021.01.04 |
pycaret으로 타이타닉 생존자 예측 (1) (0) | 2020.12.22 |