How many files(0-15)

競馬の予想システムで一儲を企むおっさんのヨコシマな横顔

機械学習 其の003 ~NumPy、SciPy~

SciPy

SciPyには数値計算のための各種アルゴリズム(行列計算、クラスタリング高速フーリエ変換、etc...)が実装されています。
また、SciPyの名前空間からNumPyの名前空間にアクセスするこも可能です。

# -*- coding: utf-8 -*-
import scipy, numpy

print scipy.version.full_version
print scipy.dot is numpy.dot

サンプルではSciPyのバージョンを表示し、SciPyのdot(内積)パッケージとNumPyのものとが同じかを表示しています。

%run "C:/lab/python_learn/lesson2.py"
0.15.1
True

競馬の予想システムを作ろうとしているのは、機械学習 其の001にて書いたとおりなので、ひとまず数値計算の元ネタとなるレースデータを南関東4競馬場|nankankeiba.comより収集してみます。
収集したデータは以下のような感じでtsvとして保存しています。 ちなみに、このデータは2015/08/28の大井競馬場で開催された第1レースの結果です。

ダ1,200m(外)(9頭)
着	枠	馬番	馬名	性齢	負担	馬体重	増減	騎手	調教師	タイム	着差	上がり3F	コーナー通過順	人気
1	3	3	スウェプトジョーイ	セ4	55.0	477kg	±0	瀧川寿希也	鷹見浩	1:12.7	-	38.1	1-1	7
2	7	7	マイネルファラオン	牡4	55.0	529kg	+2	楢崎功祐	赤嶺本浩	1:12.9	1 1/4	37.9	6-5	1
3	1	1	ウィークエンド	牝4	53.0	502kg	+6	増田充宏	朝倉実	1:13.5	3	38.5	5-4	4
4	6	6	シュールダンス	牡4	54.0	489kg	-4	☆瀬川将輝	渡邉和雄	1:13.6	1/2	38.8	3-3	3
5	4	4	トミケンデフバール	牡4	57.0	503kg	+3	繁田健一	宮本康	1:14.0	2	38.6	7-7	6
6	2	2	ローレンダンサー	牝6	53.0	445kg	+1	山崎良	朝倉実	1:14.4	2	39.0	7-7	5
7	8	8	ガルベス	牡7	55.0	463kg	+2	高野誠毅	久保與造	1:14.7	1 1/2	37.9	9-9	9
8	5	5	ニシノセーリング	牝4	55.0	486kg	-3	矢野貴之	佐宗応和	1:14.9	1 1/2	40.2	2-2	2
9	8	9	ガリシヤヒル	牝6	53.0	437kg	-3	町田直希	佐々木洋一	1:16.4	7	41.5	4-6	8

SciPyには、このようなデータを読み込むための機能としてgenfromtxtが用意されています。genfromtxtを使う前に、サンプルデータを加工します。具体的には、読み込むファイルの1行目と2行目は削除して読み込みます。1行目はレース全体のデータで、3行目以降の着順毎の詳細情報とカラム数が違うため、このままの状態で読み込むとフォーマットエラーが発生します。2行目については、各データの見出しとなる情報で数値解析のために必要なものではないため除外します。genfromtxtを使ったtsvファイルの読み込みサンプルは以下のとおりです。

# -*- coding: utf-8 -*-
import scipy as sp
racedata = sp.genfromtxt("racedata1.tsv", delimiter="\t")
print racedata

実行結果は次のようになります。

[[  1.    3.    3.    nan   nan  55.    nan   nan   nan   nan   nan   nan   38.1   nan   7. ]
 [  2.    7.    7.    nan   nan  55.    nan   nan   nan   nan   nan   nan   37.9   nan   1. ]
 [  3.    1.    1.    nan   nan  53.    nan   nan   nan   nan   nan   nan   38.5   nan   4. ]
 [  4.    6.    6.    nan   nan  54.    nan  -4.    nan   nan   nan   nan   38.8   nan   3. ]
 [  5.    4.    4.    nan   nan  57.    nan   nan   nan   nan   nan   nan   38.6   nan   6. ]
 [  6.    2.    2.    nan   nan  53.    nan   nan   nan   nan   nan   nan   39.    nan   5. ]
 [  7.    8.    8.    nan   nan  55.    nan   nan   nan   nan   nan   nan   37.9   nan   9. ]
 [  8.    5.    5.    nan   nan  55.    nan  -3.    nan   nan   nan   nan   40.2   nan   2. ]
 [  9.    8.    9.    nan   nan  53.    nan  -3.    nan   nan   nan   nan   41.5   nan   8. ]]

数値として取り扱えない馬名、騎手名、性齢等についてはすべてnanとなっています。タイムについても元データの表現が数値となっていないためnanとなっています。これでは、単に収集したデータをそのまま使うことができないので、前処理やデータの整形をします。 その辺は次回で。