とある三流プログラマーの覚書

機械学習、自然言語処理を中心にIT系の話題を書いていく予定です

『実践機械学習システム』1章

『実践機械学習システム』1章をやってみた記録

はじめに

機械学習勉強のために、O'Reillyの『実践機械学習システム』を買ってきました。

とりあえず理論は置いといて、コード書いて試してみること優先です。

ちなみに例の黄色い本を本屋で軽く読んでみましたが、すぐに挫折しました。

1章の内容

過去のWEBトラフィックデータから、将来のトラフィックを予測するという課題を通して、典型的な機械学習によるデータ分析の手順を紹介しています。

典型的な手順とは以下の通りです。

  1. データを読み込み、データを整形する
  2. 入力データの調査および解釈を行う
  3. 学習アルゴリズムにどのような形でデータを入力するのが相応しいか分析を行う
  4. 正しいモデルと学習アルゴリズムを選択する
  5. 結果に対して正確な評価を行う

また、よく使われるライブラリである、NumPy, SciPy, Matplotlibが紹介されています。

メモ

NumPyについて

数値計算を高速に行うために、型付きの多次元配列と、配列を操作する数学関数を提供するライブラリです。

無駄なコピーをしない、配列や条件式で配列の要素にアクセスできるといった特徴があります。

import numpy as np

a = np.array([1, 10, 100, -5, 1000, -55])

# 配列の次元数を変換
b = a.reshape((3,2))
print(b)
>>>[[   1   10]
>>>[ 100   -5]
>>>[1000  -55]]

# 通常はコピーされない
b[0][0] = 77
print(a)        
>>>[  77   10  100   -5 1000  -55]

# コピーするときは
c = a.reshape((3,2)).copy()
c[0][0] = 400
print(a)
>>>[  77   10  100   -5 1000  -55]

# 配列でアクセス
print(a[np.array([2,4])])
>>>[ 100 1000]

# 条件式でアクセス
print(a[a>10])
>>>[  77  100 1000]

# 1章で使った主な関数
x = np.array([1, 2, 3, 4, 5])
y = np.array([2, 4, 6, 8, 10])

# numpy.polyfit(x, y, deg) 回帰分析、xとyをdeg次式で回帰分析した結果を返す
f = np.polyfit(x, y, 1)
print(f)
>>>[  2.00000000e+00   3.97205465e-16]

# 配列xをランダムに並べ替えて返す
z = np.random.permutation(x) 
print(z)
>>> [3 1 4 2 5]

# numpy.linspace(start, stop, num=50) startからstopまでの間のnum個の要素を返す
a = np.linspace(1, 10, 20)
print(a)
>>>[  1.           1.47368421   1.94736842   2.42105263   2.89473684
>>>   3.36842105   3.84210526   4.31578947   4.78947368   5.26315789
>>>   5.73684211   6.21052632   6.68421053   7.15789474   7.63157895
>>>   8.10526316   8.57894737   9.05263158   9.52631579  10.        ]
   

SciPyについて

NumPyの配列を利用して、多くの数値計算アルゴリズムを提供しています。

SciPyの名前空間からNumPyの名前空間にアクセスできます。

import numpy as np
import scipy as sp

sp.polyfit is np.polyfit
>>>True

Matplotlibについて

グラフ描画ライブラリです。

Pythonでデータ処理をするときは、だいたいこれで可視化するのが一般的のようです。

import matplotlib.pyplot as plt

x = np.array([1, 2, 3, 4, 5])
y = np.array([2, 4, 6, 8, 10])

# 散布図を書く
plt.scatter(x,y)    
plt.title("title")
plt.xlabel("x-axis")
plt.ylabel("y-axis")
plt.autoscale(tight=True)  

# 凡例を左上に表示する
plt.legend(["legend"], loc="upper left") 

# グリッド線を表示する 
plt.grid()
plt.show()