pythonで機械学習をしたい。
オライリーから発売されている「実践 機械学習システム」を進めていく。
Macのローカルで。
目次
- データを読み込む
- 前処理とデータ整形
- 正しいモデルの選択と機械学習
1. データを読み込む
ソースコードをダウンロードしておく。
解凍したディレクトリ配下の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
理解しないと・・・!
コメント