[Raspberry pi]Pythonで機械学習備忘録(1)

  • 2020.09.25
  • IoT
[Raspberry pi]Pythonで機械学習備忘録(1)

ディープラーニングの数学

5月頭ぐらいから「ディープラーニングの数学」という本を利用して機械学習に必要な数学を勉強していました.

この書籍は冒頭で簡単な回帰モデル(単回帰)の説明、それから2章〜6章にかけて微分、積分、対数などの機械学習で(最低限)必要となる数学を学び、最後に実戦として線形モデル、ロジスティック回帰モデル、ニューラルネットワークモデルを作っていく構成となっています.
数学概念が機械学習のどの部分で利用されるのかが、できる限り丁寧に説明もしてくれたりでわかりやすかったです.

ただし、あくまでプログラム世界におけるAIのブラックボックスを理解するという目的故、僕みたいに機械学習とは何か、どんな種類があるのか、など前提知識があまりない状態で取り組むと後述の通り数学の簡単な学習/復習となってしまいました.

5月〜9月の現在までで数学の復習(?)を総なめできた状況なのですが、あいにく基礎はできて応用ができない…つまりは学んだ知識をどう活かすかしっくりきていない(理解が不十分なのもある)状態のため7章以降がうまく進められていません.

そこでここからは一旦書籍での勉強をやめ、(本来事前にやるべきだった)機械学習について自分で調べつつ何かアウトプットとしてモデルを作成していこうかと思います.
個人的な備忘録としてまとめる予定ですが、機械学習初学者が簡単な回帰モデルを組めるようになるまでの過程として別の初学者の方の参考になれば嬉しいです.

何を作る?

学習モデルの難易度をざっくりまとめると

単回帰モデル < 重回帰モデル < ロジスティック回帰モデル < ニューラルネットワークモデルetc…

のようです.

単回帰重回帰は数値を予測する「回帰型」、ロジスティック回帰以降は離散値を予測する「分類型」であり、このうち回帰型である単回帰モデルは一次関数、二次関数、関数のグラフ、シグマ、(偏)微分辺りを理解していれば作れるみたいです.

これらを踏まえてまずは単回帰モデルを理解し、予測式(モデル)が得られるプログラムの作成を目指すのが良さそうです.

設定するゴールとしては

ラズパイ4上で読み込んだデータ(入力値)を回帰分析するプログラムを組みます.

入力方法は以前ラズパイ上で構築したsambaサーバー経由でPCからcsvファイルを送りつけ、データフレームとしてそれを読み込んで分析させるという計画です.


ちなみにラズパイで実現する理由は単に浪漫があるからです.

この回ではかなり基礎的な部分をまずは押さえ、次回で回帰モデルについて数学的な部分も含め理解した上で実際にプログラムを組んでいく段取りで考えています.(全3回ぐらい?)
故にscikit-learnで簡単に実装するのではなく途中計算もなるべく理解した上で、numpy,pandasなどを用いて実現するつもりです.

学習モデル

学習方法として

・教師あり学習
・教師なし
・強化学習

がありますがここは単回帰モデルと最初に決めているため「教師あり学習」一択です.
詳細な理由は後述します.

教師あり学習

入力データと正解データから学習モデルを開発する手法です.
「教師あり学習」は学習フェーズ予測フェーズから構成されています.

学習フェーズと予測フェーズ

簡潔にまとめます.

学習フェーズ:入力データと正解データをもつ学習データ基にモデルを作成するフェーズ.
入力値xから出力値y(に近い値)が得られるようなf(x)を作る感じ.

予測フェーズ:学習フェーズで十分な精度を出したモデルを使って、入力データのみで正解データに近い結果(予測値)を得られるか検証するフェーズ

また、正解データと予測値の差を表す関数として損失関数があります.

損失関数の求め

基本的な流れとしては

1.入力データ、正解データを用意する.

2. 入力データ(x)から正解データ(y)が得られるような関数f(x)を作ってみる.これを学習モデル(仮)とする.

3.関数f(x)に入力データ(x)を入れていく.その結果として得た予測値(yp)と正解データ(yt)の差分を取り、損失関数を作る.

4.損失関数が最小となるまで1.〜3.の繰り返し.

図で表すとこんな感じ(?)

勾配降下法

このように、損失関数を最小とするような最適パラメータに収束させていくアルゴリズムのことを勾配降下法(こうばいこうかほう)というらしいです.

予測値と正解値の差と言われてもいまいちピンとはこないので以下の簡易的な回帰分析のグラフを見るとさらにわかりやすいと思います.
それぞれの予測値と正解値の差分が最小となる直線を引いています.

損失関数グラフ(修正版)

この方法なら単回帰、重回帰、ロジスティック回帰全てに対応できるみたいですが、まずは単回帰モデルを実現することに注力するため最小二乗法を利用しようと考えています.

損失関数に関しては考え方が理解しやすかったのと、重回帰以降でも利用することになりそうなのでひとまずここで簡単にまとめておきました.

最小二乗法は計算する上では前者より理解しやすいのですが、説明するには公式を載せた方が早く、その計算式や内容などは次回に分けたかったのでここでは伏せてます.

終わりに

長くなると自分でも見返すのが嫌になるので、次回から単回帰モデルとその求め方(計算方法)についてまとめようと思います.