Skip to content

13. Web アプリケーション開発

本章では、これまでに作った機械学習モデルを Web アプリケーション として動かす方法を学びます。感情分析アプリに加えて、ChatGPT 風のチャットアプリも作ります。なお、機械学習 API の一般的な活用方法は付録Cに、Flask による Web アプリ・REST API の実装は付録Dにまとめています。

13.1 Web アプリケーションとは

13.1.1 Web アプリケーションの概要

Web アプリケーションとは、Web ブラウザを通じて利用できるアプリケーションのことです。ユーザは特別なソフトウェアをインストールすることなく、ブラウザさえあればどこからでもアプリケーションを利用できます。

Web アプリケーションの利点

  • アクセスの容易さ: ブラウザがあればどこからでもアクセス可能
  • クロスプラットフォーム: Windows、Mac、スマートフォンなど、環境を選ばない
  • 共有が簡単: URL を共有するだけで他の人も利用可能
  • メンテナンスが楽: サーバ側を更新すれば全ユーザに反映

13.1.2 機械学習モデルの Web アプリ化

機械学習モデルを Web アプリとして公開することで、以下のようなことが可能になります。

  • 実用的なサービス: モデルを実際のサービスとして提供
  • デモンストレーション: 研究成果やポートフォリオとして公開
  • API として提供: 他のシステムから利用可能

13.1.3 Python の Web フレームワーク

Python には、Web アプリケーションを構築するためのフレームワークがいくつか存在します。

フレームワーク 特徴 適用場面
Streamlit 簡単、素早くプロトタイプを作成 デモ、社内ツール
Flask 軽量、柔軟性が高い 小〜中規模の Web アプリ、API
FastAPI 高速、API 構築に特化 REST API、本格的なサービス
Django 多機能、大規模開発向け 大規模 Web アプリケーション

本章では、Streamlit を使った実装例を紹介します。Flask を使った Web アプリと REST API の実装は付録Dで扱います。

13.2 Streamlit による簡単な Web アプリ

13.2.1 Streamlit とは

Streamlit は、データサイエンス向けの Web アプリを簡単に作成できる Python ライブラリです。わずか数行のコードで、インタラクティブな Web アプリを構築できます。

Streamlit の特徴

  • 簡単: Python スクリプトを書くだけで Web アプリが作れる
  • 高速: プロトタイプを素早く作成できる
  • インタラクティブ: スライダ、ボタンなどの UI 部品が豊富
  • ホットリロード: コードを編集すると自動的に反映される

13.2.2 Streamlit のインストール

CHIKUWA Editor には Streamlit が標準でインストールされているため、そのまま使えます。自分で構築したローカル環境では、以下のコマンドでインストールします。

pip install streamlit

クラウドのノートブック環境について

本章は CHIKUWA Editor またはローカル環境での開発を想定しています。Google Colab などのクラウドのノートブック環境では、Web アプリの開発・実行に工夫が必要となります。

13.2.3 Streamlit の基本的な使い方

まず、簡単な Hello World アプリを作成してみましょう。

app.py
import streamlit as st

# タイトル
st.title("Hello, Streamlit!")

# テキスト
st.write("これは Streamlit で作った Web アプリです。")

# ボタン
if st.button("クリックしてください"):
    st.write("ボタンがクリックされました!")

# スライダー
value = st.slider("値を選択してください", 0, 100, 50)
st.write(f"選択された値: {value}")

CHIKUWA Editor では、通常のプログラムと同じように実行するだけでローカルサーバが立ち上がり、Web アプリが表示されます。その他の環境では、ターミナルで以下のコマンドを実行すると、ブラウザで Web アプリが開きます(通常は http://localhost:8501)。

streamlit run app.py

13.2.4 主要な Streamlit コンポーネント

Streamlit では、さまざまな UI コンポーネントを簡単に追加できます。

テキスト表示

st.title("タイトル")
st.header("ヘッダー")
st.subheader("サブヘッダー")
st.write("テキスト")
st.markdown("**太字** や *斜体* も使えます")

入力ウィジェット

# テキスト入力
text = st.text_input("テキストを入力してください")

# テキストエリア
long_text = st.text_area("長いテキストを入力してください")

# 数値入力
number = st.number_input("数値を入力してください", min_value=0, max_value=100)

# スライダー
value = st.slider("値を選択してください", 0, 100, 50)

# セレクトボックス
option = st.selectbox("選択してください", ["オプション1", "オプション2", "オプション3"])

# ボタン
if st.button("送信"):
    st.write("送信されました!")

データ表示

import pandas as pd

# DataFrame の表示
df = pd.DataFrame({
    "列1": [1, 2, 3],
    "列2": [4, 5, 6]
})
st.dataframe(df)

# テーブルの表示
st.table(df)

グラフ表示

import matplotlib.pyplot as plt

# Matplotlib のグラフ
fig, ax = plt.subplots()
ax.plot([1, 2, 3, 4], [1, 4, 2, 3])
st.pyplot(fig)

# 簡易グラフ
st.line_chart(df)
st.bar_chart(df)

公式ドキュメント: Streamlit API Reference

13.3 Streamlit で感情分析アプリを作る

13.3.1 アプリの概要

第 12 回で学んだ「ローカル LLM サーバ(LM Studio)+ ロジスティック回帰」の組み合わせで、テキストの感情分析を行う Web アプリを作成します。

機能

  • ユーザがテキストを入力
  • 「Positive(ポジティブ)」「Negative(ネガティブ)」を分類
  • 予測結果と確率を表示

全体構成

graph LR
    A[ブラウザ] -->|テキスト入力| B[Streamlit アプリ]
    B -->|HTTP POST<br/>/v1/embeddings| C[LM Studio サーバ<br/>bge-m3]
    C -->|1024 次元ベクトル| B
    B --> D[ロジスティック回帰<br/>事前学習済み]
    D --> B
    B -->|結果| A

    style A fill:#e6ccff
    style B fill:#ccffcc
    style C fill:#ffffcc
    style D fill:#ffcccc

13.3.2 分類器の準備と保存

まず、LM Studio サーバから得た Embedding を使って分類器(ロジスティック回帰)だけを学習・保存しておきます。Embedding を取るモデル自体(bge-m3)はサーバ側に常駐しているので保存不要です。

import requests
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
import pickle

LLM_URL = "https://xxxxxxxx.trycloudflare.com"  # 授業でアナウンスされる URL に置き換える
EMBED_MODEL = "text-embedding-bge-m3"

def encode(texts):
    if isinstance(texts, str):
        texts = [texts]
    r = requests.post(
        f"{LLM_URL}/v1/embeddings",
        json={"model": EMBED_MODEL, "input": texts},
    )
    return np.array([d["embedding"] for d in r.json()["data"]])


# データの読み込み
df = pd.read_csv('movie_reviews.csv')

# LM Studio でベクトル化(少し時間がかかります)
print("ベクトル化中...")
embeddings = encode(df['text'].tolist())

# ラベルを数値に変換
df['label_num'] = (df['label'] == 'positive').astype(int)

# 訓練データとテストデータに分割
X_train, X_test, y_train, y_test = train_test_split(
    embeddings, df['label_num'],
    test_size=0.2,
    random_state=42
)

# ロジスティック回帰で学習
clf = LogisticRegression(random_state=42, max_iter=1000)
clf.fit(X_train, y_train)

# 分類器のみ保存(Embedding モデルはサーバ側にあるので保存不要)
with open('sentiment_clf.pkl', 'wb') as f:
    pickle.dump(clf, f)

print("分類器を保存しました: sentiment_clf.pkl")

13.3.3 Streamlit アプリの実装

保存した分類器を読み込み、入力テキストを LM Studio でベクトル化 → 分類する Streamlit アプリを作ります。

sentiment_app.py
import streamlit as st
import requests
import numpy as np
import pickle

LLM_URL = "https://xxxxxxxx.trycloudflare.com"  # 授業でアナウンスされる URL に置き換える
EMBED_MODEL = "text-embedding-bge-m3"

# ページの設定
st.set_page_config(page_title="感情分析アプリ", page_icon="😊")

# タイトル
st.title("😊 感情分析アプリ")
st.write("テキストを入力すると、Positive(ポジティブ)か Negative(ネガティブ)かを判定します。")

# 分類器の読み込み(キャッシュを使って 1 回だけ読み込む)
@st.cache_resource
def load_classifier():
    with open('sentiment_clf.pkl', 'rb') as f:
        return pickle.load(f)

classifier = load_classifier()

# 1 文を LM Studio でベクトル化
def encode_one(text):
    r = requests.post(
        f"{LLM_URL}/v1/embeddings",
        json={"model": EMBED_MODEL, "input": text},
    )
    return np.array([r.json()["data"][0]["embedding"]])

# テキスト入力
text_input = st.text_area(
    "テキストを入力してください",
    height=150,
    placeholder="例:この映画は本当に面白かった!"
)

# 予測ボタン
if st.button("感情を分析"):
    if text_input.strip() == "":
        st.warning("テキストを入力してください。")
    else:
        with st.spinner("LM Studio サーバで解析中..."):
            embedding = encode_one(text_input)
            prediction = classifier.predict(embedding)[0]
            probability = classifier.predict_proba(embedding)[0]

        # 結果の表示
        st.subheader("分析結果")

        if prediction == 1:
            st.success("😊 Positive(ポジティブ)")
            st.progress(probability[1])
            st.write(f"確率: {probability[1]:.2%}")
        else:
            st.error("😞 Negative(ネガティブ)")
            st.progress(probability[0])
            st.write(f"確率: {probability[0]:.2%}")

        with st.expander("詳細情報を表示"):
            st.write(f"Positive の確率: {probability[1]:.2%}")
            st.write(f"Negative の確率: {probability[0]:.2%}")

# サイドバー
st.sidebar.header("ℹ️ このアプリについて")
st.sidebar.write("""
このアプリは、機械学習を使って日本語テキストの感情を分析します。

**使用技術**
- ローカル LLM サーバ(LM Studio + bge-m3)
- Logistic Regression
- Streamlit
""")

13.3.4 アプリの実行

アプリを実行します。CHIKUWA Editor 以外の環境では、ターミナルで以下のコマンドを実行します。

streamlit run sentiment_app.py

13.3.5 キャッシュの活用

@st.cache_resource デコレータを使うことで、モデルの読み込みを 1 回だけ実行し、結果をキャッシュできます。これにより、アプリの起動が高速になります。

@st.cache_resource
def load_models():
    # 時間のかかる処理(モデルの読み込みなど)
    return model

キャッシュの種類:

デコレータ 用途
@st.cache_resource モデル、DB 接続などのグローバルなリソース
@st.cache_data データの読み込みや変換処理

13.4 Streamlit でチャットアプリを作る

13.4.1 チャットモデルの呼び出し

第 12 回では、LM Studio サーバの Embedding API(/v1/embeddings)を使いました。同じサーバには日本語対応のチャットモデルも載っており、/v1/chat/completions エンドポイントを叩くと、ChatGPT のようなチャット形式の応答が得られます。

項目 内容
サーバ URL 授業でアナウンスされる URL(第 12 回と同じサーバ)
チャットモデル qwen/qwen3.5-9b(日本語に強い 9B モデル)
API エンドポイント POST /v1/chat/completions (OpenAI 互換)

まずは requests で 1 回だけ呼び出してみます。

import requests

LLM_URL = "https://xxxxxxxx.trycloudflare.com"  # 授業でアナウンスされる URL に置き換える
CHAT_MODEL = "qwen/qwen3.5-9b"

response = requests.post(
    f"{LLM_URL}/v1/chat/completions",
    json={
        "model": CHAT_MODEL,
        "messages": [
            {"role": "system", "content": "あなたは親切なアシスタントです。"},
            {"role": "user", "content": "機械学習とは何ですか?簡潔に説明してください。"},
        ],
        "stream": False,
    },
)

result = response.json()
print(result["choices"][0]["message"]["content"])

ポイントは messages です。role には次の 3 種類があり、「これまでのやり取り」をリストとしてまるごと渡すのが LLM API の共通パターンです。

role 意味
system モデルへの指示(人格・口調・ルールなど)
user ユーザの発言
assistant モデルの過去の応答

モデル自身は会話を覚えていないため、会話を続けるには、過去のやり取り(user と assistant)を messages に追記して毎回すべて送り直します。外部 API(OpenAI など)の使い方や JSON 形式での構造化出力など、チャット API のより詳しい話は付録Cを参照してください。

13.4.2 チャット UI と会話履歴

Streamlit にはチャット専用の UI 部品が用意されています。

  • st.chat_input: 画面下部に固定されるメッセージ入力欄
  • st.chat_message: 発言者アイコン付きの吹き出し表示

もう 1 つの鍵が 会話履歴の保持 です。Streamlit のスクリプトは、ボタンを押すなどの操作のたびに先頭から再実行されるため、普通の変数は毎回初期化されてしまいます。操作をまたいで残したいデータは st.session_state に保存します。

まずは LLM を使わない「オウム返し」で、この 3 つの部品の動きを確認してみましょう。

chat_ui_test.py
import streamlit as st

st.title("チャット UI の練習")

# 会話履歴の初期化(初回だけ実行される)
if "messages" not in st.session_state:
    st.session_state.messages = []

# 入力欄(Enter で送信)
prompt = st.chat_input("メッセージを入力してください")
if prompt:
    st.session_state.messages.append({"role": "user", "content": prompt})

# 履歴をすべて吹き出しで表示
for message in st.session_state.messages:
    with st.chat_message(message["role"]):
        st.write(message["content"])

メッセージを送るたびにスクリプト全体が再実行されますが、履歴は st.session_state.messages に残っているので、過去の発言が積み上がっていきます。

13.4.3 チャットアプリの実装

チャット UI と LM Studio のチャット API を組み合わせると、ChatGPT 風のアプリが完成します。

全体構成

graph LR
    A[ブラウザ] -->|メッセージ入力| B[Streamlit アプリ]
    B -->|POST /v1/chat/completions<br/>会話履歴全体| C[LM Studio サーバ<br/>qwen/qwen3.5-9b]
    C -->|応答テキスト| B
    B -->|履歴に追加して表示| A

    style A fill:#e6ccff
    style B fill:#ccffcc
    style C fill:#ffffcc
chat_app.py
import streamlit as st
import requests

LLM_URL = "https://xxxxxxxx.trycloudflare.com"  # 授業でアナウンスされる URL に置き換える
CHAT_MODEL = "qwen/qwen3.5-9b"
SYSTEM_PROMPT = "あなたは親切なアシスタントです。簡潔な日本語で回答してください。"

# ページの設定
st.set_page_config(page_title="チャットアプリ", page_icon="💬")
st.title("💬 チャットアプリ")

# 会話履歴の初期化(初回だけ実行される)
if "messages" not in st.session_state:
    st.session_state.messages = []

# これまでの会話履歴を表示
for message in st.session_state.messages:
    with st.chat_message(message["role"]):
        st.write(message["content"])

# ユーザの入力を受け取る
prompt = st.chat_input("メッセージを入力してください")
if prompt:
    # ユーザの発言を履歴に追加して表示
    st.session_state.messages.append({"role": "user", "content": prompt})
    with st.chat_message("user"):
        st.write(prompt)

    # システムプロンプト + 会話履歴全体を送って応答を取得
    with st.chat_message("assistant"):
        with st.spinner("考え中..."):
            response = requests.post(
                f"{LLM_URL}/v1/chat/completions",
                json={
                    "model": CHAT_MODEL,
                    "messages": [{"role": "system", "content": SYSTEM_PROMPT}]
                    + st.session_state.messages,
                    "stream": False,
                },
            )
            answer = response.json()["choices"][0]["message"]["content"]
        st.write(answer)

    # モデルの応答も履歴に追加
    st.session_state.messages.append({"role": "assistant", "content": answer})

13.4.4 アプリの実行

アプリを実行します。CHIKUWA Editor 以外の環境では、ターミナルで以下のコマンドを実行します。

streamlit run chat_app.py

「昨日の話の続きだけど」のように前の発言を踏まえた質問をしても文脈が通じるのは、毎回 st.session_state.messages の履歴全体を送っているからです。裏を返せば、会話が長くなるほど送信するデータ(トークン)も増えていきます。実用的なチャットアプリでは、古い履歴を要約したり切り捨てたりする工夫が入っています。

ストリーミング表示(発展)

ChatGPT のように応答を 1 文字ずつ表示するには、リクエストで "stream": True を指定し、少しずつ届く応答を st.write_stream で描画します。レスポンスの受け取り方が変わるため少し難しくなりますが、興味のある人は挑戦してみてください。

13.5 デプロイ(公開)の基礎

13.5.1 デプロイとは

デプロイ(Deploy)とは、作成したアプリケーションをインターネット上のサーバに配置し、誰でもアクセスできるようにすることです。

13.5.2 主要なデプロイ先

サービス 特徴 無料プラン
Streamlit Community Cloud Streamlit 専用、簡単 あり(制限付き)
Render Flask/FastAPI など幅広く対応 あり(制限付き)
Heroku 老舗、多機能 有料のみ
Google Cloud Run コンテナベース、スケーラブル 無料枠あり
AWS (EC2, Lambda) 柔軟性が高い、学習コストも高い 無料枠あり(1 年間)
自宅サーバ 自由度が最も高い サーバ費用が必要

13.5.3 Streamlit Community Cloud へのデプロイ

Streamlit アプリを最も簡単に公開する方法は、Streamlit Community Cloud を使うことです。

手順

  1. GitHub にコードをアップロード

    • リポジトリを作成
    • app.py、requirements.txt(必要なライブラリ)、モデルファイルをアップロード
  2. requirements.txt の作成

    requirements.txt
    streamlit
    requests
    numpy
    scikit-learn
    
  3. Streamlit Community Cloud に登録

  4. アプリをデプロイ

    • "New app" をクリック
    • GitHub リポジトリを選択
    • デプロイするファイル(app.py)を指定
    • "Deploy!" をクリック

数分でアプリが公開され、URL が発行されます。

13.5.4 注意点

モデルファイルのサイズ

  • 大きなモデルファイルは GitHub にアップロードできません(100MB 制限)
  • 対処法: モデルの軽量化 / Git LFS の使用 / クラウドストレージから読み込む

環境変数

  • API キーなどの秘密情報は、環境変数として設定する
  • Streamlit では st.secrets を使って安全に管理できる

バックエンドのサーバへの到達性

  • 本章のアプリは LM Studio サーバに依存しているため、デプロイ先からサーバに到達できる必要があります
  • trycloudflare の URL は毎回変わるため、公開運用では固定 URL のサーバや外部 API への差し替えが必要です

13.6 演習問題

演習 13-1: BMI 計算アプリ

演習 13-1(初級)

Streamlit の基本的な UI 部品だけを使って、BMI(体格指数)を計算する Web アプリを作成してください。

タスク

  1. st.number_input で身長(cm)と体重(kg)を入力できるようにする
  2. 「計算する」ボタンが押されたら BMI = 体重[kg] ÷ (身長[m])² を計算し、st.metric で表示する
  3. BMI が 18.5 未満なら「やせ型」、25 以上なら「肥満」、その間なら「標準」と表示する
テンプレートコード(bmi_app.py)
import streamlit as st

st.title("BMI 計算アプリ")

# 1. st.number_input で身長(cm)と体重(kg)の入力欄を作る

# 2. ボタンが押されたら BMI = 体重 ÷ (身長[m]) ** 2 を計算して st.metric で表示する

# 3. BMI の値に応じて「やせ型」「標準」「肥満」を表示する

演習 13-2: チャットアプリのキャラクタ切り替え

演習 13-2(中級)

13.4 節で作った chat_app.py を改造して、サイドバーでアシスタントのキャラクタ(システムプロンプト)を切り替えられるようにしてください。

タスク

  1. キャラクタ名 → システムプロンプトの辞書を定義する(例:標準アシスタント/関西弁/猫)
  2. st.sidebar の st.sidebar.selectbox でキャラクタを選べるようにする
  3. キャラクタが変更されたら会話履歴(st.session_state.messages)をリセットする
  4. 選択中のキャラクタのシステムプロンプトを使って応答させ、口調が変わることを確認する
テンプレートコード(chat_app2.py)
import streamlit as st
import requests

LLM_URL = "https://xxxxxxxx.trycloudflare.com"  # 授業でアナウンスされる URL に置き換える
CHAT_MODEL = "qwen/qwen3.5-9b"

# 1. キャラクタごとのシステムプロンプトを辞書で定義する
CHARACTERS = {
    "標準アシスタント": "あなたは親切なアシスタントです。簡潔な日本語で回答してください。",
    # ここにキャラクタを追加する
}

st.set_page_config(page_title="チャットアプリ", page_icon="💬")
st.title("💬 チャットアプリ")

# 2. サイドバーの selectbox でキャラクタを選択できるようにする

# 3. キャラクタが変わったら会話履歴をリセットする

# 4. 以降は chat_app.py と同じ(システムプロンプトだけ選択中のものを使う)

演習 13-3: 感情分析アプリ + 履歴機能

演習 13-3(中級)

13.3 節で作った感情分析アプリに、判定結果の履歴機能を追加してください。

タスク

  1. st.session_state に判定履歴のリストを初期化する
  2. 「感情を分析」ボタンで判定するたびに、テキスト・判定結果・Positive 確率を履歴に追加する
  3. 履歴を st.dataframe で一覧表示する
  4. 「履歴をクリア」ボタンで履歴を空にできるようにする
テンプレートコード(sentiment_app2.py)
import streamlit as st
import requests
import numpy as np
import pandas as pd
import pickle

LLM_URL = "https://xxxxxxxx.trycloudflare.com"  # 授業でアナウンスされる URL に置き換える
EMBED_MODEL = "text-embedding-bge-m3"

st.title("😊 感情分析アプリ(履歴付き)")

# 分類器の読み込み(13.3 節で保存した sentiment_clf.pkl を使う)
@st.cache_resource
def load_classifier():
    with open('sentiment_clf.pkl', 'rb') as f:
        return pickle.load(f)

classifier = load_classifier()

# 1 文を LM Studio でベクトル化
def encode_one(text):
    r = requests.post(
        f"{LLM_URL}/v1/embeddings",
        json={"model": EMBED_MODEL, "input": text},
    )
    return np.array([r.json()["data"][0]["embedding"]])

# 1. st.session_state に判定履歴のリストを初期化する

text_input = st.text_area("テキストを入力してください", height=100)

if st.button("感情を分析"):
    # 2. ベクトル化 → 予測して結果を表示し、履歴に追加する(13.3 と同じ要領)
    pass

# 3. 履歴があれば st.dataframe で一覧表示する

# 4. 「履歴をクリア」ボタンを付ける

13.7 まとめ

本章では、機械学習モデルを Web アプリケーションとして展開する方法について学びました。

第 13 回のまとめ

Web アプリケーション

  • ブラウザさえあれば利用でき、URL の共有だけで他の人にも使ってもらえる
  • 機械学習モデルのデモ・サービス化の手段として有効
  • Python では Streamlit / Flask / FastAPI / Django などのフレームワークを使う
  • Flask による Web アプリ・REST API の実装は付録Dで扱う

Streamlit

  • Python スクリプトを書くだけで Web アプリが作れる
  • st.text_input(), st.button(), st.write() などの UI 部品
  • @st.cache_resource で分類器などのリソースをキャッシュ
  • st.session_state で再実行をまたいでデータを保持(会話履歴・判定履歴)
  • LM Studio サーバをバックエンドにすれば、重いモデルをアプリ側に持たなくて良い

チャットアプリ

  • 第 12 回と同じサーバのチャットモデル(qwen/qwen3.5-9b)を /v1/chat/completions で呼び出す
  • messages に system / user / assistant の役割でやり取りを入れるのが LLM API の共通パターン
  • モデルは会話を覚えていないので、履歴全体を毎回送り直す

デプロイ

  • アプリをインターネット上に公開
  • Streamlit Community Cloud:Streamlit アプリを簡単に公開
  • Render, Google Cloud Run など様々な選択肢
  • ローカル LLM サーバ前提のアプリは、サーバへの到達性を確保する設計が必要

実装のポイント

  • 分類器を pickle で保存・読み込み(Embedding モデルはサーバ側に常駐)
  • キャッシュを活用して高速化
  • エラーハンドリングを適切に行う
  • 環境変数で秘密情報・サーバ URL を管理

13.8 講義全体の総括

本講義「機械学習」では、全 13 回を通じて、機械学習の基礎から実践的な応用までを学んできました。

学んできたこと

回 テーマ 内容
1 機械学習概要・Python 復習 講義の概要、Python 基本文法の復習
2 データ可視化 Matplotlib によるデータの可視化
3 機械学習の基礎 教師あり学習、訓練とテスト、評価指標
4 回帰 単回帰分析、重回帰分析
5 分類 ロジスティック回帰、k-NN
6 木構造・アンサンブル・SVM 決定木、ランダムフォレスト、SVM
7 画像処理の基礎 画像データの基礎、OpenCV による読み込み・変換・しきい値処理
8 画像の特徴抽出 エッジ検出、コーナー検出、HOG、ヒストグラム特徴
9 画像データを用いた機械学習 MNIST・CIFAR-10 を題材にした画像分類、CNN の紹介
10 自然言語処理の基礎 テキストクリーニング、MeCab による形態素解析
11 テキストデータを用いた機械学習 Bag-of-Words、TF-IDF、ナイーブベイズによる文書分類
12 テキストの意味を捉える Embedding Word2Vec / Transformer / BERT、LM Studio サーバ経由の Embedding 利用
13 Web アプリケーション開発 Streamlit によるアプリ化、チャットアプリ、デプロイ

機械学習プロジェクトの流れ

本講義で学んだ内容を組み合わせることで、以下のような機械学習プロジェクトの一連の流れを実践できます。

graph TB
    A["1. 問題の定義"] --> B["2. データの収集・整理"]
    B --> C["3. データの可視化・探索(第 2 回)"]
    C --> D["4. 特徴量の抽出・前処理<br/>(画像:第 7・8 回/テキスト:第 10〜12 回)"]
    D --> E["5. モデルの選択・学習<br/>(第 3〜6・9・11・12 回)"]
    E --> F["6. モデルの評価・改善<br/>(精度・混同行列など:第 3 回〜)"]
    F -->|改善を繰り返す| D
    F --> G["7. デプロイ・公開(第 13 回)"]

    style A fill:#e6ccff
    style B fill:#e6f3ff
    style C fill:#e6f3ff
    style D fill:#ffffcc
    style E fill:#ccffcc
    style F fill:#ffcccc
    style G fill:#ccffcc,stroke:#66aa66,stroke-width:2px

今後の学習に向けて

本講義では機械学習の基礎を学びました。興味のある方は、以下のようなトピックについても学んでみてください。

  • ディープラーニング: ニューラルネットワーク、CNN、RNN、Transformer
  • 大規模言語モデル(LLM): GPT などの商用 API と、Qwen・Llama などのオープンモデルの活用
  • 強化学習: ゲーム AI、ロボット制御
  • MLOps: 機械学習モデルの運用・管理