Path: blob/master/site/ja/tutorials/keras/regression.ipynb
25118 views
Copyright 2018 The TensorFlow Authors.
回帰:燃費を予測する
回帰問題では、価格や確率といった連続的な値の出力を予測することが目的となります。これは、分類問題の目的が、(たとえば、写真にリンゴが写っているかオレンジが写っているかといった)離散的なラベルを予測することであるのとは対照的です。
このノートブックでは、古典的な Auto MPG データセットを使用し、1970 年代後半から 1980 年台初めの自動車の燃費を予測するモデルを構築します。この目的のため、モデルにはこの時期の多数の自動車の仕様を読み込ませます。仕様には、気筒数、排気量、馬力、重量などが含まれています。
このサンプルではtf.keras
APIを使用しています。詳細はこのガイドを参照してください。
Auto MPG データセット
このデータセットはUCI Machine Learning Repositoryから入手可能です。
データの取得
まず、データセットをダウンロードします。
データのクレンジング
このデータセットには、いくつか欠損値があります。
この最初のチュートリアルでは簡単化のためこれらの行を削除します。
"Origin"
列はカテゴリであり、数値ではないので、pd.get_dummies でワンホットに変換します。
注意: keras.Model
を設定して、このような変換を行うことができます。これについては、このチュートリアルでは取り上げません。例については、前処理レイヤーまたは CSV データの読み込みのチュートリアルをご覧ください。
データをトレーニング用セットとテスト用セットに分割
次に、データセットをトレーニングセットとテストセットに分割します。モデルの最終評価ではテストセットを使用します。
データの観察
トレーニング用セットの列のいくつかのペアの同時分布を見てみます。
一番上の行を見ると、燃費 (MPG) が他のすべてのパラメータの関数であることは明らかです。他の行を見ると、それらが互いの関数であることが明らかです。
全体の統計値も見てみましょう。
ラベルと特徴量の分離
ラベル、すなわち目的変数を特徴量から分離します。このラベルは、モデルに予測させたい数量です。
正規化
統計の表を見て、それぞれの特徴量の範囲がどれほど違っているかに注目してください。
スケールや値の範囲が異なる特徴量を正規化するのはよい習慣です。
これが重要な理由の 1 つは、特徴にモデルの重みが掛けられるためです。したがって、出力のスケールと勾配のスケールは、入力のスケールの影響を受けます。
モデルは特徴量の正規化なしで収束する可能性がありますが、正規化によりトレーニングがはるかに安定します。
注意: ここでは、簡単にするため実行しますが、ワンホット特徴を正規化する利点はありません。前処理レイヤーの使用方法の詳細については、前処理レイヤーの使用ガイドと Keras 前処理レイヤーを使用した構造化データの分類チュートリアルを参照してください。
正規化レイヤー
preprocessing.Normalization
レイヤーは、その前処理をモデルに組み込むためのクリーンでシンプルな方法です。
まず、レイヤーを作成します。
次にデータに .adapt()
します。
これにより、平均と分散が計算され、レイヤーに保存されます。
レイヤーが呼び出されると、入力データが返され、各特徴は個別に正規化されます。
線形回帰
DNN モデルを構築する前に、単一変数および複数変数を使用した線形回帰から始めます。
1 つの変数
単一変数の線形回帰から始めて、Horsepower
から MPG
を予測します。
tf.keras
を使用したモデルのトレーニングは、通常、モデルアーキテクチャを定義することから始まります。ここでは、tf.keras.Sequential
モデルを使用します。このモデルは、一連のステップを表します。
単一変数の線形回帰モデルには、次の 2 つのステップがあります。
入力
horsepower
を正規化します。線形変換 () を適用して、
layers.Dense
を使用して 1 つの出力を生成します。
入力の数は、input_shape
引数により設定できます。また、モデルを初めて実行するときに自動的に設定することもできます。
まず、馬力 Normalization
レイヤーを作成します。
Sequential モデルを作成します。
このモデルは、Horsepower
から MPG
を予測します。
トレーニングされていないモデルを最初の 10 の馬力の値で実行します。出力は良くありませんが、期待される形状が (10,1)
であることがわかります。
モデルが構築されたら、Model.compile()
メソッドを使用してトレーニング手順を構成します。コンパイルするための最も重要な引数は、loss
と optimizer
です。これらは、最適化されるもの (mean_absolute_error
) とその方法 (optimizers.Adam
を使用)を定義するためです。
トレーニングを構成したら、Model.fit()
を使用してトレーニングを実行します。
history
オブジェクトに保存された数値を使ってモデルのトレーニングの様子を可視化します。
後で使用するために、テスト用セットの結果を収集します。
これは単一変数の回帰であるため、入力の関数としてモデルの予測を簡単に確認できます。
複数の入力
ほぼ同じ設定を使用して、複数の入力に基づく予測を実行することができます。このモデルでは、 が行列で、 がベクトルですが、同じ を実行します。
ここでは、データセット全体に適合した Normalization
レイヤーを使用します。
入力のバッチでこのモデルを呼び出すと、各例に対して units=1
出力が生成されます。
モデルを呼び出すと、その重み行列が作成されます。これで、kernel
( の ) の形状が (9,1) であることがわかります。
Keras Model.compile
でモデルを構成し、Model.fit
で 100 エポックトレーニングします。
この回帰モデルですべての入力を使用すると、入力が 1 つだけの horsepower_model
よりもトレーニングエラーや検証エラーが大幅に低くなります。
後で使用するために、テスト用セットの結果を収集します。
DNN 回帰
前のセクションでは、単一および複数の入力の線形モデルを実装しました。
このセクションでは、単一入力および複数入力の DNN モデルを実装します。コードは基本的に同じですが、モデルが拡張されていくつかの「非表示」の非線形レイヤーが含まれる点が異なります。「非表示」とは、入力または出力に直接接続されていないことを意味します。
コードは基本的に同じですが、モデルが拡張されていくつかの「非表示」の非線形レイヤーが含まれる点が異なります。「非表示」とは、入力または出力に直接接続されていないことを意味します。
これらのモデルには、線形モデルよりも多少多くのレイヤーが含まれます。
前と同じく正規化レイヤー。(単一入力モデルの場合は
horsepower_normalizer
、複数入力モデルの場合はnormalizer
を使用)。relu
非線形性を使用する 2 つの非表示の非線形Dense
レイヤー。線形単一出力レイヤー
どちらも同じトレーニング手順を使用するため、compile
メソッドは以下の build_and_compile_model
関数に含まれています。
DNN と単一入力を使用した回帰
入力 'Horsepower'
、正規化レイヤー horsepower_normalizer
(前に定義)のみを使用して DNN モデルを作成します。
このモデルには、線形モデルよりも多少多くのトレーニング可能なレイヤーが含まれます。
Keras Model.fit
を使用してモデルをトレーニングします。
このモデルは、単一入力の線形 horsepower_model
よりもわずかに優れています。
Horsepower
の関数として予測をプロットすると、このモデルが非表示のレイヤーにより提供される非線形性をどのように利用するかがわかります。
後で使用するために、テスト用セットの結果を収集します。
完全モデル
すべての入力を使用してこのプロセスを繰り返すと、検証データセットの性能がわずかに向上します。
後で使用するために、テスト用セットの結果を収集します。
性能
すべてのモデルがトレーニングされたので、テスト用セットの性能を確認します。
これらの結果は、トレーニング中に見られる検証エラーと一致します。
モデルを使った予測
Keras Model.predict
を使用して、テストセットの dnn_model
で予測を行い、損失を確認します。
モデルの予測精度は妥当です。
次に、エラー分布を見てみましょう。
モデルに満足している場合は、後で使用できるように保存します。
モデルを再度読み込むと、同じ出力が得られます。
まとめ
このノートブックでは、回帰問題を扱うためのテクニックをいくつか紹介しました。
平均二乗誤差 (MSE) (
tf.keras.losses.MeanSquaredError
) および 平均絶対誤差 (MAE) (tf.keras.losses.MeanAbsoluteError
) は回帰問題に使われる一般的な損失関数です。MAE は外れ値の影響を受けにくくなっています。分類問題には異なる損失関数が使われます。同様に、回帰問題に使われる評価指標も分類問題とは異なります。
入力数値特徴量の範囲が異なっている場合、特徴量ごとにおなじ範囲に正規化するべきです。
過適合は DNN モデルの一般的な問題ですが、このチュートリアルでは問題ではありませんでした。これに関する詳細については、オーバーフィットとアンダーフィットのチュートリアルを参照してください。