「実践 機械学習システム」の第1章をPython3でやってみた

pythonで機械学習をしたい。

オライリーから発売されている「実践 機械学習システム」を進めていく。
Macのローカルで。

目次

  1. データを読み込む
  2. 前処理とデータ整形
  3. 正しいモデルの選択と機械学習

1. データを読み込む

ソースコードをダウンロードしておく。

GitHub - wrichert/BuildingMachineLearningSystemsWithPython: Source Code for the book Machine Learning Systems with Python. Fork of https://github.com/luispedro/BuildingMachineLearningSystemsWithPython
Source Code for the book Machine Learning Systems with Python. Fork of - GitHub - wrichert/BuildingMachineLearningSystem...

解凍したディレクトリ配下のch01/dataに移動する。

cd BuildingMachineLearningSystemsWithPython/ch01/data

ちなみにMacのローカルでおこなう。
実行環境はPython3のminicondaをつかう

source /Users/runble1/.pyenv/versions/miniconda3-3.8.3/envs/test01/bin/activate test01

python起動。
dataディレクトリでpython起動しないと、サンプルコードのままではファイル読み込めないので注意。

python

scipyインポートして、dataディレクトリ内のweb_traffic.tsvを読み込む。
genfromtxtで検索するとnumpyの方ばっか出てくるのだけど・・・

>>> import scipy as sp
>>> data = sp.genfromtxt("web_traffic.tsv", delimiter="\t")
>>> print(data[:10])
 [[ 1.00000000e+00 2.27200000e+03]
 [ 2.00000000e+00 1.65600000e+03]
 [ 3.00000000e+00 1.38600000e+03]
 [ 4.00000000e+00 1.36500000e+03]
 [ 5.00000000e+00 1.48800000e+03]
 [ 6.00000000e+00 1.33700000e+03]
 [ 7.00000000e+00 1.88300000e+03]
 [ 8.00000000e+00 2.28300000e+03]
 [ 9.00000000e+00 1.33500000e+03]
 [ 1.00000000e+01 1.02500000e+03]]
>>> print(data.shape)
 (743, 2)

ちゃんと読み込まれたことが確認できた。
参考書に載っているデータではnanが2行目右側にnanが表示されている。

2. 前処理とデータ整形

nanがいくつ含まれているか確認。

>>> x = data[:,0]
>>> y = data[:,1]
>>> sp.sum(sp.isnan(y))
 0

0なのでnanが含まれていない。
参考書のデータとは違う結果になることだろう。

グラフ作成。
正直コマンドの一つ一つは理解していない・・・

>>> x = x[~sp.isnan(y)]
>>> y = y[~sp.isnan(y)]
>>> import matplotlib.pyplot as plt
>>> plt.scatter(x,y)
>>> plt.title("web traffic over the last month")
>>> plt.xlabel("Time")
>>> plt.ylabel("Hits/hour")
>>> plt.xticks([w*7*24 for w in range(10)], ['week %i'%w for w in range(10)])
>>> plt.autoscale(tight=True)
>>> plt.grid()
>>> plt.show()

これで表示されるはず。コピペでいける。

3. 正しいモデルの選択と機械学習

モデルを作成していく。
モデルとは、現実世界で起こる現象を理論的に単純化して近似したもの。

近似することで誤差が生じるため、その誤差関数は以下で求めれる。

>>> def error(f, x, y): return sp.sum((f(x)-y)**2)

近似関数を求める。
読み込んだデータにnanがないので、参考書と違う値が出てくる。

>>> fp1, residuals, rank, sv, rcond = sp.polyfit(x, y, 1, full=True)
>>> print("Model parameters: %s" % fp1)
 Model parameters: [ 2.57152281 1002.10684085]

これにより近似関数は以下となる。

f(x) = 2.57152281 * x + 1002.10684085

ちなみに近似誤差はresidualsのことなので確認。

>>> print(residuals)
 [ 3.19874315e+08]

モデルパラメータからモデル関数を作ることができる。

>>> f1 = sp.poly1d(fp1)
>>> print(error(f1, x, y))
 319874314.777

モデルをグラフに描画する。
以下のコマンドを、グラフ作成の間に入れる(自分はplt.grid()の前に入れた、正直どこに入れたらいいかわからん)

>>> fx = sp.linspace(0, x[-1], 1000)
>>> plt.plot(fx, f1(fx), linewidth=4)
>>> plt.legend(["d=%i" % f1.order], loc="upper left")

次数が2の多項式曲線の場合のモデルは以下になる。

>> f2p = sp.polyfit(x, y, 2)
>>> print(f2p)
 [ 1.04688184e-02 -5.21727812e+00 1.96921629e+03]
>>> f2 = sp.poly1d(f2p)
>>> print(error(f2, x, y))
 182006476.432

載っているコマンドはここまで。
あとは同封されているファイルを実行すると、ch01ディレクトリと同階層にpngファイルが8枚生成される。

python analyze_webstats.py

理解しないと・・・!

参考

実践 機械学習システム

本「実践 機械学習システム」の第1章 Pythonではじめる機械学習

コメント

タイトルとURLをコピーしました