月別アーカイブ: 2017年11月

tensorflow カテゴリデータのfeature column

画像や音声の話題が多いtensorflowですが、数値やカテゴリーデータの記事が少ないかもしれません。
以下はCSVファイルを読み込み、
COL1~COL4までは数値なのですが、カテゴリデータ、COL5を数値として扱います。
これらCOL1~COL5までの説明変数で、目的変数Yを推定させるというコード。

かなりぐちゃぐちゃなデータでも、割と簡単に推定してくれました。

import numpy as np
import pandas as pd
import tensorflow as tf
import scipy.stats as sp

steps=1
n_epochs=1

hidden_u=[500]

#モデルの保存フォルダを指定。estimatorのパラメータとなる。
md='/home/hiroshi/TEMP_TENSORFLOW'

dat=pd.read_csv('test.csv').dropna()
Y_COL='Y'
Y=dat[Y_COL]

#################################################################################
#カテゴリーデータを扱う場合。(入力が数値で、扱いがカテゴリーの場合)
COL1=tf.feature_column.embedding_column(tf.feature_column.categorical_column_with_hash_bucket("COL1",hash_bucket_size=999999,dtype=tf.int64),1)
COL2=tf.feature_column.embedding_column(tf.feature_column.categorical_column_with_hash_bucket("COL2",hash_bucket_size=999999,dtype=tf.int64),1)
COL3=tf.feature_column.embedding_column(tf.feature_column.categorical_column_with_hash_bucket("COL3",hash_bucket_size=999999,dtype=tf.int64),1)
COL4=tf.feature_column.embedding_column(tf.feature_column.categorical_column_with_hash_bucket("COL4",hash_bucket_size=9,dtype=tf.int64),1)

#数値データを扱う場合
COL5=tf.feature_column.numeric_column("COL5")

#feature columnを定義する
fc=[COL1,COL2,COL3,COL4,COL5]
#################################################################################

FEATURES=["COL1","COL2","COL3","COL4","COL5"]
X=dat.loc[:,FEATURES]


my_input_fn = tf.estimator.inputs.pandas_input_fn(
        x=X,
        y=Y,
        num_epochs=n_epochs,
        shuffle=False
        )

estimator = tf.estimator.DNNRegressor(
        feature_columns=fc,
        hidden_units=hidden_u,
        model_dir=md
        )

estimator.train(input_fn=my_input_fn,steps=steps)


#成績の表示
train_metrics=estimator.evaluate(input_fn=my_input_fn)
print(train_metrics["global_step"],"回目の学習  ave_loss:",train_metrics["average_loss"])

#テストデータの作成
temp_test_input_fn = tf.estimator.inputs.pandas_input_fn(
        x=pd.DataFrame({"COL1":[123],"COL2":[456],"COL3":[789],"COL4":[10],"COL5":[500]}),
        y=None,
        num_epochs=1,
        shuffle=False
        )

temp_ar=[]
temp_test_metrics=estimator.predict(input_fn=temp_test_input_fn)
for p,q in enumerate(temp_test_metrics):
    temp_ar.append(q['predictions'].item(0))
print('推定結果:',temp_ar)

tensorflow モデルの保存

estimatorのmodel_dirにフォルダのパスを指定するだけ。
学習を中断、再開した記録が残っていきます。
フォルダを消すと学習結果も全て消えます。

md=’/home/hiroshi/TEMP_MODEL’

estimator = tf.estimator.DNNRegressor(
feature_columns=fc,
hidden_units=hidden_u,
model_dir=md
)

tensorflow フィボナッチ数

tennsorflowのDNNRegressorを使って、一つ前の数字から次の数字を推定させてみました。
XとYの数列を変更すれば、結構色々な数列を推定します。

結果を10回目と10000回目の学習で出力すると、精度の違いがよく分かります。

import numpy as np
import pandas as pd
import tensor flow as tf

#フィボナッチ数列を12番目まで与えてみる
X=pd.DataFrame({'x1':[1,2,3,4,5,6,7,8,9,10,11,12]})
Y=pd.DataFrame({'y':[1,1,2,3,5,8,13,21,34,55,89,144]})
test_ar=[17,18,19]
ans_ar=[987,1597,2584]

#パラメータはこれだけ
steps=1000
n_epochs=10000
h_n=[100,100]

c=tf.feature_column.numeric_column('x1',shape=(1))

my_input_fn = tf.estimator.inputs.pandas_input_fn(
        x=X,
        y=Y,
        num_epochs=n_epochs,
        shuffle=False
        )

test_input_fn = tf.estimator.inputs.pandas_input_fn(
        x=pd.DataFrame({'x1':test_ar}),
        y=None,
        num_epochs=1,
        shuffle=False
        )

estimator = tf.estimator.DNNRegressor(
        feature_columns=[c],
        hidden_units=h_n
        )

for i in range(9):
    estimator.train(input_fn=my_input_fn,steps=i+1)
    train_metrics=estimator.evaluate(input_fn=my_input_fn,steps=i+1)
    print(i+1,'回学習しました。 平均誤差は',train_metrics['average_loss'],'です。')

estimator.train(input_fn=my_input_fn,steps=10)
train_metrics=estimator.evaluate(input_fn=my_input_fn,steps=10)
test_metrics=estimator.predict(input_fn=test_input_fn)
ar=[]
for p,q in enumerate(test_metrics):
    ar.append(q['predictions'].round(decimals=1).item(0))
result=pd.DataFrame({'正解':ans_ar,'推定':ar})
print('--------------------------------------------------')
print('10回学習しました。平均誤差は',train_metrics['average_loss'],'です。')
print('【推定結果】')
print(result)
print('--------------------------------------------------')
print('--------------------------------------------------')

estimator.train(input_fn=my_input_fn,steps=steps)
train_metrics=estimator.evaluate(input_fn=my_input_fn,steps=steps)
test_metrics=estimator.predict(input_fn=test_input_fn)
ar=[]
for p,q in enumerate(test_metrics):
    ar.append(q['predictions'].round(decimals=1).item(0))

result=pd.DataFrame({'正解':ans_ar,'推定':ar})
print(steps,'回学習しました。平均誤差は',train_metrics['average_loss'],'です。')
print('【推定結果】')
print(result)
print('--------------------------------------------------')

tensorflowのインストール(python)

インストール手順は以下のページを参考
https://www.tensorflow.org/install/install_mac#common_installation_problems

1. virtualenvによる環境構築
google公式ページによるとvirtualenvでの構築が進められている
$mkdir ~/tensorflow
$virtualenv –system-site-packages ~/tensorflow
$source ~/tensorflow/bin/activate
(tensorflow)$
(tensorflow)$deactivate

アンインストールは
$rm -rf ~/tensorflow

バイナリのurlを指定してもできる
(tensorflow)$pip install –upgrade https://storage.googleapis.com/tensorflow/mac/cpu/tensorflow-1.3.0-py2-none-any.whl
インストールまでできたが、実行するとエラーとなった。
何となくprotobufというのが影響しているらしいが、詳しく分からない

2. bash for windows
スタートの右クリック->設定->アプリと機能->機能の有効化で、それっぽいのを有効にして再起動
sudo pip –proxy=http://xxx.xxx.xxx.xxx:xxxx install –upgrade pip
・bash_profileで設定していても、ここでプロキシ設定をする必要がある
・sudoを忘れないこと!!
sudo pip –proxy=http://xxx.xxx.xxx.xxx:xxxx install tesorflow

[結論]

どんな環境であれ、virtualboxとかでUbuntuを入れてインストールするのが確実

チュートリアル

import tensorflow as tf
node1=tf.constant(3.0,dtype=tf.float32)
node2=tf.constant(4.0)

print(node1,node2)

sess=tf.Session() #ここでsessionを作る。

print(sess.run([node1,node2])) #これで[3.0,4.0]と表示される


node3=tf.add(node1,node2)
print(node3) #まだメタ情報が表示されるだけ
print(sess.run(node3)) #これで7.0が表示される

a=tf.placeholder(tf.float32) #aという変数ができるみたいな感じ
b=tf.placeholder(tf.float32)
adder_node=a+b #a+bを行う関数ができた感じ
print(sess.run(adder_node,{a:3,b:4.5})) #足し算がなされて7.5が表示される
print(sess.run(adder_node,{a:[1,3],b:[2,4]})) #ベクトルでも計算可能

add_and_triple=adder_node*3 #関数を用いた関数みたいな感じ
print(sess.run(add_and_triple,{a:3,b:4.5})) #22.5

W=tf.Variable([.3],dtype=tf.float32) #Variableは初期値を設定できる
b=tf.Variable([-.3],dtype=tf.float32)
x=tf.placeholder(tf.float32)
linear_model=W*x+b
print(sess.run(linear_model,{x:[1,2,3,4,]})) #そのまま実行するとエラーになる

#global variableの初期化
init=tf.global_variables_initializer() 
sess.run(init)

print(sess.run(linear_model,{x:[1,2,3,4,]})) #[0,0.3,0,6,0,9]のように計算される