データサイエンス機械学習

Python×Streamlit Cloudで機械学習Webアプリを作って公開する方法|GitHub & Streamlit Cloud活用ガイド

Python×Streamlit Cloudで機械学習Webアプリを作って公開する方法 データサイエンス

はじめに

ローカルでStreamlitアプリを動かしたことはありますか?

例えば、研究データの可視化アプリ簡易予測モデルのデモを作るときに便利ですよね。

でも、こんなことを思ったことはありませんか?

  • チームや研究室のメンバーにも使ってもらいたい
  • 学会発表のときに簡単に動かせる形にしたい
  • 他のPCでも同じ環境を作るのが面倒…

そんなときに便利なのが、Streamlit Cloudです。

Streamlit Cloudを使うと、

✅ ローカルで動いていたアプリをそのままWebで公開できる
✅ URLを送るだけで誰でもブラウザから使える
✅ 無料プランでも軽量アプリなら十分

この記事では、StreamlitアプリをWeb公開するまでの全体の流れを、初心者向けにわかりやすく解説します。streamlitを使用するとフロントエンドの知識なしにwebアプリを作成できるため、これからwebアプリ作成を学びたいという方にもおすすめです。

streamlit cloudのローカルアプリ作成についてはこちらの記事でも紹介しています。
tkinterとstreamlitの比較をしています。メニューから「Streamlitで予測モデルアプリを作ってみよう!」を選びご覧ください。

なおこの記事は2025年7月25日現在の情報をもとに作成されています。githubやstreamlit cloud、その他ライブラリの更新で記事と操作が変わる可能性があります。


ローカル版とWeb公開版の違い

まず、ローカル環境とWeb公開の違いを整理してみましょう。

ローカル版(自分のPCだけ)Web公開版(Streamlit Cloud)
動く場所自分のPCインターネット上のサーバー
使える人自分だけURLを知っている誰でも
必要なセットアップPythonとStreamlitGitHubアカウント + Streamlit Cloud
メリット簡単・自由度高い共有が簡単・環境依存しない

ローカルでは streamlit run app.py で簡単に起動できますが、他の人に使ってもらうにはWeb公開が必要です。


ツールの役割と関係性

Web公開には、ツールとしてGit・GitHub・Streamlit Cloud の3つが登場します。

それぞれ何をするの?

  • Git(ローカルマシンにインストール)
    → ローカルのファイルの履歴管理や、GitHubにアップロードするためのツール
  • GitHub(アカウントが無い方はアカウント作成)
    → ソースコードをクラウド上に保存するサービス
    → Streamlit CloudはGitHubのファイルを読み取ってWebアプリ化する
  • Streamlit Cloud(githubアカウントで使用可)
    → GitHubに置いたアプリをWebサーバーとして動かすサービス

公開に必要なもの

Web公開するには以下が必要です。

ローカルで動作するStreamlitアプリ(lightgbm_app.pyなど)
requirements.txt(必要なライブラリの一覧)
Git(ローカルとGitHubを繋ぐツール)
GitHubアカウント(ソースコードを置く場所)
Streamlit Cloudアカウント(Webに公開するサービス)


公開までの手順

1️⃣ ローカルでアプリを作る
2️⃣ GitHubにアップロードする
3️⃣ Streamlit Cloudからデプロイする


ローカルでアプリを作る

例えば、LightGBMのモデルのアプリを作成しました。

import streamlit as st
import pandas as pd
import pickle
import numpy as np
from sklearn.model_selection import train_test_split
import lightgbm as lgb
from sklearn.metrics import mean_squared_error

# === 既存モデルの読み込み ===
@st.cache_resource
def load_model(path="models/best_model.pkl"):
try:
with open(path, "rb") as f:
model = pickle.load(f)
return model
except FileNotFoundError:
st.warning("既存のモデルが見つかりません。新しいモデルを学習してください。")
return None

model = load_model()

st.title("回帰予測アプリ - FIMアウト予測")

# === モデル再学習機能 ===
st.header("モデル学習・保存")

uploaded_train_file = st.file_uploader("学習用CSVをアップロード", type=["csv"])
if uploaded_train_file is not None:
train_df = pd.read_csv(uploaded_train_file)
st.dataframe(train_df.head())

target_column = st.selectbox("ターゲット変数", train_df.columns)
feature_columns = st.multiselect("特徴量", )

if st.button("モデルを学習して保存"):
if target_column and feature_columns:
X = train_df[feature_columns]
y = train_df[target_column]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

new_model = lgb.LGBMRegressor(random_state=42)
new_model.fit(X_train, y_train)

y_pred = new_model.predict(X_test)
rmse = np.sqrt(mean_squared_error(y_test, y_pred))
st.write(f"学習完了!RMSE: {rmse:.2f}")

model_save_path = "models/new_trained_model.pkl"
with open(model_save_path, "wb") as f:
pickle.dump(new_model, f)
st.success(f"新しいモデルを {model_save_path} に保存しました")

model = new_model # すぐ予測に反映
else:
st.warning("ターゲット変数と特徴量を選んでください")

st.markdown("---")

# === 予測機能 ===
st.header("回帰予測")
input_type = st.radio("入力方法", ("手入力", "CSVアップロード"))

if input_type == "手入力":
fim_in = st.number_input("FIM入院時点", 0, 126, 60)
age = st.number_input("年齢", 0, 120, 80)
mmse = st.number_input("MMSE", 0, 30, 20)
paralysis = st.selectbox("麻痺の種類", [0,1,2,3,4])

input_df = pd.DataFrame([{
"fim_in": fim_in,
"age": age,
"mmse": mmse,
"paralysis": paralysis
}])
else:
uploaded_file = st.file_uploader("予測用CSVをアップロード", type=["csv"])
input_df = pd.read_csv(uploaded_file) if uploaded_file else None

if input_df is not None and st.button("予測実行"):
if model is not None:
expected_features = ["fim_in", "age", "mmse", "paralysis"]
if not all(f in input_df.columns for f in expected_features):
st.error(f"必要な特徴量 {', '.join(expected_features)} が足りません")
else:
preds = model.predict(input_df[expected_features])
input_df["予測FIMアウト"] = preds
st.dataframe(input_df)
else:
st.warning("モデルがロードされていません。学習してください。")

ローカルでは

streamlit run app.py

で動作確認をしておきましょう。

実行するとこうなります。


ステップ2:GitHubにアップロードする

Streamlit Cloudは、GitHubにあるコードを読み取ってWebアプリ化します。
なので、まずローカルのアプリをGitHubにアップロードします。


1. Gitインストール & 確認

👉 https://git-scm.com/downloads
インストール後、以下で確認します:

git --version

以下のようなサイトが開きます。対応するOSを選び、ご自身のパソコンにあったものをインストールしてください。

例えばWINDOWSを選ぶと以下のような画面に進みます。64bitのwindowsのパソコンであれば、Standalone Installer のx64のものを選ぶといいでしょう。


2. GitHubアカウント作成

👉 https://github.com/ で無料アカウント作成
GitHubのダッシュボードでは、**Repositories(リポジトリ一覧)**から新規作成

丈夫メニュー画面の「+」マークからNew repositoryを選びましょう。

メニューを選択したら以下のような画面に移動します。
Repository nameにリポジトリの名前を入力します。
Descriptionには自分が分かりやすい説明を付けておきましょう。
他の項目も必要に応じて設定します。

Create repositoryボタンを押すとリポジトリが作成されます。

3. ローカル→GitHubへアップロードするコマンド

Streamlitアプリのフォルダ(例:lightgbm-app)に移動して、以下のコマンドを順番に実行します。

cd lightgbm-app  # ローカルPC上で、Streamlitアプリのフォルダ(lightgbm-app)に移動します。

git init #
このフォルダをgitの管理対象にします

git add . # フォルダ内のすべてのファイルを「Gitに登録する対象」として追加。


git commit -m "Initial commit" # 今のファイル状態をスナップショットとして記録します。


git branch -M main # ブランチ名を main に統一します。


git remote add origin https://github.com/あなたのユーザー名/lightgbm-streamlit-app.git
# 🔗 ローカルのフォルダと、GitHub上のリポジトリをリンクします。

git push -u origin main # ローカルのファイル履歴をGitHubにアップロードします。

💡 詰まりやすいポイント

  • GitHubの認証で**Personal Access Token(PAT)**が必要な場合があります
  • PATはGitHubの Settings → Developer settings → Personal Access Tokens から発行

もしPATが必要になったら以下のメニューから作成してください。トークンは一度表示されると再表示はされないため、必ずコピーを控えるようにしましょう。
setting → Developper setting → Personal access tokens → Tokens(classic) → アカウントのパスワード入力 → トークン設定後 Generate token


4. GitHubダッシュボードで確認

ブラウザでGitHubのリポジトリを開き、ローカルと同じ構成でフォルダ・ファイルがアップされていることを確認します。


ステップ3:Streamlit Cloudでデプロイ


1. Streamlit Cloudアカウント作成

👉 https://share.streamlit.io/
GitHubアカウントでログインします。


2. 新しいアプリを作成

ログインするとページ右上に以下のようなボタンがあります。これ押すとアプリ作成メニューに移動します。

以下のメニューからDeploty a public app from GitHubを選択します。

すると次のようなアプリ公開のための設定画面が開きます。

  • Repositoryユーザー名/lightgbm-streamlit-appなど
  • Branchmain
  • Main file pathapp.py
  • Deploy ボタンを押すだけ!

数分後、
https://xxxx.streamlit.app
というURLが発行され、アプリが利用可能になります。


完成!Webアプリを公開

これで、ローカルPCで動かしていたアプリが誰でもアクセスできるWebアプリになりました🎉

📸 ここにキャプチャ
実際にStreamlit Cloudで動いているアプリ画面


Streamlit Cloudの制約・注意点

  • 💡 Streamlit Cloud無料プランの制約
  • メモリ制限(モデルやデータが大きいと動かない)
  • CPU制限
  • ストレージ制限
  • 一定時間アクセスがないとスリープする
  • 計算が重いモデルは落ちる可能性あり
  • 同時接続数制限
             ・・・・・・・・・・等があります。

    詳細はこちらをご覧ください
    streamlit community cloud/manage your app:App resources and limits

詰まりやすいポイントと対処法

  • requirements.txtを忘れるとエラーになる
  • Branchがmainかmasterか分からなくなる → git branch -M mainで統一
  • GitHubのPATが必要になる場合あり → 設定から発行

まとめ

  • ローカル→GitHub→Streamlit Cloud の流れを理解すれば簡単
  • チームや研究室でアプリを共有するのに便利
  • ただし無料プランには制約があるので用途に注意

コメント

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