気温予想AIを作ってみる

#概要
Pythonの機械学習ライブラリScikit-learnを使って明日の気温を予測するAIを作ります！
Python環境はあるものとして、scikit-learnの [データセットを使っての機械学習](https://chusotsu-program.com/scikit-learn-iris/)くらいはできたほうがいいと思います。

#環境
OS:Windows
言語:Python
エディター:Geany


#データを集める
AIに学習させるための気象データを集めましょう。
今回は気象庁のHPから過去の気象データをダウンロードします。

https://www.data.jma.go.jp/gmd/risk/obsdl/

平均気温(℃)、降水量の合計(mm)、日照時間(時間)、最深積雪(cm)、平均風速(m/s)等のデータをダウンロードしましょう。

#AIモデルを決める
学習モデルは様々な種類がありますがとりあえず、種類を見分ける「クラス分類」と数値を予測する「回帰」を知っていればいいでしょう。
Scikit-learnのアルゴリズムチートシートを見てモデルを決めます。![scikit-learn-cheat-sheet-0-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2398061/cf88c16b-06b9-c05e-9113-966e55acc164.png)
今回は「サンプル数は50以上」→「カテゴリー予測ではない」→「サンプル数は10万以下」→「説明変数のすべてが重要」として**RidgeRegression**(線形)と**EnsembleRegressors**(非線形)の2種類が選べます。
相関係数を使えばどちらにすればいいかわかりそうですが、とりあえずどっちもやってみましょう！

#RidgeRegression(線形)
作成したAIモデルにスコアをつけるプログラム。
値が大きいほど良い (0<score<1)

```python:tenkiAI
# -*- coding: utf-8 -*-
import re
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn import linear_model,ensemble,tree

#平均気温(℃)	降水量の合計(mm)	日照時間(時間)	最深積雪(cm)	平均風速(m/s)	最高気温(℃)	最低気温(℃)
#データファイルを開く
f=open('data.csv','r')
d=re.split('[,\n]',f.read())
f.close()

#目的変数の配列を作成する
target=[]
for i in d[0::5]:
	target.append(i)
del target[-1]

#目的変数に対応する要素を消す
del d[::5]

#NumPy配列を作成する
d = np.array(d, dtype='float64')
target = np.array(target, dtype='float64')

#説明変数(2次元)を作成する
data=d.reshape(int(len(d)/4),4)

#明日の予測を出すために説明変数の最初の要素だけ消す
data=np.delete(data,len(target)-1,0)
#明日の予測を出すために目的変数の最後の要素だけ消す
target=np.delete(target,-1)

#学習用データとテスト用データで分ける
traind, testd, traint, testt =train_test_split(data,target, test_size=0.2)

#AIモデルを作成する
clf = linear_model.Ridge (alpha = .5)
#学習させる
clf.fit (traind,traint)

print('スコア:'+str(clf.score(testd,testt)))
```
>配列を処理するコードが大体でAIモデルの作成と学習はたった2行で出来ます。

>```python
#AIモデルを作成する
clf = linear_model.Ridge (alpha = .5)
#学習させる
clf.fit (traind,traint)
```

結果はこうなります。

```:実行結果
スコア:0.3898366399644769
```
ひっっく！
線形のモデルではだめそうですね。
#EnsembleRegressors(非線形)
AIモデルを変えただけのコードです。

```python:tenkiAI
# -*- coding: utf-8 -*-
import re
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn import linear_model,ensemble,tree

#平均気温(℃)	降水量の合計(mm)	日照時間(時間)	最深積雪(cm)	平均風速(m/s)	最高気温(℃)	最低気温(℃)
#データファイルを開く
f=open('data.csv','r')
d=re.split('[,\n]',f.read())
f.close()

#目的変数の配列を作成する
target=[]
for i in d[0::5]:
	target.append(i)
del target[-1]

#目的変数に対応する要素を消す
del d[::5]

#NumPy配列を作成する
d = np.array(d, dtype='float64')
target = np.array(target, dtype='float64')

#説明変数(2次元)を作成する
data=d.reshape(int(len(d)/4),4)

#明日の予測を出すために説明変数の最初の要素だけ消す
data=np.delete(data,len(target)-1,0)
#明日の予測を出すために目的変数の最後の要素だけ消す
target=np.delete(target,-1)

#学習用データとテスト用データで分ける
traind, testd, traint, testt =train_test_split(data,target, test_size=0.2)

#AIモデルを作成する
clf = ensemble.BaggingRegressor(tree.DecisionTreeRegressor(), n_estimators=100, max_samples=0.3)
#学習させる
clf.fit (traind,traint)

print('スコア:'+str(clf.score(testd,testt)))

```

```:実行結果
スコア:0.618826501230546
```
かなり良くなりました！

predictという関数を使えば渡したデータの予測値が出てきます。

```python:
#ある日の 降水量の合計(mm),日照時間(時間),最深積雪(cm),平均風速(m/s) のデータ
t=[[0,3.8,1,1]]
#予測値の算出
pre = clf.predict(t)
print(pre)
```

#まとめ
AIモデルは線形がだめなら非線形を選んでやってみましょう！
学習させるデータの中に日にちの情報などを追加してみればもっと精度がよくなるかも。