【PyCaret1.0】앙상블 학습(블렌딩)의 Fold수를 조정하는 것만으로 Titanic 적당히 좋은 스코어(0.80382)

데이터 분석을 공부 중입니다. 그런 가운데, PyCaret 가 매우 사용하기 쉽고 감동하고 있습니다.
최근에는 튜토리얼을 바라보면서, 이하를 사경해 Github 에 올리기도 했습니다.
・클래스 분류
・회귀 분석
· · 클러스터링
· 이상 검출 (교사 없음 학습)
· 자연 언어 처리
・상관 룰 마이닝

표제의 건



Titanic에서 PyCaret의 앙상블 학습을 실시해 Fold수 조정으로, 적당한 스코어(0.80382)가 나왔기 때문에 메모.
앙상블 학습 굉장하다고 말하는 것보다는, 짧게 쓸 수 있고 PyCaret 굉장하다. 라는 이야기입니다.

분석의 초반은, 안이하게 앙상블 학습에 손을 대지 않고, EDA나 특징량 엔지니어링을 확실히 하는 것이 중요하다고 생각하기 때문에, 정말로 메모 정도의 이야기입니다.

Notebook



이번 구현의 Notebook은, Kaggle의 이하 페이지에서 공개하고 있습니다.
htps //w w. 꺄gぇ. 코 m / 카즈 히토 00 / py 카레 tb ぇ d ㄴ

구현의 간략한 설명


!pip install pycaret 

→ pip에서 PyCaret를 설치하고 있습니다. 이때는 최신 안정판(1.0.0)을 인스톨하고 있습니다.
import os
import random

import numpy as np
import pandas as pd

→ PyCaret 이외의 가져오기 문입니다.
def random_seed_initialize(seed=42):
    random.seed(seed)
    os.environ['PYTHONHASHSEED'] = str(seed)
    np.random.seed(seed)

→난수 시드의 초기화용 함수입니다(PyCaret 이외)
random_seed_initialize()

→난수 시드의 초기화입니다.
train_data = pd.read_csv('../input/titanic/train.csv')
test_data  = pd.read_csv('../input/titanic/test.csv')
submission_data = pd.read_csv('../input/titanic/gender_submission.csv')

→Titanic의 학습 데이터/훈련 데이터/제출용 병아리의 로드입니다.
from pycaret.classification import *

→PyCaret의 클래스 분류용의 임포트문입니다.
exp = setup(data=train_data, target='Survived', 
            ignore_features = ['PassengerId', 'Name'], session_id=42) 

→ 학습용 데이터의 PyCaret용 설정입니다.
목적 변수는 'Survived', Titanic의 설명 변수는 다수의 논의와 검증이 이루어지고 있습니다만,
일단 'PassengerId'와 'Name'을 무시하도록 설정하고 있습니다.
또한 session_id를 지정하여 PyCaret 내의 난수 시드를 고정하고 있습니다.
fold_start_number = 2
fold_end_number = 30 + 1
except_count = 0

for i in range(fold_start_number, fold_end_number, 1):
    try:
        blend_models(fold=i, verbose=False)
    except:
        except_count += 1

save_experiment('TitanicBlendModelsExperiment')
experiment = load_experiment('TitanicBlendModelsExperiment')

→fold수를 2부터 30까지의 사이에 1씩으로 블렌딩을 실시하고 있습니다.
blend_models()가 모델을 지정하지 않으면 PyCaret에서 지원하는 모델
모두 사용하여 블렌딩을 실시합니다.
또한 나중에 확인하기 위해 실험 결과를 저장/로드하고 있습니다.
accuracy = []
best_fold_number = 0
best_accuracy = 0
best_model = None

for i in range(fold_end_number - fold_start_number - except_count, 0, -1):
    fold_num = len(experiment[-i*2+1]['Accuracy']) - 2
    accuracy_mean = experiment[-i*2+1]['Accuracy']['Mean']
    model = experiment[-i*2]

    if best_accuracy < accuracy_mean:
        best_fold_number = fold_num
        best_accuracy = accuracy_mean
        best_model = model

    accuracy.append([fold_num, accuracy_mean])

print('best fold number:' + str(best_fold_number))
print('best accuracy:' + str(best_accuracy))

→ 실험 결과를 보유한 변수 experiment에서 Accuracy 평균값을 확인하고,
  제일 높은 수치의 accuracy 평균치의 모델을 취득하고 있습니다.
덧붙여서 Kaggle Notebook에서의 실행 결과는,
"best fold number:25""best accuracy:0.8521"이었습니다.
import matplotlib.pyplot as plt
import seaborn as sns

plt.figure(figsize=(15, 7))
plt.xticks(np.arange(2, 30 + 1, 1))
plt.yticks(np.arange(0.82, 0.86, 0.001))
sns.lineplot(x="fold number", y="accuracy(mean)", data=pd.DataFrame(accuracy, columns=['fold number', 'accuracy(mean)']))

→fold수의 차이에 의한 Accuracy평균치를 꺾은선 그래프로 확인하고 있습니다.

predictions = predict_model(best_model, data=test_data)
predictions.head()

→ 테스트 데이터에 대해 추론을 수행하고 있습니다.
submission_data['Survived'] = round(predictions['Label']).astype(int)
submission_data.to_csv('submission.csv',index=False)
submission_data.head()

→추론 결과를 제출용 파일에 기입하고 있습니다.
이것을 제출하면 0.80382 점수였습니다.

이상.

좋은 웹페이지 즐겨찾기