自分のキャリアをあれこれ考えながら、Pythonで様々なデータを分析していくブログです

(その4-11) タイタニックの乗客の生存有無をAutoML(auto-sklearn)で予測してみた

Data Analytics
Data Analytics

前回はAutoGluonでモデルを作成した。

今回はauto-sklearnでモデルを作成しようと思います。


MacでAutoMLの環境をする方法は下記記事にまとめています。pipでインストールしているのがほとんどですので、Linuxでも同じようなコードでインストールできるかも知れません。

※ brew install しているのは yum や apt に置き換える必要はあります。

(MLJAR) Pythonで3つのAutoML環境を用意してみた

(AutoGluon) Pythonで3つのAutoML環境を用意してみた

(auto-sklearn) Pythonで3つのAutoML環境を用意してみた


スポンサーリンク

評価指標

タイタニックのデータセットは生存有無を正確に予測できた乗客の割合(Accuracy)を評価指標としています。

分析用データの準備

事前に欠損値処理や特徴量エンジニアリングを実施してデータをエクスポートしています。

本記事と同じ結果にするためには事前に下記記事を確認してデータを用意してください。

タイタニックのモデリング用データの作成まとめ
(その3-5) タイタニックのデータセットの変数選択にてモデリング用のデータを作成し、エクスポートするコードを記載していましたが分かりずらかったので簡略しまとめました。上から順に流していけばtitanic_train.csvとtitanic...

学習データと評価データの読み込み

import pandas as pd
import numpy as np
# タイタニックデータセットの学習用データと評価用データの読み込み
df_train = pd.read_csv("/Users/hinomaruc/Desktop/blog/dataset/titanic/titanic_train.csv")
df_eval = pd.read_csv("/Users/hinomaruc/Desktop/blog/dataset/titanic/titanic_eval.csv")

概要確認

# 概要確認
df_train.info()
Out[0]

    RangeIndex: 891 entries, 0 to 890
    Data columns (total 22 columns):
     #   Column         Non-Null Count  Dtype
    ---  ------         --------------  -----
     0   PassengerId    891 non-null    int64
     1   Survived       891 non-null    int64
     2   Pclass         891 non-null    int64
     3   Name           891 non-null    object
     4   Sex            891 non-null    object
     5   Age            891 non-null    float64
     6   SibSp          891 non-null    int64
     7   Parch          891 non-null    int64
     8   Ticket         891 non-null    object
     9   Fare           891 non-null    float64
     10  Cabin          204 non-null    object
     11  Embarked       891 non-null    object
     12  FamilyCnt      891 non-null    int64
     13  SameTicketCnt  891 non-null    int64
     14  Pclass_str_1   891 non-null    float64
     15  Pclass_str_2   891 non-null    float64
     16  Pclass_str_3   891 non-null    float64
     17  Sex_female     891 non-null    float64
     18  Sex_male       891 non-null    float64
     19  Embarked_C     891 non-null    float64
     20  Embarked_Q     891 non-null    float64
     21  Embarked_S     891 non-null    float64
    dtypes: float64(10), int64(7), object(5)
    memory usage: 153.3+ KB
# 概要確認
df_eval.info()
Out[0]

    RangeIndex: 418 entries, 0 to 417
    Data columns (total 21 columns):
     #   Column         Non-Null Count  Dtype
    ---  ------         --------------  -----
     0   PassengerId    418 non-null    int64
     1   Pclass         418 non-null    int64
     2   Name           418 non-null    object
     3   Sex            418 non-null    object
     4   Age            418 non-null    float64
     5   SibSp          418 non-null    int64
     6   Parch          418 non-null    int64
     7   Ticket         418 non-null    object
     8   Fare           418 non-null    float64
     9   Cabin          91 non-null     object
     10  Embarked       418 non-null    object
     11  Pclass_str_1   418 non-null    float64
     12  Pclass_str_2   418 non-null    float64
     13  Pclass_str_3   418 non-null    float64
     14  Sex_female     418 non-null    float64
     15  Sex_male       418 non-null    float64
     16  Embarked_C     418 non-null    float64
     17  Embarked_Q     418 non-null    float64
     18  Embarked_S     418 non-null    float64
     19  FamilyCnt      418 non-null    int64
     20  SameTicketCnt  418 non-null    int64
    dtypes: float64(10), int64(6), object(5)
    memory usage: 68.7+ KB

# 描画設定
import seaborn as sns
from matplotlib import ticker
import matplotlib.pyplot as plt
sns.set_style("whitegrid")
from matplotlib import rcParams
rcParams['font.family'] = 'Hiragino Sans' # Macの場合
#rcParams['font.family'] = 'Meiryo' # Windowsの場合
#rcParams['font.family'] = 'VL PGothic' # Linuxの場合
rcParams['xtick.labelsize'] = 12       # x軸のラベルのフォントサイズ
rcParams['ytick.labelsize'] = 12       # y軸のラベルのフォントサイズ
rcParams['axes.labelsize'] = 18        # ラベルのフォントとサイズ
rcParams['figure.figsize'] = 18,8      # 画像サイズの変更(inch)

モデリング用に学習用データを訓練データとテストデータに分割

# 訓練データとテストデータに分割する。
from sklearn.model_selection import train_test_split
x_train, x_test = train_test_split(df_train, test_size=0.20,random_state=100)

# 説明変数
FEATURE_COLS=[
   'Age'
 , 'Fare'
 , 'SameTicketCnt'
 , 'Pclass_str_1'
 , 'Pclass_str_3'
 , 'Sex_female'
 , 'Embarked_Q'
 , 'Embarked_S'
]

X_train = x_train[FEATURE_COLS] # 説明変数 (train)
Y_train = x_train["Survived"] # 目的変数 (train)
X_test = x_test[FEATURE_COLS] # 説明変数 (test)
Y_test = x_test["Survived"] # 目的変数 (test)
スポンサーリンク

auto-sklearn

# https://automl.github.io/auto-sklearn/master/
import autosklearn.classification
cls = autosklearn.classification.AutoSklearnClassifier()

モデル作成

# fitで学習させる
cls.fit(X_train, Y_train)
Out[0]
AutoSklearnClassifier(per_run_time_limit=360)

けっこう時間がかかったかと思います。

# 作成したモデルの一覧を表示します
cls.leaderboard()
Out[0]

rank ensemble_weight type cost duration
model_id
88 1 0.04 mlp 0.157447 1.905175
73 2 0.04 mlp 0.157447 2.705954
42 3 0.04 mlp 0.161702 2.242439
21 4 0.02 mlp 0.165957 1.839008
71 5 0.06 mlp 0.165957 2.901152
8 6 0.08 mlp 0.170213 2.014925
33 7 0.04 mlp 0.170213 2.461616
76 8 0.02 mlp 0.178723 1.790685
101 9 0.04 mlp 0.178723 4.062959
102 10 0.08 passive_aggressive 0.178723 1.436935
36 11 0.02 mlp 0.182979 2.726100
12 12 0.08 mlp 0.182979 5.028499
82 13 0.04 lda 0.182979 1.255173
87 14 0.04 mlp 0.182979 1.575488
96 15 0.04 mlp 0.182979 5.401730
64 16 0.02 mlp 0.191489 6.041023
66 17 0.02 mlp 0.191489 2.390336
35 18 0.04 mlp 0.195745 3.786695
67 19 0.02 qda 0.200000 1.426577
10 20 0.06 adaboost 0.200000 3.106476
54 21 0.02 qda 0.200000 1.539524
62 22 0.02 qda 0.200000 1.444135
61 23 0.04 mlp 0.204255 1.722485
28 24 0.08 extra_trees 0.204255 2.317047

精度確認

# Return the mean accuracy on the given data and labels.
from sklearn.metrics import accuracy_score
print("train",accuracy_score(Y_train, cls.predict(X_train)))
print("test" ,accuracy_score(Y_test, cls.predict(X_test)))
Out[0]

    train 0.8314606741573034
    test 0.8156424581005587

こちらも過学習は抑えられているようです。

import matplotlib.pyplot as plt
from sklearn.metrics import confusion_matrix

print(confusion_matrix(Y_test,cls.predict(X_test)))
Out[0]

[[93 11]
[22 53]]

Kaggleへ予測データをアップロード

df_eval["Survived"] = cls.predict(df_eval[FEATURE_COLS])
df_eval[["PassengerId","Survived"]].to_csv("titanic_submission.csv",index=False)
!/Users/hinomaruc/Desktop/blog/my-venv/bin/kaggle competitions submit -c titanic -f titanic_submission.csv -m "model #010. autosklearn"
Out[0]

100%|████████████████████████████████████████| 2.77k/2.77k [00:04<00:00, 608B/s]
Successfully submitted to Titanic - Machine Learning from Disaster

Kaggleでの精度確認の結果
0.78468
スポンサーリンク

まとめ

auto-sklearnの精度が0.78468でさらに暫定1位になりました。

てっきり1番精度がいいのはmljarだと思ったのですが、データセットによって得意不得意があるのかも知れません。

ここまでで一旦titanicの分析はお終いにしようと思います。本記事含めて、全20回という長いシリーズになりました 笑

ただ学習データをそのまま全て学習させてKaggleにアップするという作業はやっていないのでautomlだけでもやってどれくらい精度があがるか確認してみようと思います。

タイトルとURLをコピーしました