3
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【IBM Watson】気象観測データを元に平均気温を予測する - scikit-learn

Posted at

#はじめに

  • IBM Watson上でCSVを読み込んだあとPandasでデータ操作した記事の続きです。
  • 今回は、DLした気象観測データを機械学習させて、平均気温を予測させてみます。
  • が、実際に行う事は、可読性も加味し、過去の気象観測データのうち「最低気温」と「最高気温」、「平均気温」のみを扱っています。

気象庁のサイトから学習データをDLしてCSVファイルを編集

  • ここから、任意の地点、任意の期間の気象データをDLしてください。
  • 項目として「日最高気温」、「日最低気温」、「日平均気温」はCSVに含めてください。

image.png

  • 地点、項目、期間などを選択したら、「CSVファイルをダウンロード」ボタンをクリックしてください。
  • DLしたCSVファイルを任意のエディタで開いてください。

image.png

  • ヘッダに無駄な行が含まれているので、削除。かつ、カラムが日本語となっているので、任意の英数の名称に変換してください。エンコードもUTF-8に修正してください。
  • ちなみに私は以下のように修正しました。

image.png

  • 今回使用するカラムは以下を想定しています。
    • 最高気温(℃) → 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()

image.png

  • 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度となっていますので、良い精度です。

image.png

  • 上記だけだと、分かりづらいので、最高気温30度、最低気温10度で平均気温を予測させて見ましょう。
test_arr = [[30,10]]
model.predict(test_arr)

出力結果=>
array([ 19.55658127])
  • 平均気温19.55658127度なので、妥当な線なのではないでしょうか。

#まとめ

  • 今回は分かりやすさを求めたので、最高気温と最低気温から平均気温を求めるシンプルなものでした。もう少し、「日平均雲量」、「日合計全天日射量」といった要素を組み入れて予測したら面白くなると思いますので、ぜひトライしてみてください。
3
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?