実体と情報のはざま

いつかデータサイエンティストになって世界を読み解く仕事がしたい!

データセットの分割

 データサイエンスの初めの一歩として、有名なIrisデータセットをいじり始めている。先日はデータの中身をプロットしたり散布図行列をつくってみたりした。データが俯瞰できたので、さっそく何かしらの機械学習をやってみようと思ったのだが、その前にやることがあった。
Numpyに最適なコマンドが!
 機械学習に入る前にデータセットをトレーニング用とテスト用に分割しなくてはならないようだ。そりゃそうか。以前Kaggleからダウンロードしてちょっと覗いてみたTitanicのデータセットチュートリアル用だからトレーニングとテストが初めから分割されていた。しかし、通常は一連のデータがぶわ~と並んでいるだけである。
 そこで、どうやってデータを分割するかあれこれ考えてはみたものの、すっきりしたアルゴリズムになかなかならなくて。。Numpy配列のデータ型の扱いづらさ(私が不慣れなだけですが。。)も拍車をかけて、も~こんなところで時間を浪費するなんて~!と、参考文献(一番下で紹介)を丸パクリも頭によぎったが、本のテクニックはテクニカルすぎて勉強にならんと思い直し、原点に戻って試行錯誤した。その結果、振り返ってみれば大したことはなく、Numpyの"shuffle"というコマンドを使うと自分としては見通しの良いデータの分割ができた。”shuffle”はデータ行列を勝手にシャッフルしてくれる!
 その結果を反映したデータ分割プログラムがコレ。元データを丸々読み込んで、データ部分のみをシャッフル(1行!)し、分割する簡単なプログラム。これで十分。

import numpy as np
import matplotlib.pyplot as plt

Iris=np.genfromtxt('Iris.csv',delimiter=',',dtype=str)#まずは全部読み出し
IrisR=np.copy(Iris)
np.random.shuffle(IrisR[1:,:])#シャッフル!
n=np.shape(Iris)             

A,B=8,2#全データを A:B=training:test に分割
a=np.uint32(n[0]*A/(A+B))
Iris_train=np.copy(IrisR[0:a+1,:])#トレーニングデータ
Iris_test=np.copy(IrisR[a:,:])#テストデータ部分
Iris_test[0,:]=np.copy(IrisR[0,:])#テストデータ完成
np.savetxt('Iris_training.csv',Iris_train,delimiter=',',fmt='%20s')#出力
np.savetxt('Iris_test.csv',Iris_test,delimiter=',',fmt='%20s')#出力

 このあと続くグラフ化プログラムはのせてないけど、グラフで内容を説明するとこんな感じ。
 まずは、元データ。50個おきに値が異なるグループがある。
f:id:myuteru:20170603090750p:plain
 で、次がシャッフル後のプロット。この初めの8割をトレーニングデータ、残り2割をテストデータとしてCSV形式で保存するようにしてある。
f:id:myuteru:20170603090847p:plain

 今回の件に関してデータサイエンスのエキスパートがどのように取り組んでいるかが垣間見れるのが、下記の本である。

 この本はscikit-learn(機械学習ライブラリ)などをフル活用して、実務的な部分でデータとどう向き合うかを教えてくれる。内容のレベルが高いのでまだ理解できていないことが多いが、要所とデータ処理の流れは特に分かり易くかかれていて頼りになる。例えば、今回のようにデータを分割する際に、どれくらいの割合で分割すべきかの勘所なんかも書いてあって興味深い。