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

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

自宅謹慎中、みなさんはいかがお過ごしですか!

僕はふと思い出してしまった「ポケモンダンジョン」がやりたくて仕方ないです笑

やりたいことが日々山ずみなので、ゲームするのが怖いんですけど、始めるのも時間の問題な気がしてます笑

さて!本日はUdemyの

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

を受講したうえでのアウトプットを書いていこうと思います。

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

評価人数とその評価がめっちゃ高いですよね!

それだけ初心者にもかみ砕いて説明してくれ、しかも挫折する人が少ないんでしょう。あとはお金払ってるから、それで最後までやろうって人も多いのかもしれないですね。

学習内容はこちらです!

最後はしっかりpythonで実装してくれるそうなので、今勉強している身としてはうれしいです!

できるようになること

具体的にはこんな感じです!

全体で4時間強の動画学習になっています。

前半2時間で数学。後半2時間でpython実装になってますね!

数学はたぶん新しい知識も少ないと思うので、さくさくやってきましょう!

概念の紹介

一応このコースは有料のものなので、内容はなんとなーく伝えながら僕が学んだことを書いていこうと思います!

そもそも概念の紹介に40分も使われてるのに驚いたのですが、最初は

機械学習とか、人工知能とかディープラーニングとか、言葉の意味あいまいじゃないですか?って話に始まり。

機械学習に必要な数学はどんなものがあるか~など、最初に勉強をしていく内容とその意図を確認していきます。

機械学習に必要な数学

さぁpythonで機械学習を実装しようにも、初心者の僕にはアルゴリズムもなければ数学的知識もありません。ピカピカの学部1年生だし!笑

なので、このUdemyのコースでは、主に勉強する数学の内容として

  • 微分・積分
  • 線形代数
  • 確率統計

の3つを別単元として学んでいきます。

個人的に、1年前くらいにcourseraで、StanfordのMachine Learningのコースを途中までやったときに、線形代数は割と勉強したのですが、正直全然覚えてないです笑

これから大学でやらなきゃいけないにせよ、この場で基礎を教えてくれるのはありがたいですね!

機械学習の3大トピック

勉強する機械学習には大きく分けて3つのトピックがあります。それが

教師あり学習

教師あり学習は2つにわけることができて、回帰と分析が大きな枠組みです。

回帰:入力と出力があって、数値を予測する

  広さや土地に対する家賃とか。

分類:カテゴリを分類する

  与えられたアルコール度数で種類を判断するとか。

教師なし学習

クラスタリング:過去の傾向から、未来を推測する。

  男性用の服を買う傾向のあるグルーブ。とか

次元削減:複数ある変数を少なくする。

  これから勉強します。笑

強化学習

データがない。or ほとんどない。

  掃除ロボットのルンバとか。これから学習する。

こんな感じでした!今回は、機械学習の中でも、教師あり学習を勉強していくそうです!

微分を使う理由

内容を見る限り、大学受験を理系で経験した人は、ここはパスしてもよさそうですね。

そもそも微分は何がわかるんだっけって言ったら

関数の傾きを求められるのが微分でした。

ちなみに最後の偏微分というのは、多変数の関数を、1つの変数ずつ微分するだけなので、高校数学の知識の延長で理解することができました。

ここで、機械学習においての微分をする意味とは

傾き0を探して、最小値を求める点を求めること。

だと理解しました。

教師あり学習において、最終的なモチベーションは「予測する数値の誤差をできるだけ小さくすること」にあります。

先ほどの例の、住宅の値段の予測値が、できるだけ実際の値段に近ければいいってことです。

最小値を求めるために微分を使ってるってイメージですね。例えば、誤差を求める2次関数があるとして

図にもあるこの点が、いわゆる傾きが=0の点であり

この点がこのグラフの最小値になります。

この誤差というのは

誤差 =(実数値)ー(予測値)

と表すことができます。じゃあこの誤差を数学的に式で表していきます。

単回帰分析

だんだんタイトルがカッコよくなってきました。笑

この講義では、家賃を予測する機械学習を実装していくそうです。

では実際に問題設定をしていきましょう

このような形で、普通はあり得ないですけど、家賃が、家の広さに1次関数的に比例しているというデータがあるとします。

目標としては、データに基づいて、適切にパラメータ(傾きや切片)を決定する。

ここで、機械学習でよく使われる、計算手法があるので紹介です!

データの中心化

中心化(centering)というのは、図で説明するとこんな感じです。

(Udemy:キカガク株式会社)

xとyが対応しているデータを、中心に寄せるイメージですね。

これは、x,yそれぞれの平均値を書くデータから引いてあげたら中心化することができます。

あれ、、、、これって、、、はるか昔に偏差って言葉で習った気がする・・・大学受験の数1で、こんな感じのことやったけど、あの時は何やってるか全くわからなかったって言うか、

だからなんやねん。感がすごかったんですよね。こうやって、どーやって使われているかを教えてくれたら頭にも入りやすいのに。

評価関数を決める

Value Functionってどっかで聞いたことがある気がします!

先ほども言ったんですけど、

誤差 = 実際値 - 予測値

で表せますが、これでは誤差を考えるときにマイナス値が出てきてしまいます。

なので、両辺を二乗してあげるっていう操作が出てくるんです!

これでさっきの誤差関数が2次関数である理由に納得がいきました。

この誤差、絶対値ではだめなのかって思ったんですけど、微分して最小値を求めるとき、グラフにすると、絶対値のグラフは連続だけどなめらかではないんですよね。

やりましたよねこれ!

こーやって生きてくるんだなって、しみじみしてますが。笑

シグマ記号とか、このブログでの出し方調べるのめんどくさいので、画像このまま貼っちゃいます。

ラージエルが、今回の評価関数で、2乗誤差の総和が入っています。

のちのちにこれを偏微分して、最小値を求めていくんですね。

評価関数を最小化する

縦軸に評価関数。横軸に、パラメータaを取ると、評価関数をaで偏微分すれば、評価関数の傾きが文字で出るので、その傾きが0の地点を探していこうと思います。

手計算ですけど・・・笑

こんな感じで、パラメータaの最小値は、上の最終ラインの値で求まることがわかりました。実際に次から、pythonで数値予測してみたいと思います。

単回帰分析の実装

この前に、pythonの環境構築とか、変数とか基本構文の講義もあったんですけど、基本的なところはPython For Everybodyでもやっている内容があるので、省略です。

使用する環境はacacondaです。

Numpy数値計算

環境設定後から使えるようになったjupyter notebookでは、anaconda上のライブラリが使いたい放題なのが楽ですね!

早速Numpyをimportして計算を始めていきます

それぞれ、xとyに、先ほどの出力変数と入力変数を格納していきます。

そのあとは、さっきやった通りに中心化(centering)を行います。

pythonは、mean関数がデフォで入ってるからこんな楽なことないですね。

xc, ycというのが中心化された後のデータになるように、代入しておきます。

これでパラメータaを計算する準備ができました。

xx = xc * xc
xy = xc * xy

を定義して、これらの総和がさっき知りたいパラメータだったので、sum()関数を用いて計算してみます

こんな感じで、傾きが2.05と出すことができました!

素晴らしい!

Pandasでデータベースを操作する

Udemyでは、例題として使うサンプルのcsvファイルが添付されています!ちょっといじって、デスクトップのファイルの中に入れておきます。

pythonではファイルの読み込みはめっちゃ簡単で

こーやって書くだけです。

Matplotlibでグラフを描写する

まずはいつも通り、Matplotlibをimportするところから始めます

このライブラリを利用すると、データのプロットをすることができます。散布図は、英語でscatterっていうので、コードもそーやって書きます

これでデータをプロットすることができました。

pythonって本当に早いし強いし、こと初心者が実装までもっていくスピードだったら、プログラミング言語でもずば抜けて早いなって感じます。

単回帰分析の実装

とりえあず、describe()関数の便利さがえげつないです笑

先ほどプロットした散布図はまだデータの中心化がされていないので、pythonのdiscribe()関数を使いながら、中心化していきます。

まず、df(データフレーム)の平均値を確認します。

そして、x,yそれぞれを中心化するために、それぞれの値から平均値を引いて偏差を求めていきます。

そうすると、中心化後のデータ(df_c)の平均値は限りなく0に近いことがわかります!

あとは前回と同じ手順でプロットしてあげるだけですね

これで、データがグラフで言う原点を中心に散布していることがわかります。

これで、やっと最適パラメータである「a」の値を計算することができます。

計算式にぶちこむと

このように、それぞれの要素積の商が、パラメータを求める計算式でした。

それでは!具体的に家賃予測を行っていきましょう!

家賃予測

もともとの家賃予測と中心化の式は上のようなものでした。

なので、今回は35㎡の家の家賃を、先ほど作ったモデルで予測していきたいと思います。

x = 35
a = 10069 (先ほどの最適パラメータ)

を代入していきます。

最終的に、35㎡の住宅の家賃の予測値は、9.5万円とでてきました。

これは先ほどプロットしたデータを見てみるとわかります。

たしかに、35㎡の住宅は、このデータから約9.5万円であることがわかりました。

家賃予測関数とソースコード

最後に、この一連の流れを関数にして終わりにしたいと思います。

ここからは勉強内容を考えて自分で実装したので、ライブラリが整ってる人はぜひまねてみてください。

def pred(x)
    a = 10069.023
    xm = 37.622
    ym = 121065.0
    # もらったデータの最適パラメータを使用するため、定数項使用。
    xc = x - xm
    # centering
    y_hat = a * xc + ym
    return y_hat

これで30~50㎡の内挿の範囲であれば、家賃を予測することのできる関数を作ることができました。

本来は、パラメータaを求めるところから関数を作っていくのが最も汎用性が高いんでしょうけど、この場では定数項を使って省略しました。

最後に

今回は機械学習の①ということで、Udemyのコースを勉強していきました。

数学的背景などは、既知の内容が多かったのですが、pythonの環境設定始め、1から丁寧に実装まで説明してくれていたので、最後まで無事やりきることができました。

この後の②の講義では、線形代数と重回帰分析をメインで取り扱っていくそうです。

ちなみにこれも修了証をもらうことができました!いぇい!

今回の学習を通じて、この先作りたいAIの形も見えてきました。この先が楽しみです!

それではまた次回お会いしましょう!