一緒に書く習慣を身につけましょう!「ナゲッツデイリーニュープラン・4月アップデートチャレンジ」に参加して18日目です。クリックしてイベントの詳細をご覧ください。
住宅価格予測
このセクションでは、住宅の価格を予測することにより、連続出力の問題を調査します。Boston
住宅価格データセットを使用して、住宅価格に影響を与える可能性のある13個の変数を入力として受け取ります。私たちの目的は、住宅価格の予測における誤差を最小限に抑えることです。ニューラルネットワークの実用的なアプリケーションを探ります。
目標はエラーを最小化することであるため、最小化するエラーを定義します。絶対エラー、または二乗エラーです。最適化する目的ができたので、この問題を解決するための戦略を定義しましょう。
- 入力データセットを正規化し、すべての変数の範囲を0〜1の範囲にスケーリングします。
- 指定されたデータをトレーニングデータセットとテストデータセットに分割します。
- モデルは隠しレイヤーを使用します
- Adamオプティマイザーを使用してモデルをコンパイルし、損失関数を平均絶対誤差値として定義します。
- モデルを取り付けます。
- テストデータセットで予測を行います。
- テストデータセットの予測の誤差を計算します。
モデルメソッドを定義しました。次に、のコードで実装します。
- 関連するデータセットをインポートします。
from keras.datasets import boston_housing
import numpy as np
(train_data, train_targets), (test_data, test_targets) = boston_housing.load_data()
复制代码
- すべての変数が0から1の範囲になるように、入力データセットと出力データセットを正規化します。
max_target = np.max(train_targets)
train_data2 = train_data/np.max(train_data,axis=0)
test_data2 = test_data/np.max(train_data,axis=0)
train_targets = train_targets/max_target
test_targets = test_targets/max_target
复制代码
モデル構築中にテストデータセットの値を使用する必要がないため、トレーニングデータセットの最大値でテストデータセットを正規化します。
- 入力データセットと出力データセットの準備ができたら、モデルを定義します。
from keras.models import Sequential
from keras.layers import Dense, Dropout
from keras.utils import np_utils
from keras.regularizers import l1
model = Sequential()
model.add(Dense(64, input_dim=13, activation='relu', kernel_regularizer=l1(0.1)))
model.add(Dense(1, activation='relu', kernel_regularizer=l1(0.1)))
model.summary()
复制代码
モデルの簡単な情報出力は次のとおりです。
Model: "sequential"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
dense (Dense) (None, 64) 896
_________________________________________________________________
dense_1 (Dense) (None, 1) 65
=================================================================
Total params: 961
Trainable params: 961
Non-trainable params: 0
_________________________________________________________________
复制代码
モデルが過剰適合しないように、モデル構築中にL1
正則化しました(トレーニングデータ内のデータポイントの数が少ない)。
- モデルをコンパイルして、平均絶対誤差値を最小化します。
model.compile(loss='mean_absolute_error', optimizer='adam')
复制代码
- 最後に、モデルを適合させます。
history = model.fit(train_data2,
train_targets,
validation_data=(test_data2, test_targets),
epochs=100,
batch_size=64,
verbose=1)
复制代码
- テストデータセットの平均絶対誤差を計算して出力します。
print(np.mean(np.abs(model.predict(test_data2) - test_targets))*50)
复制代码
平均絶対誤差は約であることがわかります7.7
。
7.670271360777928
复制代码
次のセクションでは、カスタム損失関数を使用して平均絶対誤差値をさらに減らす方法を学習します。
カスタム損失関数を使用する
前のセクションでは、事前定義された平均絶対誤差損失関数を使用して、客観的な最適化を実行しました。このセクションでは、を使用してカスタム損失関数を定義する方法を学習します。
使用するカスタム損失関数は、修正された平均二乗誤差値です。ここで、誤差は、実際の値の平方根と予測値の平方根の差です。カスタム損失関数は次のように定義されます。
def loss_function(y_true, y_pred):
return K.square(K.sqrt(y_pred) - K.sqrt(y_true))
复制代码
次に、フィッティング中にカスタム損失関数を使用して、前のセクションと同じ入力および出力データセットとニューラルネットワークモデルを使用してモデルをコンパイルします。
model.compile(loss=loss_function, optimizer='adam')
复制代码
上記のコードでは、損失関数をカスタム損失関数として定義しloss_function
、最終的にモデルを適合させ、テストデータセットでモデルの損失値を計算します。
history = model.fit(train_data2, train_targets,
validation_data=(test_data2, test_targets),
epochs=100,
batch_size=64,
verbose=1)
print(np.mean(np.abs(model.predict(test_data2) - test_targets))*50)
复制代码
モデルをフィッティングした後、平均絶対誤差が約。であることがわかります6.6
。これは、mean_absolute_error
損失ます。
6.566271535383652
复制代码