イントロ
1つのアーキテクチャで、2つの予測値を出すモデルの作り方、共有します。
学習データの説明
「ボストン不動産価格」のデータセットを使用します。
説明変数:
- LSTAT: 給与の低い職業に従事する人口の割合 (%)
- RM: 住居の平均部屋数
ターゲット:
- MEDV: 家賃価格
- NOX: NOx の濃度
本編
下記のコードの中で、大事なのは、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)))
複数出力ができるモデルの世界観と実装の解説は、近日追記します!