プログラマー基礎講座②|アヤメで学ぶ機械学習|WebアプリからEXE配布まで

PC・ガジェット

こんにちは、第2回目にしていきなりレベルが上がったと感じるかもしれませんが、
chatgptを使えばとても簡単に機械学習を学ぶことができます。
今回はアメヤを題材にした機械学習を説明します。

はじめに:アヤメ(Iris)の機械学習とは?

アヤメ(Iris)という花を知っていますか?
このアヤメを見分ける問題は、機械学習の勉強としてよく題材に上がるそうです。

なぜアヤメなのか?

アヤメは3つの品種があります。それぞれを見分けるために、4つの測り方があります。

  • がく片の長さ
  • がく片の幅
  • 花弁の長さ
  • 花弁の幅

この4つの数字を測ると、どの品種かを当てられるんです。
これが「機械学習」の基本になります。

機械学習で何をしているのか?

実は、とても単純なことをやっています。

  1. 「このアヤメは長さ5cm、幅3cm、花弁2cm、幅1cm → セトウサだ」
    というように、150個のアヤメのサンプルを覚えさせます。
  2. 機械がそのルール(「4つの数字がこれくらいなら、この品種」という法則)を自動で見つけます。
  3. 新しい花が来たら、その法則を使って「多分このタイプだろう」と予測します。

つまり、「データから自動的に判断ルールを作って、新しいデータに応用する」のが機械学習です。

何が身につくのか?

機械学習を勉強すると以下の4つのことが学べます。

  • データを分ける大切さ:学習用と確認用に分けることで、本当に使えるかどうかチェックできることが分かります。
  • 数字の前準備(前処理)の効き目:100cm のものと 1cm のものが混ざっていると、機械は困ってしまいます。事前に「そろえる」だけで精度が上がることを体感します。
  • モデルの見方:「この予測、何%の確信度でしてるのか」という数字から、結果の信頼度が読み取れるようになります。
  • 学んだものを保存して再利用する流れ:一度学んだルールを「ファイル」に保存して、別の場所で再利用できます。これが仕事の現場でも使う手法です。

なぜアヤメが愛される理由

アヤメは、小さくて、すぐに、はっきり違いが出ます。特に面白いのが、セトウサという品種は花弁がめちゃくちゃ小さいので、他の2種類とすぐ見分けられます。でも、残りの2種類(バージカラーとバージニカ)は似ていて、「どこで分ければいいのか」で苦労します。この”困り感”が、機械学習の工夫の大切さを教えてくれるんです。


完成形のイメージ:「数字 → 形 → 楽しい」の3ステップ

このプロジェクトで作るのは、次の3つです。

1. Webブラウザで判定する「デモページ」

ブラウザで4つの数字を入力すると、学習済みの機械が「どの品種か」と「その確信度」を教えてくれます。さらに、その数字を2つの楕円形に変えて、絵で見られるようにしました。

  • 外側の楕円 = がく片
  • 内側の楕円 = 花弁

この絵を見ると、数字だけより「なんとなく違うな」という感覚が伝わりやすいんです。

2. 「一番近い実例」を見せてくれる

あなたが入力した4つの数字に一番似ている、実際のアヤメのデータを表示します。「あ、このアヤメに近いから、こっちの品種なんだ」という納得感が生まれます。

3. クイズで遊びながら学ぶ

10問のクイズが出ます。ランダムに選ばれたアヤメの姿(楕円の絵)と数字を見て、「これはどの品種?」と3択で答えます。答えたら、すぐに正解と解説が出ます。

遊んでいるうちに、「セトウサは花弁が小さいからすぐ分かる」「バージカラーとバージニカは幅と長さの組み合わせが大事」という感覚が身についていきます。

4. EXEファイルで友達にも配布

プログラムを .exe ファイルにして、ダブルクリックするだけで動くようにします。インストール不要で、同僚や学校の友達と共有できます。


機械学習の「最小限の流れ」を理解しよう

ここからは、実際の流れを簡単に説明します。

ステップ1:データを理解する

アヤメのデータには、150個の花のサンプルが入っています。それぞれに4つの数字と、「セトウサ」「バージカラー」「バージニカ」のどれかが書いてあります。各品種が50個ずつです。

ステップ2:データを2つに分ける

150個のうち、120個を「学習用」、30個を「確認用」に分けます。これは、学校のテストで「教科書は使える練習問題」と「テスト本番」に分けるのと同じ。

なぜ分けるのか?

もし、学習に使ったデータでそのまま確認したら、「丸暗記してるから正解率100%」という嘘が出ます。新しいデータにも本当に使えるかをチェックするために、別のデータで試す必要があります。

ステップ3:前準備と学習

前準備(標準化)

データには、5~7cm の数字と、0.1~2.5cm の数字が混ざっています。単位をそろえても、数字の大きさが大きく違うと、機械が「大きい方が大事」と勘違いしてしまいます。そこで、全ての数字を「平均 0、ばらつき 1」に整えます。すると、4つの特徴が同じ舞台で比べられるようになり、精度が上がります。

学習

「ロジスティック回帰」という簡単な機械学習の方法を使います。120個の学習データから、「4つの数字が、このバランスなら、どの品種になるか」という決め方のルールを作ります。

ステップ4:結果を評価する

30個の確認用データで「何個正解できたか」を数えます。これが「精度(正解率)」です。

例えば、27個正解なら、精度は90%です。さらに、「この品種の判定は得意だけど、あの品種は外しがち」というような詳しい分析も見えます。

ステップ5:学んだルールを保存する

機械が学んだ決め方のルール(前準備のやり方も含めて)をファイルに保存します。このファイルを持ってれば、別のパソコンでも、別の日でも、同じように予測できます。

これが実務で一番大事です。一度学んだものをずっと使えるので、毎回学習し直す必要がありません。


「数字を形にする」可視化の考え方

4つの数字を「絵」に変える工夫を説明します。

2つの楕円で花を表現する

  • 外側の楕円:がく片を表します。横の幅 = 幅の数字、縦の長さ = 長さの数字に対応させます。
  • 内側の楕円:花弁を表します。同じ仕組みです。

データの最小値と最大値を知っておくことで、どの数字も楕円の大きさに正しく反映されます。

色で品種を見分ける

花弁の色を推定した品種の色に塗ります。がく片は灰色などのニュートラル色で、輪郭だけ描きます。

並べて比較する

あなたが入力した数字の楕円と、一番近い実データの楕円を並べて表示します。「あ、この部分が似てる」「ここはちょっと違う」という差を、目で見て理解できます。

たった2つの楕円でも、アヤメは「顔つき」が大きく変わります。数字の違いが、形の違いに翻訳されることで、データの意味が身体でつかめるようになるんです。


クイズ化で遊びながら学ぶ

クイズのルール

10問が出ます。各問ごとに、実データのアヤメ1個分の4つの数字を提示します。その情報から「これはどの品種?」と3択で答えます。

答えた後の流れ

正解がすぐに出ます。さらに、「正解のアヤメの楕円」と「4つの数字」が表示されるので、自分の推測と比べられます。

なぜクイズは学習に効くのか?

セトウサは簡単

セトウサは花弁がとても小さいので、見分けやすいです。最初のいくつかは、ほぼ全員正解します。「得意なやつ」を見つけると、やる気が出ますね。

バージカラーとバージニカは難しい

この2つはかなり似ています。「あ、幅がちょっと大きいとバージカラーなのか」「長さだけじゃなくて、幅とのバランスが大事」という発見が、クイズを通じて自然に起きます。

「当てる → 違いを見る → 次に活かす」のループ

この流れを軽いゲーム感覚で何度も回すことで、ルールが身体に染み込みます。


EXE配布で、だれでも簡単に使える形に

なぜEXEに変えるのか?

Pythonをインストールしていない人でも、ダブルクリックするだけで動きます。同僚や授業の参加者と簡単に共有できます。またソフトにする癖をつけることで
ソフトの完成(達成感)を経験することもできます。

EXEを作るのに必要なもの

以下の2つを、アプリと同じフォルダに入れておきます。

  • templates フォルダ:ブラウザに表示するHTMLファイルが入っています。
  • iris_model.joblib:機械が学んだルールが保存されたファイルです。

ビルドの考え方(イメージ)

PyInstaller という道具を使って、Pythonプログラムを EXE にまとめます。

pyinstaller --onefile --noconsole `
  --add-data "templates;templates" `
  --add-data "iris_model.joblib;."
  app.py

ここで大事なオプションは以下の3つです。

  • --onefile:全部を1つのEXEにまとめます。配布が楽です。ただし、起動は少し遅くなります。
  • --noconsole:黒い「コマンド画面」を出さずに、Webブラウザだけ表示します。
  • --add-data:EXEの中に、HTMLファイルとモデルファイルを同梱します。

実行パスの対策

EXEになると、ファイルの置き場所が Pythonを実行したときと違います。そこで、プログラムの中で以下のように書いておきます。

BASE_PATH = getattr(sys, "_MEIPASS", os.path.dirname(__file__))
TEMPLATE_DIR = os.path.join(BASE_PATH, "templates")
MODEL_PATH = os.path.join(BASE_PATH, "iris_model.joblib")

こうすると、EXEでもPythonでも、正しくファイルを見つけられます。


つまずきやすいポイントと対処法

エラー1:「TemplateNotFound」が出る

原因:ブラウザに表示するHTMLファイルが見つかりません。

確認すること

  • templates フォルダは、app.py と同じ場所にありますか?
  • index.html は、ファイル名が index.html.txt になっていませんか?(.txt がついてないか確認)
  • iI など、大文字小文字は合ってますか?

確認用に、プログラムの起動ログに Flask が使ってるテンプレートフォルダ を出力してみると、原因が見つけやすいです。

エラー2:「ModuleNotFoundError: flask」が出る

原因:Flaskというライブラリがインストールされていません。

対処法

Pythonを実行している環境(特に仮想環境を使ってる場合)で、以下を実行します。

.venv\Scripts\python.exe -m pip install flask scikit-learn joblib

python ではなく、仮想環境の python.exe を指定することが大事です。

エラー3:ファイルやフォルダの名前の誤字

iris_model.joblibiris_modle.joblib(「del」を「dle」)と誤字したり、フォルダ名を workspace のつもりが workspase になってたり。

対策:ファイルエクスプローラーをもう一度開いて、目視で確認しましょう。

エラー4:HTMLの変更が画面に反映されない

原因:ブラウザがキャッシュ(昔のファイルを記憶)してる、またはFlaskが古いファイルを使ってる。

対処法

  • ブラウザの強制リロード:Ctrl + F5(Windowsの場合)
  • Flaskを再起動する
  • ブラウザを完全に閉じて、もう一度開く

エラー5:「404 Not Found」が出る

原因:ブラウザが正しいページのアドレスを見つけられません。

対処法

  • URLが http://localhost:5000 と正しいか確認します。
  • 誤字がないか見直します。
  • Flaskのログに @app.route(...) のリストを出力して、設定されてるルートを確認します。

エラー6:「ポート5000はすでに使用中」と言われる

原因:昔のFlaskサーバーが、まだ動いてる可能性があります。

対処法

  • 別のポート番号を使います。プログラムで app.run(port=5001) のように書き換えます。
  • または、Windowsなら、タスクマネージャーで古いPythonプロセスを終了させます。

まとめ:「数字 → 形 → 体験」で、機械学習を自分のものに

このプロジェクトの大事な点をまとめます。

アヤメは”小さな教材”ですが、とても強力です。

小さいのに、機械学習の一連の流れ(前準備 → 学習 → 結果チェック → ファイル保存 → 新しいデータで予測)を、全部体験できます。

SVGの楕円で「数字が形になる」と、理解が一気に深まります。

4つの数字だけ見てても「何のこっちゃ?」ですが、形に変えると「あ、この部分が大きいんだ」という差がすぐ分かります。

最近傍の実データを見せることで、納得感が生まれます。

「あ、このアヤメに似てるから、この品種なんだ」と、機械の判断に理由がついて、信頼できます。

クイズで遊んでいるうちに、「困り方」が身につきます。

セトウサは簡単だけど、バージカラーとバージニカは難しい。この”困り感”こそが、現場で「特徴エンジニアリング」「モデル選び」「データ前処理」の大切さを教えてくれるんです。

EXE配布まで作ると、学びが資産になります。

プログラムを同僚や授業の参加者と共有できます。みんなで遊ぶことで、機械学習への理解がグッと加速します。

私が作ったソフトの配布方法がまだわからないので後日配布します。


次のステップ

基本形ができたら、ぜひ上記の「アイデア」を追加してみてください。スライダーでリアルタイム予測、ランキング機能、スマホ対応など、「使いたくなる学習ツール」へ育てることができます。

あなたのチームや読者の機械学習への理解も、ぐんと加速するはずです。ぜひ試してみてください!

コメント

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