読者です 読者をやめる 読者になる 読者になる

Coursera Machine Learning

統計 機械学習

いかにも三日坊主になりそうだったので書いていなかったが、5月からCourseraのMachine Learningの授業を受けているのです(N(>>1)周遅れ感が凄まじいが、最近職場の(良い意味での)外力とかもあって今更重い腰を上げて必死に勉強を始めたという状況)。全11週のうちWeek7のサポートベクターマシンまで終わった(ここまでが教師あり学習で、次から教師なし学習)ので、もうここまで来たら逃す訳にはいかない、ということでここにも書いて逃げ道を塞いでおく。
もっとも、当初の軽い気持ちとは裏腹にモチベーションは今のところ予想外に保てている。これは、分野自体が統計力学の気持ちに近い気がするためイメージが湧いて楽しい、とかもあるが、この授業に関していえば講師のAndrew Ng先生の滅茶苦茶に分かり易い洗練された説明と、日本ではなかなかお目にかかれないcheerfulな感じの授業に尽きる。正にカリスマ。
週1のプログラミングの宿題(ちなみに言語はまさかのOctaveである。先生曰く、実践の場面でもC++とかでしっかり書くのではなくまずはOctave/Matlabでささっと書いて動かして挙動をみるのが良いらしい)とかも、懇切丁寧なお膳立てをしつつ肝心なところは自分で書かせてちゃんと原理の勉強になる、というさじ加減が大変良い(やや丁寧過ぎる感もあるが、土日にやる身としては、これぐらいだと嫌にならない)。
後、特色としては、理論よりも実践にやや寄り気味のところか。自分だったらどうするのか、という説明が何度も現れる所とか分析の一連の手順の流れとか(バイアス―バリアンスの判断とか)、そういった所を意識させる機会を多くしている気がする。まあこれは好みもあると思うが(個人的にはもう少し原理よりで構わない。ただ、いまの講義の形態なら数学なども間違いなく大学1年生程度でも追えるので、これはこれで教育的)。
最近は勉強も兼ねて、宿題のPythonでの書き直しとかも少しずつ始めた。
たとえば3週目のロジスティック回帰の宿題(ex2)なら

import numpy as np
import pylab as pl
import pandas as pd
from sklearn.preprocessing import PolynomialFeatures
from sklearn import linear_model

data = pd.read_csv("ex2data2.txt",header=None)

x1 = np.array(data[0])
x2 = np.array(data[1])
y = np.array(data[2])

pos = (y==1)
neg = (y==0)

pl.scatter(x1[pos],x2[pos],marker = '+',c = 'b')
pl.scatter(x1[neg],x2[neg],marker = 'o',c = 'r')

poly = PolynomialFeatures(6)
X = poly.fit_transform(np.c_[x1,x2])

model = linear_model.LogisticRegression(penalty = 'l2',C = 100000.0)
model.fit(X,y)

px = np.arange(-1.0, 1.5, 0.1)
py = np.arange(-1.0, 1.5, 0.1)
PX, PY = np.meshgrid(px, py)
XX = poly.fit_transform(np.c_[PX.ravel(), PY.ravel()])
Z = model.predict_proba(XX)[:,1]
Z = Z.reshape(PX.shape)
pl.contour(PX, PY, Z, levels=[0.5], linewidths=3)
pl.show()

と言った感じで、ライブラリscikit-learn使うと多項式フィットとかも良きに計らってくれて、さくっと書ける。

決定境界をプロットしてみると、こんな感じ。左上のあたりとかを見るに、過学習が起きていると思しき挙動。

正則化パラメータをいじると(上でC=10E6とかすると)、見た目はもう少し自然になる。

もっとも、こんな気分レベルのことばかりでは勿論駄目で、実際はちゃんと交差検定行ってバイアス―バリアンスについて検討するべき(上述のCourseraの授業ではちゃんとその辺りの方針についても時間をとって教えている)。