Pythonで機械学習を使ってみる(大失敗編)

早速大遅刻をかましましたよこの男。

というわけで初の記事投稿の時点ですでに2週間が経過しております。

週1投稿と言っていた口はどこに行ったのでしょうか。

 

さて、反省もほどほどに今回は機械学習を使って判定をしてみましょう。

今回参考にさせていただいた書籍はこちらです↓

Python機械学習プログラミング 達人データサイエンティストによる理論と実践 (impress top gear)

Python機械学習プログラミング 達人データサイエンティストによる理論と実践 (impress top gear)

 

 こちらのP49に書かれているサンプルコードを使ってやってみたいと思います。

 

sckit-learnを用いて実装しているみたいですね!!!!

ですが考えてもみてください。

このまま書き写してそのまま実行すれば正答率90%のプログラムは確かに実装できますが私が求めているのはそうじゃない。そう、お金ですね。

 

というわけで最近暴落して金額が楽しいことになっているBitcoinを使ってみましょう。

なんと私の手元には11月後半から1分毎に取得したbitcoinの価格表が存在しています!!

これを使って1分後の価格を予測してみようじゃありませんか!!!

 

このブログで書かれているコードはgithub上で公開しております。

github.com

 

というわけで早速実装

import numpy as np
# DBから持ってくるためのクラス(自作)
import select_database as sd
# データをセット
data = sd.getData()

エディタはVisualStudioCodeを使用しております。

select_databaseというのはSQLとそれを実行した結果を返すだけのアプリです。

これで変数 data には数万件の価格データが入りました。

 

ここでついでなので学習のためのデータを成型してしまいましょう。

# データ成型
def createTestData(motoData):
learnData,ansData = ,
for i in range(60,len(motoData) - 2):
unitData = []
for j in range(i-60,i):
unitData.append(motoData[j])
learnData.append(unitData)
if motoData[i] >= motoData[i + 1]:
ansData.append(0)
else:
ansData.append(1)
return learnData,ansData

今回の目的は1分後の価格予測……という風にしたかったのですが、この本のP49に書かれているのは分類です。AかBかを判定するためのプログラムです。

なので今回は過去60分間の価格から1分後に価格が上がっているかどうかを判定してみましょう。

 

 さて次にsklearnを実装します。

from sklearn.cross_validation import train_test_split
lData_train,lData_test,aData_train,aData_test = train_test_split(
lData,aData,test_size=0.3,random_state=0)

train_test_split関数は与えられた学習データ(この場合はlData)とその答えあるいはラベルデータ(この場合はaData)をテスト用のデータ(正答率を調べるためのテスト)と学習用のためのデータに分けます。

この時の割合が「test_size=0.3」の部分です。これは30%をテストデータとして使用しますという事が書いてあります。

random_state=0」はその分類の仕方をランダムにするかどうかが聞かれています。今回は使用しません。

詳しくはtrain_test_split関数でデータ分割 — PyQ 1.0 ドキュメントこちらのサイトをご覧ください。

 

さて残り少しだ!

from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
sc.fit(lData_train)
lData_train_std = sc.transform(lData_train)
lData_test_std = sc.transform(lData_test)

標準化部分なので割愛。

from sklearn.linear_model import Perceptron
ppn = Perceptron(n_iter=40,eta0=0.1,random_state=0,shuffle=True)
ppn.fit(lData_train_std,aData_train)

パーセプトロンを用いた判定を使用することを書いています。

n_iter=40」はトレーニング回数

eta0=0.1」は学習率

ここらへんはテキストをそのまま流用しました。

どのような値を入れるかは考えなくてはならないのでしょうが、今回は気にしません。

あとはfit()を使って学習を開始します。これによってppnに学習結果が保存されました。

 

次にやるのは学習結果をもとにテストを行います。

pred = ppn.predict(lData_test_std)

これだけ。

変数「pred」の中にテスト結果が入りましたのであとはこれをテストのラベルである変数「aData_test」と比較してあげれば結果が分かります。

 

あ、結果いります?

予想通りだと思いますが、以下の通りです。

正解率:51%

一分後の価格変動なんて予測できるわけないですよね!!!

 

結果としては残念でしたが調べながらプログラムを書くのはとても勉強になりました。

今後はこれを習慣化していきたいと思います。

改変しているとはいえコードが載ってしまっていていますので、怒られたら即座に消します。

それではまた来週!

 

大失敗編とありますが成功編はありません。