maruyama
GitHub に コード全体 を置きました。
ここでは、コード全体から抜粋して要点のみ説明します。
何もしませんでした。
全部ニューラルネットワークに委ねました。
ニューラルネットワークを使いました。
カテゴリ変数をそのまま入れて、ニューラルネットワークに embedding させました。
それ以外の工夫は特になく、全結合を 3 段重ねる形に落ち着きました。
def build(self):
x_num_input = tf.keras.Input(shape = (self.num_dim,), name = "x_num")
x_cat_input = tf.keras.Input(shape = (self.cat_dim,), name = "x_cat")
x_cat = tf.keras.layers.Embedding(self.vocab_size, self.emb_dim, name = "embedding")(x_cat_input)
x_cat = tf.keras.layers.Flatten(name = "flatten")(x_cat)
x = tf.keras.layers.concatenate([x_num_input, x_cat], name = "concat")
x = tf.keras.layers.BatchNormalization(name = "hidden_norm1")(x)
x = tf.keras.layers.Dense(self.hidden_units, activation = tf.keras.layers.ReLU(), name = "hidden_dense1")(x)
x = tf.keras.layers.BatchNormalization(name = "hidden_norm2")(x)
x = tf.keras.layers.Dense(self.hidden_units, activation = tf.keras.layers.ReLU(), name = "hidden_dense2")(x)
x = tf.keras.layers.BatchNormalization(name = "output_norm")(x)
x = tf.keras.layers.Dense(1, name = "output_dense")(x)
self.model = tf.keras.Model(inputs = [x_num_input, x_cat_input], outputs = x)
評価指標が MAE だったため、損失関数には MAE っぽい形だが微分可能な Huber loss を使いました。
オプティマイザーには Adam を使いました。
オプティマイザーのパラメータは特にチューニングしませんでした。
def compile(self):
self.loss_object = tf.keras.losses.Huber()
self.optimizer = tf.keras.optimizers.Adam()
$$ \frac{p(x \mid y=\mathrm{test})}{p(x \mid y=\mathrm{train})} =\frac{\frac{p(x,y=\mathrm{test})}{p(y=\mathrm{test})}}{\frac{p(x,y=\mathrm{train})}{p(y=\mathrm{train})}} =\frac{p(x,y=\mathrm{test})}{p(x,y=\mathrm{train})}\bullet\frac{p(y=\mathrm{train})}{p(y=\mathrm{test})} \propto\frac{p(x,y=\mathrm{test})}{p(x,y=\mathrm{train})} $$
$$ \frac{p(x,y=\mathrm{test})}{p(x,y=\mathrm{train})} =\frac{\frac{p(x,y=\mathrm{test})}{p(x)}}{\frac{p(x,y=\mathrm{train})}{p(x)}} =\frac{p(y=\mathrm{test}\mid x)}{p(y=\mathrm{train}\mid x)} $$
$$ \therefore \frac{p(x \mid y=\mathrm{test})}{p(x \mid y=\mathrm{train})} \propto\frac{p(y=\mathrm{test}\mid x)}{p(y=\mathrm{train}\mid x)} $$
データがきれいだったため、新しいことにチャレンジできるコンペでした。
いろいろ試したのに、何の工夫もないモデルが最も良い結果となってしまい、少し寂しいです。