前回は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だけでもやってどれくらい精度があがるか確認してみようと思います。