多くのハイプの後、GoogleはついにTensorFlow 2をリリースしました。
Tensorflow 2.0を使った##分類
もしあなたがKerasライブラリを使ったことがあるのなら、大変なことになります。
TensorFlow 2.0では、分類および回帰モデルのトレーニングにKeras APIをデフォルトのライブラリとして使用するようになりました。
TensorFlow 2.0以前、TensorFlowの以前のバージョンが直面しなければならなかった大きな批判の1つは、モデル作成の複雑さに起因するものでした。
以前は、単純なロジスティック回帰モデルでさえ作成するために、グラフ、セッション、プレースホルダーをつなぎ合わせる必要がありました。
TensorFlow 2.0では、分類と回帰のモデルを作るのは朝飯前です。
では早速、TensorFlowで分類モデルを開発してみましょう。
Googleは、多くのハイプの後、ついにGoogleの旗艦ディープラーニングプラットフォームの最新バージョンであるTensorFlow 2.0をリリースしました。
TensorFlow 2.0では、待望の多くの機能が導入されています。
この記事では、TensorFlow 2.0を使用して簡単な分類と回帰モデルを開発する方法について非常に簡単に説明します。
ライブラリのインポート
データセットをアプリケーションにインポートする前に、必要なライブラリをインポートする必要があります。
import pandas as pd
import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
%matplotlib inline
import seaborn as sns
sns.set(style="darkgrid")
その前に、TensorFlowの最新版(TensorFlow 2.0)であることを確認してほしい。
TensorFlowのバージョンは以下のコマンドで確認することができます。
print(tf.__version__)
TensorFlow 2.0がインストールされていない場合は、以下のコマンドで最新バージョンにアップグレードできます。
$ pip install --upgrade tensorflow
データセットのインポート
データセットのインポート
以下のスクリプトは、データセットをインポートします。
CSVデータファイルのパスは適宜変更してください。
cols = ['price', 'maint', 'doors', 'persons', 'lug_capacity', 'safety','output']
cars = pd.read_csv(r'/content/drive/My Drive/datasets/car_dataset.csv', names=cols, header=None)
CSVファイルにはデフォルトでカラムヘッダが含まれていないので、pd.read_csv()
メソッドにカラムヘッダのリストを渡しました。
それでは、head()
メソッドを使ってデータセットの最初の5行を表示してみましょう。
cars.head()
出力されます。
データセットに含まれる7つのカラムを見ることができます。
モデルの学習
モデルを学習させるために、TensorFlow 2.0のクラスをインポートしましょう。
以下のスクリプトを実行します。
plot_size = plt.rcParams["figure.figsize"]
plot_size [0] = 8
plot_size [1] = 6
plt.rcParams["figure.figsize"] = plot_size
先ほど述べたように、TensorFlow 2.0ではモデルの学習にKeras APIを使用します。
上記のスクリプトでは、基本的に tensorflow.keras.layers
モジュールから Input
, Dense
, Activation
, Dropout
クラスをインポートしています。
同様に、tensorflow.keras.models
モジュールから Model
クラスも import
しています。
次に、分類モデルを作成します。
cars.output.value_counts().plot(kind='pie', autopct='%0.05f%%', colors=['lightblue', 'lightgreen', 'orange', 'pink'], explode=(0.05, 0.05, 0.05,0.05))
スクリプトからわかるように、このモデルには3つの密な層が含まれています。
最初の2つの密な層は、それぞれ15と10のノードを含み、relu
活性化関数を持ちます。
最後の密な層は4ノード(y.shape[1] == 4
)で、分類タスクなので softmax
活性化関数を含んでいます。
このモデルは categorical_crossentropy
損失関数と adam
オプティマイザを用いて学習される。
評価指標は精度である。
以下のスクリプトはモデルの概要を示している。
price = pd.get_dummies(cars.price, prefix='price')
maint = pd.get_dummies(cars.maint, prefix='maint')
doors = pd.get_dummies(cars.doors, prefix='doors')
persons = pd.get_dummies(cars.persons, prefix='persons')
lug_capacity = pd.get_dummies(cars.lug_capacity, prefix='lug_capacity')
safety = pd.get_dummies(cars.safety, prefix='safety')
labels = pd.get_dummies(cars.output, prefix='condition')
出力
X = pd.concat([price, maint, doors, persons, lug_capacity, safety] , axis=1)
最後に、モデルを学習させるために、以下のスクリプトを実行します。
labels.head()
モデルは50エポック学習されますが、ここでは紙面の都合上、最後の5エポックの結果のみを表示します。
y = labels.values
50回目のエポック終了時点で、学習精度は100%、検証精度は98.56%となっており、素晴らしい結果となっています。
最後に、テストセットで我々の分類モデルの性能を評価しましょう。
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.20, random_state=42)
以下はその出力です。
from tensorflow.keras.layers import Input, Dense, Activation,Dropout
from tensorflow.keras.models import Model
我々のモデルは、テストセットで97.39%の精度を達成しました。
これは100%の学習精度より少し低いですが、層とノードの数をランダムに選んだという事実を考えると、非常に良い結果です。
このモデルにさらに層を追加してノードを増やし、検証セットとテストセットでより良い結果が得られるかどうかを確認することができます。
TensorFlow 2.0による回帰問題
回帰問題では、連続値を予測することが目標になります。
このセクションでは、TensorFlow 2.0を使用して回帰問題を解く方法を紹介します。
データセット
データセット
この問題のデータセットは、以下のリンクから自由にダウンロードすることができます。
CSV ファイルをダウンロードする。
以下のスクリプトは、データセットをインポートする。
CSVファイルのパスを変更するのを忘れないように。
input_layer = Input(shape=(X.shape[1],))
dense_layer_1 = Dense(15, activation='relu')(input_layer)
dense_layer_2 = Dense(10, activation='relu')(dense_layer_1)
output = Dense(y.shape[1], activation='softmax')(dense_layer_2)
model = Model(inputs=input_layer, outputs=output)
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['acc'])
データセットの最初の5行を head()
関数で表示しましょう。
print(model.summary())
出力してみましょう。
データセットには5つのカラムがあることがわかります。
回帰モデルは最初の4列、すなわちPetrol_tax, Average_income, Paved_Highways, Population_Driver_License(%) に対して学習される。
最後のカラムであるPetrol_Consumptionの値が予測される。
出力列には離散値がなく、予測値は任意の連続値になることがおわかりいただけると思う。
モデルトレーニング
次のステップは、モデルの学習です。
このプロセスは分類の訓練と非常に似ています。
唯一の変更は、損失関数と出力密な層のノード数です。
今、我々は単一の連続値を予測しているので、出力層は1つのノードしか持ちません。
Model: "model"
_________________________________________________________________
Layer (type) Output Shape Param #=================================================================
input_1 (InputLayer) [(None, 21)] 0
_________________________________________________________________
dense (Dense) (None, 15) 330
_________________________________________________________________
dense_1 (Dense) (None, 10) 160
_________________________________________________________________
dense_2 (Dense) (None, 4) 44
=================================================================
Total params: 534
Trainable params: 534
Non-trainable params: 0
_________________________________________________________________
None
我々のモデルは、それぞれ100、50、25、1ノードを持つ4つの密な層からなる。
回帰問題において、最もよく使われる損失関数の1つは mean_squared_error
である。
以下のスクリプトはモデルの要約を表示する。
history = model.fit(X_train, y_train, batch_size=8, epochs=50, verbose=1, validation_split=0.2)
最後に、以下のスクリプトでモデルを学習させることができる。
Epoch 45/50
1105/1105 [==============================] - 0s 219us/sample - loss: 0.0114 - acc: 1.0000 - val_loss: 0.0606 - val_acc: 0.9856
Epoch 46/50
1105/1105 [==============================] - 0s 212us/sample - loss: 0.0113 - acc: 1.0000 - val_loss: 0.0497 - val_acc: 0.9856
Epoch 47/50
1105/1105 [==============================] - 0s 219us/sample - loss: 0.0102 - acc: 1.0000 - val_loss: 0.0517 - val_acc: 0.9856
Epoch 48/50
1105/1105 [==============================] - 0s 218us/sample - loss: 0.0091 - acc: 1.0000 - val_loss: 0.0536 - val_acc: 0.9856
Epoch 49/50
1105/1105 [==============================] - 0s 213us/sample - loss: 0.0095 - acc: 1.0000 - val_loss: 0.0513 - val_acc: 0.9819
Epoch 50/50
1105/1105 [==============================] - 0s 209us/sample - loss: 0.0080 - acc: 1.0000 - val_loss: 0.0536 - val_acc: 0.9856
最後の5つの学習エポックの結果は以下の通りです。
score = model.evaluate(X_test, y_test, verbose=1)
print("Test Score:", score[0])
print("Test Accuracy:", score[1])
テスト集合における回帰モデルの性能を評価するために、最もよく使われる測定基準の1つが平均2乗誤差です。
予測値と実測値の平均二乗誤差は、 sklearn.metrics
モジュールの mean_squared_error
クラスで求めることができます。
そして、その結果の平均二乗誤差の平方根を取ることができます。
以下のスクリプトを見てください。
WARNING:tensorflow:Falling back from v2 loop because of error: Failed to find data adapter that can handle input: <class 'pandas.core.frame.dataframe'="", <class 'nonetype'=""
346/346 [==============================] - 0s 55us/sample - loss: 0.0605 - acc: 0.9740
Test Score: 0.06045335989359314
Test Accuracy: 0.9739884
出力はトレーニングセットとテストセットの平均二乗誤差を示しています。
この結果は、トレーニングセットの平均二乗誤差の値がより小さいので、モデルの性能はトレーニングセットでより優れていることを示しています。
我々のモデルはオーバーフィットしています。
理由は明白で、データセットに48レコードしかなかったからです。
より良い結果を得るためには、より大きなデータセットで回帰モデルを学習させるようにしましょう。
petrol_cons = pd.read_csv(r'/content/drive/My Drive/datasets/petrol_consumption.csv')