仮想通貨で遊ぶ日記

リスクは低く! 志も低く。そんな仮想通貨の遊び方

機械学習でポンコツくん(仮称)がおりこうになる可能性

 使うプログラム言語を選定している際に、Python機械学習やら科学計算がが云々という説明をちらほらと見かけたのです。
 機械学習なんて言われてもチャットボットくらいしか思いつかないので、ちょっと調べてみたところデータマイニング分野の最前線に位置する技術のようで。

 もしかして過去のマーケット情報を食わせたら値動きの予想とかしてくれるのではないか、と思いつくのも自然なことです。ぐぐれば同じことをやってみた人は大勢いて自分の思いつきが後押しされているようで心強い。
 更には取り扱うのが株式やら為替ではなく、余計な外的要因が絡みづらい仮想通貨だというのもプラスに働くのではないか、という目論見もあります。
 それに、元々はごちゃごちゃと条件式を書いていく予定だったことを考えたら楽ができそうですしね。プログラムの書き方を思い出すところから始めなくてはいけない私にとっては大変助かるのです。

 問題があるとすれば、

 機械学習について私が何も知らない

 ことなんですよね。色々読んでみても触りの部分しか分からんでやんの。
 でも、まぁそれでも一応機械学習をさせてみることはできました。
 まだHitBTCからのデータ取得が手付かずなので、何か別の、簡単にデータが用意できて学習効果が分かりやすいサンプルについて考えた結果、

 足し算を教えてみた!

 何言ってんだこのバカ、と思うかもしれません。ですが単純にans = a + b;とか書いて結果が出るものでも、経験則から答えを導き出すってすごいことじゃないですか。
 小学校に入っておはじきなんかで覚えたことが一瞬でできちゃうわけですよ。
 そんなわけで実践。

 まずは足し算に使うランダムな数字とその答えをCSVで10件程度用意します。整数2ケタと小数点1ケタの足し算です。これを学習器に食わせ、同じケタでは芸がないので学習用データよりも大きな数の計算をさせるわけですが、どうなるのでしょうね。

0.0〜99.9までの数字二つとその和

9.0,73.3,82.3
19.6,86.5,106.1
0.2,48.1,48.3
5.0,94.6,99.6
92.2,55.1,147.3
30.2,38.7,68.9
39.5,80.6,120.1
72.3,82.3,154.6
78.1,99.8,177.9
58.6,99.2,157.8

 
学習データよりも桁の多い計算をさせてみる

# coding:utf-8

import pandas;
import random;
from sklearn.linear_model import LinearRegression as scimodel

# [[a, b, ans], ...]
data = pandas.read_csv('b.csv');

# 計算対象と答えを分離
samples = [];
targets = [];
for line in data.get_values():
    samples.append(line[:-1]);
    targets.append(line[-1]);

# 学習器を教育
ponkotsu = scimodel().fit(samples, targets);

# 計算させてみる
random.seed();
for i in range(0, 10):
    a = random.randrange(0, 100000) / 100;
    b = random.randrange(0, 100000) / 100;
    c = round(a + b, 2);
    predict = ponkotsu.predict([[a, b]]);
    print(str(a)+' + '+str(b)+' = '+str(predict[0])+'('+str(c)+')');

 さて、これを走らせるとどうなるか。カッコの中は普通に計算した正答になります。

:~/test$ python3 b.py
978.09 + 999.21 = 1977.3(1977.3)
183.6 + 516.79 = 700.39(700.39)
149.92 + 528.56 = 678.48(678.48)
380.26 + 270.02 = 650.28(650.28)
39.48 + 985.59 = 1025.07(1025.07)
295.65 + 8.53 = 304.18(304.18)
367.84 + 745.36 = 1113.2(1113.2)
196.29 + 184.56 = 380.85(380.85)
189.76 + 864.25 = 1054.01(1054.01)
170.29 + 821.14 = 991.43(991.43)

 なんてお利口さん! あの少ないデータから完璧に足し算をマスターしているよ。

 自分で書いたプログラムの方が合っているか分からないけどすごい!

 足し算をマスターさせたくらいでいい気になっていますが本来処理したいデータはもっと複雑です。それに私が機械学習について全く分からないのが致命的なんですよね。
 色々と調べていきながらどのように使えるか考えていく必要があります。