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

けつあご日記

こんちは.菊地です.なんか浅ーいことをいろいろ書きます

Coursera ML ex2をpythonでやってみた(前編)【なれない日記20160802】

Python なれない日記 機械学習

ex1は自分で勾配降下法などを実装したあと,ライブラリを使って実装しなおしていたが,自分で書くとOctaveとほぼ同じになってしまってあまり面白みがないので,今回からはライブラリの使用を前提としてやっていく.

↓前回
www.ketsuago.com

www.ketsuago.com


前編は普通のex2(線形の決定境界),後編はex2_reg(非線形の決定境界)をやる.

import numpy as np
import matplotlib.pyplot as plt
from sklearn import linear_model

data = np.genfromtxt("ex2data1.txt", delimiter=',')

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

# C is inverse of regularization strength. default=1.0
logreg = linear_model.LogisticRegression(C=1000) 
logreg.fit(x, y)

fig = plt.figure(figsize=(12,5))

#Plot decision boundary: line
ax = fig.add_subplot(1, 2, 1)
ax.scatter(x1[y==0], x2[y==0], c='yellow', marker='o', label='Not admitted')
ax.scatter(x1[y==1], x2[y==1], c='blue',   marker='+', label='Admitted')
ax.legend(loc='upper right', shadow=True, fontsize='small')

theta0 = logreg.intercept_
theta1, theta2 = logreg.coef_[0]
x1_line = np.linspace(x1.min(), x1.max())
boundary = - (theta0 + theta1 *  x1_line) / theta2
ax.plot(x1_line, boundary, 'red')

ax.set_xlabel('Exam 1 score')
ax.set_ylabel('Exam 2 score')
ax.set_xlim(x1.min(), x1.max())
ax.set_ylim(x2.min(), x2.max())

# Plot decision boundary: color area
ax = fig.add_subplot(1, 2, 2)

x1mesh, x2mesh = np.meshgrid(np.arange(x1.min()-5, x1.max()+5, 1), np.arange(x2.min()-5, x2.max()+5, 1))
z = logreg.predict(np.c_[x1mesh.ravel(), x2mesh.ravel()])
z = z.reshape(x1mesh.shape)
plt.pcolormesh(x1mesh, x2mesh, z, cmap=plt.cm.Paired)

ax.scatter(x1[y==0], x2[y==0], marker='o', label='Not admitted')
ax.scatter(x1[y==1], x2[y==1], marker='+', label='Admitted')
ax.legend(loc='upper right', shadow=True, fontsize='small')

ax.set_xlabel('Exam 1 score')
ax.set_ylabel('Exam 2 score')
ax.set_xlim(x1.min(), x1.max())
ax.set_ylim(x2.min(), x2.max())

plt.show()

↓グラフ

f:id:kichiku_kikuchi:20160802234919p:plain:w600

ドキュメンテーション(Logistic Regression 3-class Classifier — scikit-learn 0.17.1 documentation)に色で境界を塗り分ける例が載っていたのでやってみたが,なんか禍々しい色になってしまった.

ロジスティック回帰のインススタンスを生成するときに正則化のパラメータ(λ)を宣言する必要があるようで,しかも宣言すべきCはλの逆数だそうだ.つまり小さいほうが正則化項の影響が大きくなる.

logreg = linear_model.LogisticRegression(C=1000) 

Inverse of regularization strength; must be a positive float. Like in support vector machines, smaller values specify stronger regularization.

http://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html

どうやらサポートベクターマシンのときでは慣例的にこのCを使うらしく,それに合わせているようだ.
サポートベクターマシン - Wikipedia

本来のex2では正則化しないでやっていたので,Cは大きめに設定しておく必要がある.試しにデフォルトの1.0でやってみたら,正則化項の影響が大きすぎるのか,すこし微妙な決定境界になった.

f:id:kichiku_kikuchi:20160803000427p:plain:w600


あと,なんか適当なメソッドがないような感じだったので決定境界をプロットするところを自分で書いたんだが,こんなことある?

theta0 = logreg.intercept_
theta1, theta2 = logreg.coef_[0]
x1_line = np.linspace(x1.min(), x1.max())
boundary = - (theta0 + theta1 *  x1_line) / theta2

もっといい方法があるはず...と思ったが,答え合わせ的に使用させてもらってる記事(私の日記はこちらの劣化版に相当するぞい)でも同じことをしていた...こういうもんなのかな.あとでもう少し調べてみよう.

qiita.com


Week3の終わりの動画でNg先生に「もう君はシリコンバレーで機械学習をやってる多くのエンジニアよりも,機械学習をよく知っているよ」と,例の名言を頂いた.シリコンバレーでバターコーヒーでも飲みながら調子こいて暮らしたいもんだ.

Week4もがんばるぞい.



↓アフィカスリンク

Python機械学習プログラミング 達人データサイエンティストによる理論と実践 (impress top gear)

Python機械学習プログラミング 達人データサイエンティストによる理論と実践 (impress top gear)