IoTセンサー値から、TensorFlowの線形回帰で未来予測値を計算する。機械学習の入門編

tensorFlow/機械学習の超初心者ですが。
最近、機械学習を調査する機会があったので。勉強ついでに応用アプリを検討しましたので
メモしたいと思います。
tensorFlowの調査で 統計学や、ニューラルネットワークの神経回路等の医学的な説明が
多くあり、理解するにあたってハードルが高かったのですが。
理論的な説明より。なるべくコード説明されている記事を探して勉強しました。

内容は、比較的簡単な機械学習の初心者向け
前半、tensorFlow のtutorialに近い内容
後半、応用例として IoTデータをトレーニングデータ用とした、予測値の計算機能
としています。


thanks :関連のページ.

https://www.tensorflow.org/get_started/get_started

https://github.com/tensorflow/tensorflow

https://qiita.com/TomokIshii/items/f355d8e87d23ee8e0c7a

http://hiyoko9t.hatenadiary.jp/entry/2017/10/05/210419

環境 (win7)

python 3.5.2

tensorFlow

線形回帰モデルを使用


variable, placeholder を使い。
線形回帰モデル , y = Wx + b

W= wight/重さ , b= bias/バイアス の意味らしいです。

t1.py
W = tf.Variable([0.0], dtype=tf.float32)
b = tf.Variable([0.0], dtype=tf.float32)
# Model input and output
x = tf.placeholder(tf.float32)
y = tf.placeholder(tf.float32)
linear_model = W*x + b

ロス関数の定義
学習率 = 0.01
optimizer= GradientDescentOptimizer を指定。

# loss
loss = tf.reduce_sum(tf.square(linear_model - y)) # sum of the squares
# optimizer
optimizer = tf.train.GradientDescentOptimizer(0.01)
train = optimizer.minimize(loss)

トレーニング用データ、

実行時にnan(無限大)が出力された為、2種類とも1/00 を設定
x : 時間軸(1から nまでの連番)
y : センサー実測値 、今回はセンサー温度
*) 説明用に少ない件数の配列ですが、利用時は外部api, DB等から
引当てる予定です。

x_train = [0.01, 0.02 , 0.03, 0.04, 0.05 ]
y_train = [0.13, 0.12 , 0.06, 0.11, 0.13 ]

variable初期化、セッション定義
実行

init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init) # reset values to wrong
#for i in range(1000):
for i in range(1000):
    sess.run(train, {x: x_train, y: y_train})
    if i % 100 == 0:
        print( i, sess.run(W), sess.run(b) )

全てのコード:
https://gist.github.com/kuc-arc-f/c5c9f8230b7265f330933865bc69333e


W= 0.00125409 ,b= 0.10996174
の近似値が出力されました。

ss-res1.png


センサー値の予測

上記までが、tensorFlowのtutorial内容に近い部分となります。
以降は、自作仕様的な使い方です。
予測値の精度は、いまいちでしたが。
今回は20件ほどの、トレーニングデータで試しました。
*) 上記のデータ件数と異なりますが。
方法として、上記で取得できた 線形データ (W, b)を使い予測しました。

実績と、線形の表示

クラウド側に保存してある センサー値の実績値、
tensorFlorが出力した上記線形(y =Wx +b) * 100
の比較した、折れ線グラフです。ややズレてます。。

*) 入力を各1 /100 としている為、使用時は 100倍にしています。

ss-ten1.png

考察

予測方法を考えます
現在時刻を基点として、過去ログはセンサー値をそのまま使い
未来の予測は、上記 W, bを元に計算してプロット
センサー値はデバイスから、30分間隔で。1時間に2件送信されています。
*) 例: W= 0.00125 , b= 0.1099
過去20件の次の1時間は、 20 +(2 * 1) = 22番目とします。
x = 0.22 をセット(1/100 で入力)

1時間の予測値 y= Wx + b
= ((0.00125 * 0.22) + 0.1099 ) * 100
= 11.0175 度

n番目の予測値も同様に計算。

ss-ten2.png


まとめ

精度は改善方法を探したいと思います。
トレーニングデータの件数や、学習率等で条件を変えたり
調査したいと思います。
tensorFlowを使うと、少ないコードでも
比較的カンタンに学習機能を利用できる点は、実感できた気がします。
機能的に
webシステムや、AIスピーカー連動などに組み込んで利用できるように
進めて行きたいと考えています。


関連

IoT側は、自作した省電力BLEセンサー送信機、gateway機器を使いました

device:
http://knaka0209.blogspot.jp/2017/09/RN4020-4.html
nano Pi gateway:
http://knaka0209.blogspot.jp/2017/07/nanoPi-2.html


tensorFlow/機械学習 関連まとめ

http://knaka0209.blogspot.jp/2018/01/tensorflow-matome.html

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.