사내 연구회 기계 학습 입문(8.기온 예측해 보자)

오늘의 주제는 '과거의 기상 데이터를 이용한 기온 예측'입니다.

소재



지난 10년간 기상 데이터를 사용하여 어느 날의 기온을 예측하고 싶습니다.
기상 데이터는 기상청 사이트에 공개되어 있으므로 이 데이터(csv 파일)를 다운로드하여 사용합시다.

기상청 사이트
↑를 클릭해, 우선은, 「거점을 선택한다」에서 [사이타마]→[고시야]를 선택해 주세요.

계속해서 「항목을 선택한다」로 데이터의 종류:일별치, 항목으로서 일평균 기온을 선택해 주세요.


계속해서 「기간을 선택한다」로 2009년 1월 1일~2018년 12월 31일을 지정해 주십시오.


지정한 내용이 올바른지 확인한 후 [CSV 파일 다운로드] 버튼을 누르십시오.


파일 이름은 "data.csv"로 C:\ml-intro 바로 아래에 저장하십시오.

데이터를 보자.



「data.csv」를 텍스트 에디터로 열면 ↓와 같이 되어 있네요.
방해하는 헤더행도 있거나 하고, 이대로는 사용할 수 있을 것 같지 않으므로, 가공해 사용합시다.


「data.csv」를 학습에 사용할 수 있는 데이터에 가공해, 「koshigaya_kion.csv」라고 하는 다른 파일명으로 보존한다.
# 
# ダウンロードした「data.csv」を学習に使えるデータへ加工し、「koshigaya_kion.csv」という別のファイル名で保存
# 
in_file = "data.csv"
out_file = "koshigaya_kion.csv"

# CSVファイルを読み込む
with open(in_file, "rt", encoding="Shift_JIS") as fr:
    lines = fr.readlines()

# 先頭から5レコード分を削除し、新たな行ヘッダをつける
lines = ["年,月,日,気温,品質,均質\n"] + lines[5:]

# / を , に置換している(年、月、日をカンマで分離するため)
lines = map(lambda v: v.replace('/', ','), lines)

# joinで改行付きの全レコードを結合したあと、stripメソッドで最終レコードの改行だけを取り除く
result = "".join(lines).strip()

# 加工された結果を out_file で指定したファイル名で出力する
with open(out_file, "wt", encoding="utf-8") as fw:
    fw.write(result)

print("saved.")

가공 후의 파일(파일명:koshigaya_kion.csv)


목표까지의 단계


  • 「koshigaya_kion.csv」를 읽어들입니다.
  • 훈련용 데이터(2009~2017년)와 시험용 데이터(2018년)를 작성한다.
  • 훈련 데이터를 사용하여 학습한다.
  • 시험용 데이터를 주어 2018년(1년분)의 기온을 예측한다.
  • "예측된 결과"와 "2018년의 정답"을 그래프에 플롯하여 결과의 ​​정확도를 살펴본다.

  • 학습에 사용하는 알고리즘은 선형 회귀를 사용합니다.
    [참고 정보] htps : // Enginee rs.ぇぢぢgぱrk. 이. jp/? p=872

    여기에서가 본제! 기계 학습 프로그램을 작성해 봅시다.



    ## 필요한 라이브러리 가져오기
    from sklearn.linear_model import LinearRegression
    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    

    ## 1. 'koshigaya_kion.csv'를 로드합니다.
    # 平均気温データ(越谷市 2009年1月~2018年12月までの10年分)の読み込み
    temper_data = pd.read_csv('koshigaya_kion.csv', encoding="utf-8")
    
    

    ## 2. 훈련용 데이터(2009~2017년)와 테스트용 데이터(2018년)를 작성한다.
    # 元データを訓練用(9年)とテスト用(1年)に一旦分離
    train_year = (temper_data["年"] <= 2017)  # 2017年までを訓練用
    test_year = (temper_data["年"] >= 2018)   # 2018年以降をテスト用
    interval = 6
    
    # 過去6日分(説明変数) と その翌日(目的変数) をセットとした訓練用データを9年分作る
    def make_data(data):
        x = [] # 説明変数
        y = [] # 目的変数
        temps = list(data["気温"])
        for i in range(len(temps)):
            if i < interval: continue
            y.append(temps[i])
            xa = []
            for p in range(interval):
                d = i + p - interval
                xa.append(temps[d])
            x.append(xa)
        return (x, y)
    
    train_x, train_y = make_data(temper_data[train_year])  # 訓練用データ
    test_x, test_y = make_data(temper_data[test_year])  # テスト用データ
    

    ## 3. 훈련 데이터를 사용하여 학습.
    lr = LinearRegression(normalize=True)
    lr.fit(train_x, train_y)
    

    ## 4. 테스트용 데이터를 주어 2018년(1년분)의 기온을 예측한다.
    pre_y = lr.predict(test_x)
    

    ## 5. 「예측한 결과(파란색)」와 「2018년의 정답(빨간색)」을 그래프에 플롯하여 결과의 ​​정밀도를 살펴본다.
    plt.figure(figsize=(10, 6), dpi=100)
    plt.plot(test_y, c='r')
    plt.plot(pre_y, c='b')
    plt.savefig('tenki-kion-lr.png')
    plt.show()
    

    파랑과 빨강의 라인이 그렇게 크게는 떨어져 있지 않네요!


    요약



    이번에는 실제 기상 데이터를 바탕으로 '회귀 분석'에 의한 미래의 기온 예측을 해 보았습니다.
    다음 번은, 좀 더 업무의 데이터를 취급해 보고 싶다,,, 검토중!

    좋은 웹페이지 즐겨찾기