【Python-Streamlit, Docker】kaggle-タイタニックの機械学習Webアプリを実装する(その5)

前回までで、kaggleデータを取得して機械学習の訓練用データとテストデータを作成しました。今回は、そのデータを使用して簡単な分類学習を実施していき、その結果をStreamlitで表示していきます。

1. Streamlitとは

詳しくは、Streamlitで確認してみてください。

大まかな内容は

  • PythonコードのみでWebアプリを作成できる
  • HTML, CSS不要
  • 公式ドキュメントが充実しているので実装しやすい
  • Pythonコードで閉じるので、初心者でもわかりやすい

手頃にWebアプリを作成して、シェアしたいときなどには重宝しそうです。

それでは、実装していきましょう。

2. 環境構築(過去記事)

以下の本記事内容は、Docker環境で構築したAnacondaをベースに作成しています。予めご了承ください。

使用環境概要は以下となります。

  • ホストOS: Windows10 Pro
  • Docker image: ubuntu:18.04
  • Anaconda: Anaconda3-2020.07-Linux-x86_64
  • Python: Version 3.8.3 (64bit)

ファイルフォルダー構成は以下です。

.
|-- docker-compose.yml
`-- work
    |-- Dockerfile
    |-- requirements.txt
    `-- kaggle
        `-- taitanic
            |-- data
            |   |-- test.csv
            |   `-- train.csv
            |-- output
            `-- streamlit
                |-- main_streamlit.py
                |-- create_train_test.py
                |-- data_get.py
                |-- basic_ml.py
                `-- preprocessing.py

以下の本記事内容は、Docker環境で構築したAnacondaをベースに作成し、kaggleのタイタニックデータを使用しています。構築方法やデータ取得方法が不明な方は以下の記事をご参考ください。

datascience

3. 訓練データ作成に向けた処理コード(前回記事)

前回記事までで、訓練データをとテストデータを作成するための処理を記載しています。処理イメージを図1に示します。

図1 機械学習用訓練データと確認用データ作成フロー

コードは以下です。詳細は各記事をご参考ください。

""" main_streamlit.py """
import pandas as pd
import streamlit as st
import data_get as dg
import preprocessing as pr
import create_train_test as ct

st.title('Titanic - Machine Learning from Disaster')

""" data_get.pyの関数を読み込む """
st.subheader('(1) Data Sturucture')
""" 記事その1をご参照ください。"""
dg_Inst = dg.Data_Get()
alldata, test_raw = dg_Inst.read_data()

st.subheader('(2) Missing Value')
""" 記事その2をご参照ください。"""
st.write('Please coding your method for missing value')
alldata = dg_Inst.missing_value(alldata)

st.subheader('(3) Preprocessing')
st.write('Please coding your method for preprocessing')
alldata_sum = alldata.copy()
pp_Inst = pr.Preprocessing()
""" 記事その3をご参照ください。"""

st.subheader('(4) Create Train data')
ct_Inst = ct.Create_Train_Test()
alldata_sum = ct_Inst.label_encoder(alldata_sum)
alldata_sum = ct_Inst.dummy_df(alldata_sum)
train_feature, train_tagert, test_feature = ct_Inst.create_train_test(alldata_sum)
""" 記事その4をご参照ください。"""

if test_raw.shape[0] != test_feature.shape[0]:
    st.warning("Bad status of test_feature.Please check your preprocessing")
X_train, X_test, y_train, y_test = ct_Inst.split_train_test(train_feature, train_tagert)

訓練データをとテストデータを作成したら、機械学習モデルを作成していきます。

4. 機械学習モデルとStreamlitを実装する

それでは、機械学習モデルとStreamlitを実装します。

今回は、”RandomForest”, “Logistic”, “SVC”の分類器で

  1. 訓練データを用いて分類モデルを作成し、検証データにてそのモデルの精度を確かめる
  2. 作成モデルを用いて、テストデータの生存を予測し、その結果をcsvに出力する

をStreamlitに実装したいと思います。それでは以下のように”basic_ml.py”を作成して、①訓練データを用いて分類モデルを作成し、検証データにてそのモデルの精度を確かめていきます。

""" basic_ml.py """

import pandas as pd
import seaborn as sns; sns.set(font='DejaVu Sans')
import matplotlib.pyplot as plt
import streamlit as st
from sklearn.ensemble import RandomForestClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC

class Trial_ML():
    def rfc(self, X_train, y_train):
        rfc = RandomForestClassifier(random_state=0)
        rfc.fit(X_train, y_train)
        return rfc


    def lr(self, X_train, y_train):
        lr = LogisticRegression(random_state=0)
        lr.fit(X_train, y_train)
        return lr


    def svc(self, X_train, y_train):
        svc = SVC(random_state=0)
        svc.fit(X_train, y_train)
        return svc


    def base_ml(self, X_train, X_test, y_train, y_test):
        rfc = self.rfc(X_train, y_train)
        lr = self.lr(X_train, y_train)
        svc = self.svc(X_train, y_train)

        st.success('Finishied Machine learning')

        dic = {'train': [rfc.score(X_train, y_train), lr.score(X_train, y_train), svc.score(X_train, y_train)],
                'test': [rfc.score(X_test, y_test), lr.score(X_test, y_test), svc.score(X_test, y_test)]}
        index=['rfc', 'lr', 'svc']

        df_cls = pd.DataFrame(dic, index=index)
        fig, axes = plt.subplots(1, 2, figsize=(12, 5))
        sns.barplot(data=df_cls, x=index, y='train', ax = axes[0])
        axes[0].set_ylim([0.7, 1])
        axes[0].set_xlabel('Classifier')
        axes[0].set_ylabel('Accuracy')
        axes[0].set_title('Train')
        sns.barplot(data=df_cls, x=index, y='test', ax = axes[1])
        axes[1].set_ylim([0.7, 1])
        axes[1].set_xlabel('Classifier')
        axes[1].set_ylabel('Accuracy')
        axes[1].set_title('Test')
        fig.tight_layout()
        st.pyplot(fig)

        return rfc, lr, svc

このコードは。それぞれの分類器に訓練データを用いて、学習モデルを作成します。その後に、検証用データを用いて、学習モデルの精度を確かめます。

また、機械学習が終了したら、学習が完了したことを知らせるコメントを下記のコードで出しています。

        st.success('Finishied Machine learning')

また、以下のコードで、訓練データ使用時と、検証用データ使用時の生存結果の精度をグラフで表示しています。

        dic = {'train': [rfc.score(X_train, y_train), lr.score(X_train, y_train), svc.score(X_train, y_train)],
                'test': [rfc.score(X_test, y_test), lr.score(X_test, y_test), svc.score(X_test, y_test)]}
        index=['rfc', 'lr', 'svc']

        df_cls = pd.DataFrame(dic, index=index)
        fig, axes = plt.subplots(1, 2, figsize=(12, 5))
        sns.barplot(data=df_cls, x=index, y='train', ax = axes[0])
        axes[0].set_ylim([0.7, 1])
        axes[0].set_xlabel('Classifier')
        axes[0].set_ylabel('Accuracy')
        axes[0].set_title('Train')
        sns.barplot(data=df_cls, x=index, y='test', ax = axes[1])
        axes[1].set_ylim([0.7, 1])
        axes[1].set_xlabel('Classifier')
        axes[1].set_ylabel('Accuracy')
        axes[1].set_title('Test')
        fig.tight_layout()
        st.pyplot(fig)

続いて、”streamlit_main.py”にコードを追記していきます。

""" main_streamlit.py """
import pandas as pd
import streamlit as st
import data_get as dg
import preprocessing as pr
import create_train_test as ct
import basic_ml as bm

st.title('Titanic - Machine Learning from Disaster')

""" data_get.pyの関数を読み込む"""
st.subheader('(1) Data Sturucture')
""" 記事その1をご参照ください。"""
dg_Inst = dg.Data_Get()
alldata, test_raw = dg_Inst.read_data()

st.subheader('(2) Missing Value')
""" 記事その2をご参照ください。"""
st.write('Please coding your method for missing value')
alldata = dg_Inst.missing_value(alldata)

st.subheader('(3) Preprocessing')
st.write('Please coding your method for preprocessing')
alldata_sum = alldata.copy()
pp_Inst = pr.Preprocessing()
""" 記事その3をご参照ください。"""

st.subheader('(4) Create Train data')
ct_Inst = ct.Create_Train_Test()
alldata_sum = ct_Inst.label_encoder(alldata_sum)
alldata_sum = ct_Inst.dummy_df(alldata_sum)
train_feature, train_tagert, test_feature = ct_Inst.create_train_test(alldata_sum)

if test_raw.shape[0] != test_feature.shape[0]:
    st.warning("Bad status of test_feature.Please check your preprocessing")
X_train, X_test, y_train, y_test = ct_Inst.split_train_test(train_feature, train_tagert)

""" 以下を追記 """
file_output = st.sidebar.radio(
            'Do you want to output cvs file for each ML?"',
            ['No', 'Yes']
            )
output_name = st.sidebar.text_input(
            “Please enter output name”,
            value='001',
            max_chars=100
            )
analysis = st.sidebar.button('Analyze',)

if analysis:
    bm_Inst = bm.Trial_ML()
    st.subheader('(5) Machine Learning(Basic)')
    rfc, xgb, lgb, lr, svc = bm_Inst.base_ml(X_train, X_test, y_train, y_test)

    if file_output == 'Yes':
        bm_Inst.output_file(output_name, rfc, xgb, lgb, lr, svc)

Streamlitの説明を少し加えると、以下のコードで、出力csvを作成するかどうかを確認し、そのファイル名をText_inputで指定します。

Analyzeボタンを押すと、訓練データを用いた機会学習が開始され、検証データによる生存の精度確認のグラフおよびcsvファイルが作成されます。

file_output = st.sidebar.radio(
            'Do you want to output cvs file for each ML?"',
            ['No', 'Yes']
            )
output_name = st.sidebar.text_input(
            Please enter output name,
            value='001',
            max_chars=100
            )
analysis = st.sidebar.button('Analyze',)

if analysis:
""" analysis == True の場合、以下のコードが実行される """

main_streamlit.pyが書けましたら、ターミナルでmain_streamlit.pyのあるディレクトリに移動して以下のコマンドを実行して、streamlitを起動しましょう。

$ streamlit run main_streamlit.py

そうすると、通常通りであれば”localhost:8501″に以下のような画面が表示されると思います。

図2 Streamlit画面

予測結果のCSVファイルを出力したのであれば、”Do you want to output cvs file?”のTesニチェエクしましょう。今回は”No”にしておきます。

それでは、”Analyze”ボタンを押してみましょう。そうすると、以下のように機械学習の結果が表示されると思います。

図3 Streamlitで機械学習結果を表示

この結果から、どの学習結果を反映すると予測結果の精度が高いかを判定するのに役立ちますね!

5. サンプルコードとまとめ

サンプルコードはGithub上にアップしています。タイタニックデータはkaggle登録後、各自で入手してください。

https://github.com/Baran-Gizagiza/Streamlit-Titanic-Machine-Learning-from-Disaster

今回は、訓練データと、テストデータを用いて機械学習を実施して、予測結果を出力するWebアプリをStreamlitで実装してみました。

余力があれば、次回は本コードをAWS上にデプロイする方法をまとめたいと思います

それではよいpython-streamlit ライフを!

以下、関連記事となります。合わせてお読みいただけるお幸いです。

datascience

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

ABOUT US

Baran-gizagiza
経歴:浪人→理系大学院卒業→大手製造業に就職(技術職)→アメリカ赴任中 仕事は、研究・設計など上流工程の仕事に携わっています。企業勤務を継続しながら、新しいことにチャレンジしたいと思い、ブログを下記はじめました。 このブログでは、趣味である 筋トレ(健康、ダイエット) AIとデータ(高校数学、プログラミング) 読書(主に自己啓発系) を中心に、人生経験やおすすめ情報の発信しています。