機械学習 其の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となっています。これでは、単に収集したデータをそのまま使うことができないので、前処理やデータの整形をします。 その辺は次回で。