TensorFlowのチュートリアル から回帰による予測方法を学ぶ

TensorFlowのチュートリアル から回帰分析による予測について勉強したのでメモします。これから学習する人の参考になれば幸いです。

  • 回帰分析とは
    • 単回帰分析とは
    • 重回帰分析とは
  • TensorFlowのチュートリアル
    • チュートリアルの概要 
    • データの準備
    • モデルの構築
    • モデルの検証

回帰分析とは


回帰分析とは、連続するデータを関数モデルに適用し、変数からデータの値を分析・予測することです。つまり、y=f(x)というモデルを適用することで、説明変数 xから目的変数 yを予測することです。

連続するデータというのがキーワードで、機械学習の中では連続的な値を予測するために用います。例えば、価格や確率を予測するのに利用します。今回のチュートリアルでは自動車の燃費量を予測しています。

一方、分類法は目的によって離散的な値を予測することもあります。以下の「TensorFlowのチュートリアルから2クラス分類について学ぶ」で例に出した2クラス分類法はシグモイド関数を使っているので連続的な値ですが、出力が0か1(否定的か肯定的か)のみの場合は離散的な値の予測となります。

単回帰分析とは


単回帰分析とは、一つの説明変数から一つの目的変数で成り立つ回帰分析です。

例) y = ax + b

重回帰分析とは


重回帰分析とは、二つ以上の説明変数から一つの目的変数で成り立つ回帰分析です。

例)y = a1x1 + a2x2 + b

TensorFlowのチュートリアル


TensorFlowのチュートリアル 「回帰:燃費を予測する」を実施して、回帰による予測について勉強します。詳細については、実際にチュートリアルを実施するのが一番理解を深めると思いますので、あくまでも学習の補佐として読んでいただければと思います。

チュートリアルの概要


このチュートリアルでは、1970年代後半から1980年代初めの自動車の燃費を予測するモデルを構築し、自動車の排気量や馬力などから燃費を予測します。

このチュートリアルも大きく以下の流れに沿って進みます。

  • データの準備
  • モデルの構築
  • モデルの検証

データの準備


データのダウンロード


データは、UCI Machine Learning Repositoryから取得しており、それぞれの自動車に対して以下の情報が含まれています。

  • MPG・・・自動車の走行燃費量(miles per gallonの略)
  • Cylinders・・・自動車のシリンダー数
  • Displacement・・・自動車の排気量
  • Horsepower・・・自動車の馬力
  • Weight・・・自動車の重さ
  • Acceleration・・・自動車の加速性能
  • Model Year・・・自動車の製造年
  • Origin・・・自動車の製造元(1~3で区別しており、1がUSA、2がEurope、3がJapan)

データのクレンジング


ここでは以下を実施しています。

  • データが欠損している自動車のデータを削除
  • 製造元の”Origin”列を”USA”, “Europe”, “Japan”に変換して0と1で表現

ラベルと特徴量の分離


ここでは目的変数である燃費量(MPG)を説明変数から削除しています。燃費量を予測したいのに、予測するデータの中に燃費量が入っていると意味ないからです。

データの正規化


 データの特徴量の範囲(min~maxの間)が広いとモデルの訓練が難しくなるそうで、( データの特徴量 – 代表値 ) / 標準偏差で正規化を行っています。

モデルの構築


krasのSequentialモデルを利用してモデルを構築しています。

  model = keras.Sequential([
    layers.Dense(64, activation='relu', input_shape=[len(train_dataset.keys())]),
    layers.Dense(64, activation='relu'),
    layers.Dense(1)
  ])

Sequentialモデルとは、層を積み重ねたモデルのことです。このモデルを利用する場合は、最初のレイヤーに入力のshapeについて情報を与える必要があります。情報を与える方法として以下の3通りあり、チュートリアルでは以下の方法でinput_shape引数にデータセットの列数を指定しています。

  • 最初のレイヤーの input_shape引数を指定する.この引数にはshapeを示すタプルを与えます(このタプルの要素は整数か Noneを取ります.Noneは任意の正の整数を期待することを意味します).

参照元:https://keras.io/ja/getting-started/sequential-model-guide/

また、ここではモデルの活性化関数(activation)にreluを利用しています。
reluは正規化線形関数で、0と説明変数を比較して大きい値を目的変数とする関数です。0以上の値が返ってくる、かつ勾配が一定になることから、勾配消失に有効な関数です。

reluを活性化関数にすることで、ニューラルネットワークのイメージは以下のようになります。

モデルのコンパイルは以下のように記述しています。

  optimizer = tf.keras.optimizers.RMSprop(0.001)

  model.compile(loss='mse',
                optimizer=optimizer,
                metrics=['mae', 'mse'])

損失関数がmse(Mean Squared Error:平均二乗誤差)で、オプティマイザーには学習率0.001のRMSpropアルゴリズムが利用されています。評価関数には、mae(Mean Absolute Error: 平均絶対誤差)とmse(Mean Squared Error:平均二乗誤差)が利用されています。

モデルの全体図は以下の通りです。

モデルの検証


モデルの訓練


訓練用データを引数にmodel.fit関数を使って、モデルを訓練しています。

チュートリアルではモデルを1000エポック訓練しますが、100エポックを過ぎてから検証スコアが悪化するので、検証スコアが10エポック以内に改善しなかったら訓練を止めるようにEary Stoppingを使っています。

# patience は改善が見られるかを監視するエポック数を表すパラメーター
early_stop = keras.callbacks.EarlyStopping(monitor='val_loss', patience=10)

history = model.fit(normed_train_data, train_labels, epochs=EPOCHS,
                    validation_split = 0.2, verbose=0, callbacks=[early_stop, PrintDot()])

最後の結論にもありますが、Early Stoppingは過学習を防止するのに有効な手法です。しかしチュートリアルでは、Early Stoppingを使うことで、40エポック辺りで訓練が終了してしまい訓練用データが少なくなってしまうという事態に陥っています。この辺りはチューニングが必要になってくると思われます。

モデルのテスト


テストデータを引数にmodel.predict関数を使って、燃費量を予測しています。誤差は少ないようですが、訓練用データが少ないために正規頒布の形にはなってないみたいですね。

以上です。