複数出力・ラベルの回帰モデルを PyTorch で作成する方法(編集中…)

回帰モデルは、基本的には1つの連続値を予測しますが、複数の値を同時に予測したいようなケースもあると思います。

その際に、古典的な機械学習手法は、scikit-learn の MultiOutputRegressor を使用することでできるそうなのですが、DNN の場合にはどのように実装できるか、という点をメモしておこうと思います。

 

方法

2つやり方があると思います。

1つは、単純に出力層のノード数を2つにすること。2つは、出力のノード数は1つで、2つ予測値をだすことです。

前提として、2つの予測値を1つのモデル出だしたくて、教師データは1サンプルごとに[t1, t2]という形で持っているとします。

出力層のノード数を2つにする

上記のように、出力層のノード数を2つにすると、2つの値が出力されます。

教師データも[t1, t2]といった形で1サンプルごとに2つ用意してあげます。

こちらは、1種類目の教師データt1 と 2種類目の教師データt2 をあわせて、損失の計算が行われます。スケールが整っていないと、スケールが大きい方の教師データにパラメータ更新が引っ張られるような気がします。

また、t1 についてはロスを大きく見積もって、t2については小さく見積もり、みたいに種類ごとにロスの重み付けをすることができません。それをしたい場合は、次のやり方になるのかなと思います。

 

出力のノード数は1つで、2つ予測値をだす

予測する値が1つの構造にして、forward関数内で、2つ予測値を出し、返り値で2つまとめて返すように指定します。

損失関数も、2つの予測値を受け取って、それぞれでロスを算出し、重み付け和を返すようにすると少し柔軟にできるように思います。

複数のモデルが1つのモデルの中に入っているようなイメージです。

 

いったんおわり。