機械学習は平行四辺形を予測できるか？（１）外挿ってできるかな？

##機械学習って外挿できるのか？

[兵庫県マテリアルズ・インフォマティクス講演会（第4回）講演2「記述子設計手法」](https://web.pref.hyogo.lg.jp/sr11/mi4.html)で兵庫県立大学高度産業科学技術研究所の藤井先生が、記述子の設計について講演をされていました。ランク落ちのところがまだ少し理解ができていませんが、とても良い講演だったと思います。勉強になりました。

講演の途中に三角形の例があって、なるほどと思ったので、ちょっと平行四辺形を例に遊んでみました。

###問題：平行四辺形の面積を２辺の長さと２辺の間の角度の３つの特徴量が与えられた時に、面積を予測できるか？また外挿は可能か？

まず、次の図形の平行四辺形の面積を出すために、２辺の長さと２辺の間の角度をランダムに１０００個作成しました。辺の長さは１００～１０００の間、角度は９０度以下です。

![sihenkei.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336017/f8768f3a-44d2-c965-8b8c-530b9f6134e1.jpeg)

高校の数学くらいで考えると、平行四辺形の面積の公式は、底辺と高さをかければ出ることがわかっていますが、高さがわからないので、三角関数をつかって、高さを求めます。

```math
height = b*sin(c)
```
高さが求まったら、それに底辺をかけます。

```math
\begin{align}
area &= height*a\\
&=b*sin(c)*a
\end{align}
```
仰々しく書きましたが、まぁ、高校の数学レベルですので、簡単ですね。
これで、３つの特徴量（長さa,b、角度c）と目的変数の面積（area）のデータセットが出来ました。

ここで問題です。
問１．平行四辺形は機械学習できるでしょうか？また精度は？
問２．機械学習の結果から、外挿はできるでしょうか？辺の長さの学習で計算した外の数値が与えられた時に、予測できるでしょうか？

問２は、当然、機械学習だから外挿はできないはずですが、どんな感じになるか、示したものが意外とないので、計算してみました。平行四辺形くらいなら外挿できるのでしょうか？

####問１．平行四辺形は機械学習できるでしょうか？また精度は？

３つの機械学習をつかってみました。
・LASSO回帰
・ランダムフォレスト
・ニューラルネットワーク
いずれも`scikit-learn`を使用しています。LASSOを使っているのは、後で記述子設計で特徴量を増やして特徴量選択して遊ぶために、特徴量が少ないですが、Lasooで計算しています。
ちなみにLassoのαは１、ニューラルネットワーク(MLP)の隠れ層は１００で計算してみました・

結果です。決定係数は、こんな感じになりました。

|決定係数　 |学習|テスト|
| -------------- | ---------- |---------- |
|Lasso回帰 |0.796|0.778|
|ランダムフォレスト| 0.998|0.989|
|ニューラルネットワーク　　|0.919|0.913|

これを見るとランダムフォレストがよくて、次にニューラルネットワークが良いように見えますが、グラフを見るとどうでしょうか？
![lasso.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336017/4750f73b-b7cc-857e-9c1a-d09dce83f2b9.png)
![randomforest.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336017/81fec6fc-f9d6-a65c-9b58-ad4eed5a6aac.png)
![mlp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336017/b9f72b21-f928-af9d-76f1-22ae73b92160.png)



ランダムフォレストはきれいに予測できました。ニューラルネットワーク（ＭＬＰ）も少しひろがっていますが、これもよく予測できています。Lasso回帰では、数値が大きい方はよく予測できていますが、小さい方は予測が広がっています。

####問２．機械学習の結果から、外挿はできるでしょうか？辺の長さの学習で計算した外の数値が与えられた時に、予測できるでしょうか？
この学習器を使って、数値の小さい領域と大きい領域は果たして予測可能でしょうか？

||ａ　|ｂ |角度ｃ|
|---| -------------- | ---------- |---------- |--|
|学習用|100～1000|100～1000|0～90|ランダムに1000個作成|
|外挿下側検討用|10～90 |500|45|b,cを固定|
|外挿上限検討用|1010～2000 |500|45|b,cを固定|
これでどうなるでしょうか？
ｂとｃは、内挿で、ａのみ外挿です。一つだけならなんとかなるでしょうか？

![gaisoukentou.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336017/65133fd8-4204-be59-4b5b-4c9583e7ee5f.jpeg)

![qiita_you.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336017/3f54611f-8d26-d120-4f6a-f4b07b26c092.jpeg)

計算した結果のグラフです。
予想どうり？予想外？
![lasso_gaisou.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336017/04343bfd-1425-bb7e-416c-ab3de6fc31b8.png)
![rf_gaisou.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336017/1b410165-62c1-1345-579a-9607129ca46d.png)

![mlp_gaisou.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336017/78b20034-48fd-d37d-a46d-cd0997d4c949.png)
赤い線が対角線ですが、ランダムフォレストもニューラルネットワークも少しの外挿でも全然予測ができません。ニューラルネットワークなんか、見当違いの数値になっています。なんともなりませんでしたね。
線形回帰のLasso回帰は、外挿の予測がよくできています。

数値予測の時の外挿は、よほど気をつけないといけないですね。３つのうちの一つだけが、学習の特徴量から外れているだけで、線形回帰以外は、こんな結果になってしまうから、気をつけましょう。

###少しでも外挿しようと思ったら、線形回帰で外挿を使いましょう。

今日はここまでですが、逆に内挿に見えて外挿というのはどうなのでしょうか？
####問３：小さい値と大きい値で学習して、その間は予測できるか？
想像すれば、これも線形回帰以外は予測できないよね、きっと。

これは次の記事で
[機械学習は平行四辺形を予測できるか？（２）内挿みたいなのに外挿ってどうなるかな？？](https://qiita.com/motoyuki1963/items/a5adb0beaaa66bf71a19)

では、この平行四辺形辺は続きます。