ホーム » TensorFlow 2.0 » TensorFlow 2.0 : Tutorials : データのロードと前処理 :- pandas.DataFrame をロードする

TensorFlow 2.0 : Tutorials : データのロードと前処理 :- pandas.DataFrame をロードする

TensorFlow 2.0 : Beginner Tutorials : データのロードと前処理 :- pandas.DataFrame をロードする (翻訳/解説)

翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 10/06/2019

* 本ページは、TensorFlow org サイトの TF 2.0 – Beginner Tutorials – Load and preprocess data の以下のページを
翻訳した上で適宜、補足説明したものです:

* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。

 

無料セミナー開催中 クラスキャット主催 人工知能 & ビジネス Web セミナー

人工知能とビジネスをテーマにウェビナー (WEB セミナー) を定期的に開催しています。スケジュールは弊社 公式 Web サイト でご確認頂けます。
  • お住まいの地域に関係なく Web ブラウザからご参加頂けます。事前登録 が必要ですのでご注意ください。
  • Windows PC のブラウザからご参加が可能です。スマートデバイスもご利用可能です。

お問合せ : 本件に関するお問い合わせ先は下記までお願いいたします。

株式会社クラスキャット セールス・マーケティング本部 セールス・インフォメーション
E-Mail:sales-info@classcat.com ; WebSite: https://www.classcat.com/
Facebook: https://www.facebook.com/ClassCatJP/

 

データのロードと前処理 :- pandas.DataFrame をロードする

このチュートリアルは pandas dataframes をどのように tf.data.Dataset にロードするかのサンプルを提供します。

このチュートリアルは Cleveland Clinic Foundation for Heart Disease により提供される小さい データセット を使用します。CSV には数百行あります。各行は患者を表し、各カラムは属性を記述します。患者が心臓疾患を持つか否かを予測するためにこの情報を使用します、これはこのデータセットの二値分類タスクです。

 

pandas を使用してデータを読む

from __future__ import absolute_import, division, print_function, unicode_literals

import pandas as pd
import tensorflow as tf

心臓データセットを含む csv ファイルをダウンロードします。

csv_file = tf.keras.utils.get_file('heart.csv', 'https://storage.googleapis.com/applied-dl/heart.csv')
Downloading data from https://storage.googleapis.com/applied-dl/heart.csv
16384/13273 [=====================================] - 0s 0us/step

pandas を使用して csv ファイルを読みます。

df = pd.read_csv(csv_file)
df.head()

age sex cp trestbps chol fbs restecg thalach exang oldpeak slope ca thal target
0 63 1 1 145 233 1 2 150 0 2.3 3 0 fixed 0
1 67 1 4 160 286 0 2 108 1 1.5 2 3 normal 1
2 67 1 4 120 229 0 2 129 1 2.6 2 2 reversible 0
3 37 1 3 130 250 0 0 187 0 3.5 3 0 normal 0
4 41 0 2 130 204 0 2 172 0 1.4 1 0 normal 0

df.dtypes
age           int64
sex           int64
cp            int64
trestbps      int64
chol          int64
fbs           int64
restecg       int64
thalach       int64
exang         int64
oldpeak     float64
slope         int64
ca            int64
thal         object
target        int64
dtype: object

dataframe のオブジェクトである thal カラムを離散数値に変換します。

df['thal'] = pd.Categorical(df['thal'])
df['thal'] = df.thal.cat.codes
df.head()

age sex cp trestbps chol fbs restecg thalach exang oldpeak slope ca thal target
0 63 1 1 145 233 1 2 150 0 2.3 3 0 2 0
1 67 1 4 160 286 0 2 108 1 1.5 2 3 3 1
2 67 1 4 120 229 0 2 129 1 2.6 2 2 4 0
3 37 1 3 130 250 0 0 187 0 3.5 3 0 3 0
4 41 0 2 130 204 0 2 172 0 1.4 1 0 3 0

 

tf.data.Dataset を使用してデータをロードする

pandas dataframe から値を読むために tf.data.Dataset.from_tensor_slices を使用します。

tf.data.Dataset を使用する優位点の一つはそれが単純で、高度に効率的なデータ・パイプラインを書くことを可能にすることです。より多くのことを見い出すには loading data ガイド を読んでください。

target = df.pop('target')
dataset = tf.data.Dataset.from_tensor_slices((df.values, target.values))
for feat, targ in dataset.take(5):
  print ('Features: {}, Target: {}'.format(feat, targ))
Features: [ 63.    1.    1.  145.  233.    1.    2.  150.    0.    2.3   3.    0.
   2. ], Target: 0
Features: [ 67.    1.    4.  160.  286.    0.    2.  108.    1.    1.5   2.    3.
   3. ], Target: 1
Features: [ 67.    1.    4.  120.  229.    0.    2.  129.    1.    2.6   2.    2.
   4. ], Target: 0
Features: [ 37.    1.    3.  130.  250.    0.    0.  187.    0.    3.5   3.    0.
   3. ], Target: 0
Features: [ 41.    0.    2.  130.  204.    0.    2.  172.    0.    1.4   1.    0.
   3. ], Target: 0

pd.Series は __array__ プロトコルを実装していますので、それは np.array や tf.Tensor を使用するところでは殆どどこでも透過に使用できます。

tf.constant(df['thal'])

データセットをシャッフルしてバッチ化します。

train_dataset = dataset.shuffle(len(df)).batch(1)

 

モデルを作成して訓練する

def get_compiled_model():
  model = tf.keras.Sequential([
    tf.keras.layers.Dense(10, activation='relu'),
    tf.keras.layers.Dense(10, activation='relu'),
    tf.keras.layers.Dense(1, activation='sigmoid')
  ])

  model.compile(optimizer='adam',
                loss='binary_crossentropy',
                metrics=['accuracy'])
  return model

model = get_compiled_model()
model.fit(train_dataset, epochs=15)
WARNING:tensorflow:Layer sequential is casting an input tensor from dtype float64 to the layer's dtype of float32, which is new behavior in TensorFlow 2.  The layer has dtype float32 because it's dtype defaults to floatx.

If you intended to run this layer in float32, you can safely ignore this warning. If in doubt, this warning is likely only an issue if you are porting a TensorFlow 1.X model to TensorFlow 2.

To change all layers to have dtype float64 by default, call `tf.keras.backend.set_floatx('float64')`. To change just this layer, pass dtype='float64' to the layer constructor. If you are the author of this layer, you can disable autocasting by passing autocast=False to the base Layer constructor.

Epoch 1/15
303/303 [==============================] - 2s 7ms/step - loss: 3.1701 - accuracy: 0.5809
Epoch 2/15
303/303 [==============================] - 1s 3ms/step - loss: 0.9615 - accuracy: 0.6733
Epoch 3/15
303/303 [==============================] - 1s 3ms/step - loss: 0.8341 - accuracy: 0.6535
Epoch 4/15
303/303 [==============================] - 1s 3ms/step - loss: 0.8440 - accuracy: 0.7030
Epoch 5/15
303/303 [==============================] - 1s 3ms/step - loss: 0.7243 - accuracy: 0.6898
Epoch 6/15
303/303 [==============================] - 1s 3ms/step - loss: 0.6807 - accuracy: 0.7030
Epoch 7/15
303/303 [==============================] - 1s 3ms/step - loss: 0.7206 - accuracy: 0.7030
Epoch 8/15
303/303 [==============================] - 1s 3ms/step - loss: 0.6427 - accuracy: 0.7162
Epoch 9/15
303/303 [==============================] - 1s 3ms/step - loss: 0.6158 - accuracy: 0.7162
Epoch 10/15
303/303 [==============================] - 1s 3ms/step - loss: 0.5526 - accuracy: 0.7294
Epoch 11/15
303/303 [==============================] - 1s 3ms/step - loss: 0.5217 - accuracy: 0.7492
Epoch 12/15
303/303 [==============================] - 1s 3ms/step - loss: 0.5208 - accuracy: 0.7558
Epoch 13/15
303/303 [==============================] - 1s 3ms/step - loss: 0.5160 - accuracy: 0.7393
Epoch 14/15
303/303 [==============================] - 1s 3ms/step - loss: 0.5308 - accuracy: 0.7558
Epoch 15/15
303/303 [==============================] - 1s 3ms/step - loss: 0.4587 - accuracy: 0.7822

<tensorflow.python.keras.callbacks.History at 0x7f06b0788fd0>

 

特徴カラムへの代替

辞書をモデルへの入力として渡すことは tf.keras.layers.Input 層の適合する辞書を作成し、任意の前処理を適用して functional api を使用してそれらをスタックするほどに容易です。これを特徴カラムへの代替として利用できます。

inputs = {key: tf.keras.layers.Input(shape=(), name=key) for key in df.keys()}
x = tf.stack(list(inputs.values()), axis=-1)

x = tf.keras.layers.Dense(10, activation='relu')(x)
output = tf.keras.layers.Dense(1, activation='sigmoid')(x)

model_func = tf.keras.Model(inputs=inputs, outputs=output)

model_func.compile(optimizer='adam',
                   loss='binary_crossentropy',
                   metrics=['accuracy'])

tf.data で使用される pd.DataFrame のカラム構造を保持する最も容易な方法は pd.DataFrame を辞書に変換し、そしてその辞書をスライスすることです。

dict_slices = tf.data.Dataset.from_tensor_slices((df.to_dict('list'), target.values)).batch(16)
for dict_slice in dict_slices.take(1):
  print (dict_slice)
({'thal': <tf.Tensor: id=14778, shape=(16,), dtype=int32, numpy=array([2, 3, 4, 3, 3, 3, 3, 3, 4, 4, 2, 3, 2, 4, 4, 3], dtype=int32)>, 'ca': <tf.Tensor: id=14769, shape=(16,), dtype=int32, numpy=array([0, 3, 2, 0, 0, 0, 2, 0, 1, 0, 0, 0, 1, 0, 0, 0], dtype=int32)>, 'trestbps': <tf.Tensor: id=14780, shape=(16,), dtype=int32, numpy=
array([145, 160, 120, 130, 130, 120, 140, 120, 130, 140, 140, 140, 130,
       120, 172, 150], dtype=int32)>, 'restecg': <tf.Tensor: id=14775, shape=(16,), dtype=int32, numpy=array([2, 2, 2, 0, 2, 0, 2, 0, 2, 2, 0, 2, 2, 0, 0, 0], dtype=int32)>, 'slope': <tf.Tensor: id=14777, shape=(16,), dtype=int32, numpy=array([3, 2, 2, 3, 1, 1, 3, 1, 2, 3, 2, 2, 2, 1, 1, 1], dtype=int32)>, 'cp': <tf.Tensor: id=14771, shape=(16,), dtype=int32, numpy=array([1, 4, 4, 3, 2, 2, 4, 4, 4, 4, 4, 2, 3, 2, 3, 3], dtype=int32)>, 'fbs': <tf.Tensor: id=14773, shape=(16,), dtype=int32, numpy=array([1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0], dtype=int32)>, 'oldpeak': <tf.Tensor: id=14774, shape=(16,), dtype=float32, numpy=
array([2.3, 1.5, 2.6, 3.5, 1.4, 0.8, 3.6, 0.6, 1.4, 3.1, 0.4, 1.3, 0.6,
       0. , 0.5, 1.6], dtype=float32)>, 'chol': <tf.Tensor: id=14770, shape=(16,), dtype=int32, numpy=
array([233, 286, 229, 250, 204, 236, 268, 354, 254, 203, 192, 294, 256,
       263, 199, 168], dtype=int32)>, 'sex': <tf.Tensor: id=14776, shape=(16,), dtype=int32, numpy=array([1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1], dtype=int32)>, 'exang': <tf.Tensor: id=14772, shape=(16,), dtype=int32, numpy=array([0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0], dtype=int32)>, 'age': <tf.Tensor: id=14768, shape=(16,), dtype=int32, numpy=
array([63, 67, 67, 37, 41, 56, 62, 57, 63, 53, 57, 56, 56, 44, 52, 57],
      dtype=int32)>, 'thalach': <tf.Tensor: id=14779, shape=(16,), dtype=int32, numpy=
array([150, 108, 129, 187, 172, 178, 160, 163, 147, 155, 148, 153, 142,
       173, 162, 174], dtype=int32)>}, <tf.Tensor: id=14781, shape=(16,), dtype=int64, numpy=array([0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0])>)
model_func.fit(dict_slices, epochs=15)
Epoch 1/15
19/19 [==============================] - 1s 28ms/step - loss: 1.8827 - accuracy: 0.5677
Epoch 2/15
19/19 [==============================] - 0s 5ms/step - loss: 0.9474 - accuracy: 0.6634
Epoch 3/15
19/19 [==============================] - 0s 5ms/step - loss: 0.8700 - accuracy: 0.6898
Epoch 4/15
19/19 [==============================] - 0s 5ms/step - loss: 0.8689 - accuracy: 0.6634
Epoch 5/15
19/19 [==============================] - 0s 5ms/step - loss: 0.8240 - accuracy: 0.6799
Epoch 6/15
19/19 [==============================] - 0s 5ms/step - loss: 0.7939 - accuracy: 0.6733
Epoch 7/15
19/19 [==============================] - 0s 5ms/step - loss: 0.7711 - accuracy: 0.6766
Epoch 8/15
19/19 [==============================] - 0s 5ms/step - loss: 0.7479 - accuracy: 0.6799
Epoch 9/15
19/19 [==============================] - 0s 5ms/step - loss: 0.7244 - accuracy: 0.6964
Epoch 10/15
19/19 [==============================] - 0s 5ms/step - loss: 0.7016 - accuracy: 0.6997
Epoch 11/15
19/19 [==============================] - 0s 5ms/step - loss: 0.6800 - accuracy: 0.7129
Epoch 12/15
19/19 [==============================] - 0s 5ms/step - loss: 0.6596 - accuracy: 0.7129
Epoch 13/15
19/19 [==============================] - 0s 5ms/step - loss: 0.6405 - accuracy: 0.7162
Epoch 14/15
19/19 [==============================] - 0s 4ms/step - loss: 0.6227 - accuracy: 0.7261
Epoch 15/15
19/19 [==============================] - 0s 5ms/step - loss: 0.6062 - accuracy: 0.7261

<tensorflow.python.keras.callbacks.History at 0x7f06a055ab00>
 

以上



AI導入支援 #2 ウェビナー

スモールスタートを可能としたAI導入支援   Vol.2
[無料 WEB セミナー] [詳細]
「画像認識 AI PoC スターターパック」の紹介
既に AI 技術を実ビジネスで活用し、成果を上げている日本企業も多く存在しており、競争優位なビジネスを展開しております。
しかしながら AI を導入したくとも PoC (概念実証) だけでも高額な費用がかかり取組めていない企業も少なくないようです。A I導入時には欠かせない PoC を手軽にしかも短期間で認知度を確認可能とするサービの紹介と共に、AI 技術の特性と具体的な導入プロセスに加え運用時のポイントについても解説いたします。
日時:2021年10月13日(水)
会場:WEBセミナー
共催:クラスキャット、日本FLOW(株)
後援:働き方改革推進コンソーシアム
参加費: 無料 (事前登録制)
人工知能開発支援
◆ クラスキャットは 人工知能研究開発支援 サービスを提供しています :
  • テクニカルコンサルティングサービス
  • 実証実験 (プロトタイプ構築)
  • アプリケーションへの実装
  • 人工知能研修サービス
◆ お問合せ先 ◆
(株)クラスキャット
セールス・インフォメーション
E-Mail:sales-info@classcat.com