【Udemy】機械学習・脱ブラックボックス化講座-中級編-を受けてみる!

【Udemy】機械学習・脱ブラックボックス化講座-中級編-を受けてみる!

みなさんごきげんよう!

この記事では、Udemyの

【キカガク流】人工知能・機械学習 脱ブラックボックス講座 – 中級編 –

こちらの講座を受けた僕のアウトプットの内容となります。

前回記事の続きになっていますが、今回は内容よりかは、より評価に重きをおいて記事を書いていきます。

↓前回記事はこちら!↓

ではいきます。

【キカガク流】人工知能・機械学習 脱ブラックボックス講座 – 中級編 –

この講座での学習内容は以下の通りです。

学習内容紹介

僕が特に気に入ってるのは、数学もしっかり教えてくれるというところです。

僕はまだ学部一年生で、コロナの影響で授業が全然始まらないこともあり、

線形代数や確率統計の知識が、本で読んだ多少の独学の知識しかないので、こうやって実装ベースで数学を教えてくれるのはとてもとてもうれしいです。

片方をメインで教えてくれる講義はたくさんあっても、

数学→python実装

の流れをしっかり、単純明快に教えてくれるものは少ないのではないのでしょうか。

(ちなみに僕はもう講義を終えた身なのですが、上記のスキルがちゃんと付いたと思います。)

ただ自由にnumpyやpandasのフレームワークを用いてwebアプリを公開するのが直近の目標なので、

そのゴールまではまだまだステップを踏みそうです。

ただ数学の概念など、なぜ不偏分散を使ってデータ分析するのかということがしれたので、これは単純にプログラミングを勉強していても身につかないアドバンテージかなと思います。

コース内容紹介

実際のコースの内容はこのようになってます。

全体として4時間構成で、線形代数に25%費やしてるところが推しポイントです。重回帰分析は、ゆーて単回帰の応用といった内容だったので理解はしているのですが、

行列の計算の知識をしっかり使ってパラメータを確定していくので、慣れてない作業に最初は苦戦しました。

転置の公式とかいろいろ、これは丸暗記してください。って言われたのは、講義の脱落者を少なくするためには少なかったのかもしれませんが、

線形代数初学者の僕にとっては少し物足りなく感じました。

復習がてら、学んだ内容を小出しにしながらアウトプットします!

線形代数

講義で習った線形代数の知識は以下の通り。

そもそも高校数学とは、ベクトルの扱いが異なることに衝撃でした。

いままでの高校数学は、ベクトルを、方向を持つ数値、みたいな感じで扱った来ましたが、線形代数の範囲では?1列の行列のことを指しているようです。

少なくとも僕はそうやって理解しました笑

上の画像にもある通り

スカラーというのが、1行1列の行列

ベクトルというのは、数行1列の行列

行列というは、数列数行のスカラーの集合

という感じです。

後半で、これらの演算方法について学んでいきました。

具体的には

  • 行列の足し算引き算
  • 行列の掛け(行列積)
  • サイズ感について(行列*ベクトル=ベクトルなど)
  • 転置(公式紹介)
  • 単位行列・逆行列
  • ベクトルで微分(ベクトルそれぞれの要素で偏微分)

です。実際の線形代数の公式は

The Matrix CookBookを見てくださいとの指示がありました。

調べても英文のpdfばかりで、あんま読む気にはなれないようなものでした笑

https://www.ics.uci.edu/~welling/teaching/KernelsICS273B/MatrixCookBook.pdf

公式は、この講座の本質ではないので、さっさと先に進んじゃいます!

重回帰分析

重回帰分析の内容はこんな感じです

やっていることは単回帰分析のときと全く一緒たのですが、パラメータを導くための計算過程が、僕は行列を大学で勉強したわけではないので割と足踏みして理解しました。

もちろん理解しないでもpython実装することは可能ですが、いまそれをやったところで、将来的にデータサイエンティストとしてはやっていけないと思ったので、しっかりやりました!

文字の定義

  • y_hat : 予測値
  • w : 重み
  • x : 入力変数
  • b : バイアス

として扱います。

ここからは、このブログでの特殊記号表示方法を探すのが面倒なので、手書きの計算を用いてアウトプットします。

画像①

このように予測値は、それぞれの入力変数 ‘x’ (広さや駅からの距離等)に重みであるパラメータ ‘w’ をそれぞれかけたものの総和とすることができて。

これはシグマ(Σ)で表すこともできるが、今習った行列の知識を使うと

それぞれのベクトルの積として表すことができる。

wベクトルの転置したものにxベクトルをかけたものになるので

y_hat = 転置wベクトル * xベクトル

と表すことができる。

ベクトルで微分の公式が使いやすいそうなので、今回は

x転置ベクトル * wベクトル

とする。

評価関数

評価関数は以下のようにあらわす

(y – y_hat) ^ 2

これは実測値と予測値の差の二乗誤差を求める式である。

だから、今回の評価関数は

画像②

このようにまとめることができる。

アルファベットの小文字に、縦棒が入っているのは、ベクトル表記。

評価関数のLも、行列を使うとこんなに簡単に表すことができる

評価関数の最小化

さっき表した評価関数(いわゆるデータの誤差)を最小化することができたら、

要するに、未来を予測する制度が高いということになる。

最終的にはこの評価関数を微分して最小値を求めていくのだが、ここでは式変形を行う。画像③

そもそもの条件として、y_hat1というのは1件目の物件の予測値である。

それらと、行列の知識を用いて式変形すると

上のように展開することができる。

行列はラージエックス(X)で表すと、最終的にy_hatのベクトルは

行列X * wベクトルと書き換えることができる。

ではさらに式変形をしていく

画像④

このように、評価関数を展開していくと、3項の簡単な式に書き換えることができる。

bベクトルや行列Aに関しては、スケールを参照して定数項にした。

ここで求めた評価関数の、パラメータ成分を横軸、評価関数を縦軸にグラフを書くと、すべて2次関数のように書けるのだが、計算は省略する。

ここで求めた評価関数を、wベクトルで微分していく
(評価関数の最小値→誤差の最小値を求めるためにこんなことをしている)

微分して最小値を求める工程は、高校数学でさんざんやったものなので、ここはスムーズに理解できました!

ベクトルで微分する公式を用いながら、さらに計算を進めていくと下記のようになる

単位行列はかけても数字が変わらないから、

パラメータwベクトルは、上に書いてあるように示すことができる。

以上!

ここまでが、僕が理解した、最適パラメータを求める手順です!

途中、特に行列の公式を用いるところで、納得いかない部分はありましたが、ググりながらなんとか終わらすことができました!

あとはこれをpythonで表現していけば、重回帰分析を回すことができそうです!

重回帰分析の実装

先ほど求めたパラメータwをpythonで実装するためには、pythonにおける行列の扱いに慣れておかなきゃいけないので、

今回の例題を解くための最低限をやっていこうと思います。

必要な演算表現

  • ベクトルの転置
  • 行列の定義
  • 転置
  • 逆行列
  • 行列積

これらができればとりあえずパラメータは求まります。

pythonで数学しやするくるために、いつも通りnumpyをimportするところから始めます。

ベクトルの定義は、numpyのarrayで行います。

行列の定義は、ベクトルをカンマで拡張してあげればおしまいです

行列の転置は、行列の後に「.T」をつけるだけ!

恐るべしnumpy…

逆行列は、inverse(逆)という意味の英単語の頭文字を使って定義します。

また、線形代数は英語で(Linear Algebra)というのでそれも含めると

np.linalg.inv()

と定義できます。

行列積は、「.dot」を用いて定義します。

XとX_invの積は

np.dot(X,X_inv)

と定義できます。

じゃー実際にパラメータwを求めていきます

さっきのwを思い出しておくとこんな感じでした

w = ((X*X.T)^(-1))X.T*y

パソコンで表現するとわかりにくすぎて嫌です笑

要素ごとに分解して計算していきます!

最適パラメータ実装

まずは行列Xとベクトルyを定義します

① X * X.T

XtX = np.dot(X.T,X)

② XtXの逆行列

XtX_inv = np.linalg.inv(XtX)

③ X.T * y

Xty = np.dot(X.T,y)

④ ②と③の積で最終パラメータ

w = np.dot(XtX_inv,Xty)

これでパラメータ ‘w’ が出てきます

と、numpyでこんなに便利だなーって思ったんですけど、pythonライブラリにはもっと便利な「Scikit-learn」というものがあるらしいです!

さっそくimportしていきましょう。

Scikit-learnで実装

SKlearnをインポートした後は、モデルを宣言してあげます

model = LinearRegression()

さらに、モデルを学習させていきます。

このモデルの学習というのは、先ほどのwを求める計算のことです。データセットに対して、最適パラメータを求めていくことを、モデルの学習って言います。

それはこんな感じ

model.fit(X,y)

これだけ・・・さっきたくさん転置したり、インバースしたりしてたのが、わずかこれだけでおしまいです。python怖すぎます笑

調整後のパラメータは

model.coef_

model.intercept_

というところに入っているので見てみると

さっき求めた値と一致しています。

素晴らしいっ!

最後に、このモデルがどれくらいの精度をもっているかというのも0~1の範囲で知ることができて

model.score(X,y)で持ってこれます

実際のコースでは、この後に、実データを使って予測値を求めていくのですが、量があまりにも多いのでここで割愛したいと思います。

またさらに、後半では統計てきな知識についての補足もあり、非常に充実した内容になっていました。

上級編はまだUdemy上にはないのですが、販売されたら真っ先にやっていきたいと思います。

それではまた!