AI学習者・実務家の「疑問」を解消する

外資系IT企業で、主に火力発電所のAI最適化に従事 →2019年6月: 米国SAS社が主催する ”SaS Analytics Hackathon”で優勝

複数の出力(Multiple Output)ができるモデルの作り方

イントロ

1つのアーキテクチャで、2つの予測値を出すモデルの作り方、共有します。

学習データの説明

「ボストン不動産価格」のデータセットを使用します。

説明変数:

  1. LSTAT: 給与の低い職業に従事する人口の割合 (%)
  2. RM: 住居の平均部屋数

ターゲット:

  1. MEDV: 家賃価格
  2. NOX: NOx の濃度

本編

下記のコードの中で、大事なのは、2つです。

  1. ターゲット変数二つをどう、準備すればいいのか?
  2. モデルの出力層をどう表現すればいいのか?

この2つに注目してください。

 # 前処理
df = pd.DataFrame(data=load_boston()["data"], columns=load_boston()["feature_names"])
df["Price"] = load_boston()["target"]

scaler = StandardScaler()
X = scaler.fit_transform(df[["LSTAT", "RM"]].values)
y = scaler.fit_transform(df[["Price", "NOX"]])

X_train, X_test, y_train, y_test = train_test_split(X,y, random_state=0, test_size=0.05)

# ネットワークのアーキテクチャの定義
def DNN(num_layer, mid_units, initial, activation_hidden, input_dim):
    """
    二つのoutputを出力するニューラルネットワーク
    
    num_layer: 隠れ層の数 (int)
    mid_units: ニューロンの数 (list, inside of which is int)
    initial:重みの初期化(string)
    activation_hidden: 活性化関数
   input_dim:入力層の次元
   
    """
    inputs = Input(shape=(input_dim,))
    x = Dense(mid_units[0], activation=activation_hidden)(inputs) 
    
    # Define the hidden layers
    for i in range(num_layer):
        x = Dense(mid_units[i], activation=activation_hidden, kernel_initializer=initial)(x)
       
    predictions = Dense(2, activation="linear")(x)

    model = Model(inputs=inputs, outputs=predictions)

    return model

# モデルの学習
model = DNN(2, [3, 3], "normal", "relu", 2)
model.compile(optimizer="adam", loss="mean_squared_error", metrics=["mae"])
model.fit(X_train, y_train, epochs = 100, batch_size = 512, validation_split = 0.5, verbose = 0)

# モデルの評価
print("モデルのストラクチャー")
print("出力層の数が2になっていることに注目!!!")
print(model.summary())
print("----------------------------------------------------------------------------------------------------------------------")
print("モデルの評価(不動産価格の予想の精度とNOXの予想の精度の平均): {}".format(mean_absolute_error(model.predict(X_test), y_test)))

複数出力ができるモデルの世界観と実装の解説は、近日追記します!