#はじめに
- IBM Watson上でCSVを読み込んだあとPandasでデータ操作した記事の続きです。
- 今回は、DLした気象観測データを機械学習させて、平均気温を予測させてみます。
- が、実際に行う事は、可読性も加味し、過去の気象観測データのうち「最低気温」と「最高気温」、「平均気温」のみを扱っています。
気象庁のサイトから学習データをDLしてCSVファイルを編集
- ここから、任意の地点、任意の期間の気象データをDLしてください。
- 項目として「日最高気温」、「日最低気温」、「日平均気温」はCSVに含めてください。
- 地点、項目、期間などを選択したら、「CSVファイルをダウンロード」ボタンをクリックしてください。
- DLしたCSVファイルを任意のエディタで開いてください。
- ヘッダに無駄な行が含まれているので、削除。かつ、カラムが日本語となっているので、任意の英数の名称に変換してください。エンコードもUTF-8に修正してください。
- ちなみに私は以下のように修正しました。
- 今回使用するカラムは以下を想定しています。
- 最高気温(℃) → max_templ
- 最低気温(℃) → min_templ
- 平均気温(℃) → avg_templ
#機械学習側の話
##CSVファイルの読み込み
- この記事を参考にして、上記で準備したCSVファイルを読み込んでください。
##Notebookで学習のコードを記載
- 上記までの手順で、既に、自動生成されたコードが以下のように存在しているはずです。
import types
import pandas as pd
from botocore.client import Config
import ibm_boto3
def __iter__(self): return 0
(中略)
df_data_1 = pd.read_csv(body)
df_data_1.head()
- その後のCellに以下記載。必要なカラムだけ配列に格納し、Data Frameに読み込みます。
columns = ['max_templ','min_templ','avg_templ']
data = df_data_1[columns]
data.head()
- CSVファイルから読み込んだデータを8:2で訓練データとテストデータに分割し、線形回帰で学習まで行います。
- コメントにも記載していますが、test_size=0.2で20%をテストデータ指定しています。
# 説明変数Xの準備
X_var = data.drop('avg_templ', axis=1)
X_array = X_var.as_matrix()
# 目的変数Yの準備
y_var = data['avg_templ']
y_array = y_var.as_matrix()
# scikit-learnの準備
from sklearn.model_selection import train_test_split
# 訓練データとテストデータに8:2で分割
X_train, X_test, y_train, y_test = train_test_split(X_array, y_array, test_size=0.2, random_state=0)
# 線形回帰で学習
from sklearn import linear_model
model = linear_model.LinearRegression()
model.fit(X_train, y_train)
- 学習モデルを評価します。訓練データ、テストデータともに、99%以上の精度です。
# 訓練データを用いた評価
print(model.score(X_train, y_train))
# テストデータを用いた評価
print(model.score(X_test, y_test))
出力結果=>
0.99661996229
0.996522453685
- 実際に予測してみます。まず、テストデータ配列1件目で予測
pd.DataFrame([X_test[0]], columns=columns[:-1])
print([X_test[0]])
model.predict([X_test[0]])
出力結果=>
[array([ 24.4, 18.1])]
array([ 20.83377488])
- 最高気温:24.4、最低気温:18.1の日の平均気温が20.83377488と予測しています。実際に当日の気温を確認すると、以下のように21度となっていますので、良い精度です。
- 上記だけだと、分かりづらいので、最高気温30度、最低気温10度で平均気温を予測させて見ましょう。
test_arr = [[30,10]]
model.predict(test_arr)
出力結果=>
array([ 19.55658127])
- 平均気温19.55658127度なので、妥当な線なのではないでしょうか。
#まとめ
- 今回は分かりやすさを求めたので、最高気温と最低気温から平均気温を求めるシンプルなものでした。もう少し、「日平均雲量」、「日合計全天日射量」といった要素を組み入れて予測したら面白くなると思いますので、ぜひトライしてみてください。