5. 환경 분석 모델¶

5.1 데이터 불러오기¶

5.1.1 모듈 불러오기¶

In [6]:
import numpy as np
import pandas as pd
import datetime as dt

import matplotlib.pyplot as plt
import matplotlib as mpl
from matplotlib import font_manager, rc
from sklearn.model_selection import train_test_split
from sklearn.model_selection import train_test_split
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, GRU, Flatten

import warnings


# 모든 경고 메시지 무시
warnings.filterwarnings("ignore")

# 폰트 설정
font_path = "C:/Windows/Fonts/malgun.ttf"  # 한글 폰트 경로
font_name = font_manager.FontProperties(fname=font_path).get_name()
rc('font', family=font_name)
mpl.rc('axes', unicode_minus=False)

5.1.2 파일 불러오기¶

  • file 경로를 입력합니다.

    root = 'C:/Users/data/tomato'

In [7]:
root = 'C:/Users/data/tomato'  # file 경로
  • file 이름을 입력합니다.

data = pd.read_csv(root+'/전라북도_농가데이터셋_방울토마토.csv', encoding='cp949')

In [8]:
data = pd.read_csv(root+'/전라북도_농가데이터셋_방울토마토.csv', encoding='cp949') # file 이름

5.1.3 데이터 조회¶

In [9]:
# 열 개수 설정(조회하고자 하는 열 개수가 많아 100개로 설정)
pd.set_option('display.max_columns', 100)

print(data)
               시설ID    시도  시군구    품목명  품종   재배면적  시설유형  재배형태  단동/연동 구분  \
0     PF_0020760_01  전라북도  진안군  방울토마토 NaN  4,000   NaN   NaN       NaN   
1     PF_0020760_01  전라북도  진안군  방울토마토 NaN  4,000   NaN   NaN       NaN   
2     PF_0020760_01  전라북도  진안군  방울토마토 NaN  4,000   NaN   NaN       NaN   
3     PF_0020760_01  전라북도  진안군  방울토마토 NaN  4,000   NaN   NaN       NaN   
4     PF_0020760_01  전라북도  진안군  방울토마토 NaN  4,000   NaN   NaN       NaN   
...             ...   ...  ...    ...  ..    ...   ...   ...       ...   
3257  PF_0020760_01  전라북도  진안군  방울토마토 NaN  4,000   NaN   NaN       NaN   
3258  PF_0020760_01  전라북도  진안군  방울토마토 NaN  4,000   NaN   NaN       NaN   
3259  PF_0020760_01  전라북도  진안군  방울토마토 NaN  4,000   NaN   NaN       NaN   
3260  PF_0020760_01  전라북도  진안군  방울토마토 NaN  4,000   NaN   NaN       NaN   
3261  PF_0020760_01  전라북도  진안군  방울토마토 NaN  4,000   NaN   NaN       NaN   

                   수집일  외부온도  외부습도 외부 일사량  외부풍향  외부풍속  외부강우  강우감지  내부온도  내부습도  \
0     2021-02-04 10:00  -1.0   NaN    461   NaN   2.0   NaN   0.0  12.0  48.0   
1     2021-02-04 11:00   0.0   NaN    590   NaN   3.0   NaN   0.0  13.0  43.0   
2     2021-02-04 12:00   0.0   NaN    655   NaN   2.0   NaN   0.0  16.0  41.0   
3     2021-02-04 13:00   1.0   NaN    656   NaN   2.0   NaN   0.0  17.0  43.0   
4     2021-02-04 14:00   1.0   NaN    586   NaN   2.0   NaN   0.0  16.0  43.0   
...                ...   ...   ...    ...   ...   ...   ...   ...   ...   ...   
3257   2021-06-28 9:00  25.0   NaN    529   NaN   0.0   NaN   0.0  18.0  49.0   
3258  2021-06-28 10:00  26.0   NaN    525   NaN   0.0   NaN   0.0  19.0  46.0   
3259  2021-06-28 11:00  27.0   NaN    454   NaN   0.0   NaN   0.0  19.0  46.0   
3260  2021-06-28 12:00  24.0   NaN     71   NaN   2.0   NaN   0.0  16.0  54.0   
3261  2021-06-28 13:00  18.0   NaN     25   NaN   4.0   NaN   1.0  14.0  63.0   

      내부CO2  내부 일사량  토양EC  토양PH    지온  지습  (양액)총배액  (양액)총급액  (양액)배액PH  \
0     362.0     NaN   NaN   NaN   NaN NaN      NaN      NaN       NaN   
1     289.0     NaN   NaN   NaN   NaN NaN      NaN      NaN       NaN   
2     259.0     NaN   NaN   NaN   NaN NaN      NaN      NaN       NaN   
3     230.0     NaN   NaN   NaN   NaN NaN      NaN      NaN       NaN   
4     245.0     NaN   NaN   NaN   NaN NaN      NaN      NaN       NaN   
...     ...     ...   ...   ...   ...  ..      ...      ...       ...   
3257  321.0     NaN   NaN   NaN  22.0 NaN      NaN      NaN       NaN   
3258  292.0     NaN   NaN   NaN  23.0 NaN      NaN      NaN       NaN   
3259  286.0     NaN   NaN   NaN  23.0 NaN      NaN      NaN       NaN   
3260  296.0     NaN   NaN   NaN  24.0 NaN      NaN      NaN       NaN   
3261  353.0     NaN   NaN   NaN  23.0 NaN      NaN      NaN       NaN   

      (양액)공급PH  (양액)배액EC  (양액)공급EC  (양액)지온  (양액)지습  배기팬작동여부  CO2발생장치작동여부  \
0          NaN       NaN       NaN     NaN     NaN      NaN          NaN   
1          NaN       NaN       NaN     NaN     NaN      NaN          NaN   
2          NaN       NaN       NaN     NaN     NaN      NaN          NaN   
3          NaN       NaN       NaN     NaN     NaN      NaN          NaN   
4          NaN       NaN       NaN     NaN     NaN      NaN          NaN   
...        ...       ...       ...     ...     ...      ...          ...   
3257       NaN       NaN       NaN     NaN    81.0      NaN          NaN   
3258       NaN       NaN       NaN     NaN    83.0      NaN          NaN   
3259       NaN       NaN       NaN     NaN    83.0      NaN          NaN   
3260       NaN       NaN       NaN     NaN    81.0      NaN          NaN   
3261       NaN       NaN       NaN     NaN    82.0      NaN          NaN   

      보광등작동여부  난방기작동상태  난방기작동여부  유동팬작동상태  유동팬작동여부  보온커튼작동상태  보온커튼작동여부  \
0         NaN      NaN      NaN      NaN      NaN       NaN       NaN   
1         NaN      NaN      NaN      NaN      NaN       NaN       NaN   
2         NaN      NaN      NaN      NaN      NaN       NaN       NaN   
3         NaN      NaN      NaN      NaN      NaN       NaN       NaN   
4         NaN      NaN      NaN      NaN      NaN       NaN       NaN   
...       ...      ...      ...      ...      ...       ...       ...   
3257      NaN      NaN      NaN      NaN      NaN       NaN       NaN   
3258      NaN      NaN      NaN      NaN      NaN       NaN       NaN   
3259      NaN      NaN      NaN      NaN      NaN       NaN       NaN   
3260      NaN      NaN      NaN      NaN      NaN       NaN       NaN   
3261      NaN      NaN      NaN      NaN      NaN       NaN       NaN   

      차광커튼작동상태  차광커튼작동여부  우측삼중측창 작동여부  좌측삼중측창 작동여부  우측이중측창 작동여부  좌측이중측창 작동여부  \
0        100.0       NaN          NaN          NaN          NaN          NaN   
1        100.0       NaN          NaN          NaN          NaN          NaN   
2        100.0       NaN          NaN          NaN          NaN          NaN   
3        100.0       NaN          NaN          NaN          NaN          NaN   
4        100.0       NaN          NaN          NaN          NaN          NaN   
...        ...       ...          ...          ...          ...          ...   
3257     100.0       NaN          NaN          NaN          NaN          NaN   
3258     100.0       NaN          NaN          NaN          NaN          NaN   
3259      94.0       NaN          NaN          NaN          NaN          NaN   
3260     100.0       NaN          NaN          NaN          NaN          NaN   
3261     100.0       NaN          NaN          NaN          NaN          NaN   

      우측일중측창 개도  우측일중측창 온도폭  우측일중측창 설정온도  우측일중측창 작동여부  우측일중측창 작동상태  좌측일중측창 개도  \
0           NaN         NaN          NaN          NaN          NaN        NaN   
1           NaN         NaN          NaN          NaN          NaN        NaN   
2           NaN         NaN          NaN          NaN          NaN        NaN   
3           NaN         NaN          NaN          NaN          NaN        NaN   
4           NaN         NaN          NaN          NaN          NaN        NaN   
...         ...         ...          ...          ...          ...        ...   
3257        NaN         NaN          NaN          NaN          NaN        NaN   
3258        NaN         NaN          NaN          NaN          NaN        NaN   
3259        NaN         NaN          NaN          NaN          NaN        NaN   
3260        NaN         NaN          NaN          NaN          NaN        NaN   
3261        NaN         NaN          NaN          NaN          NaN        NaN   

      좌측일중측창 온도폭  좌측일중측창 설정온도  좌측일중측창 작동여부  좌측일중측창 작동상태  측창  우측이중천창 작동여부  \
0            NaN          NaN          0.0          NaN NaN         57.0   
1            NaN          NaN          0.0          NaN NaN         60.0   
2            NaN          NaN          0.0          NaN NaN         62.0   
3            NaN          NaN          0.0          NaN NaN         67.0   
4            NaN          NaN          0.0          NaN NaN         65.0   
...          ...          ...          ...          ...  ..          ...   
3257         NaN          NaN         43.0          NaN NaN        100.0   
3258         NaN          NaN         45.0          NaN NaN        100.0   
3259         NaN          NaN         47.0          NaN NaN        100.0   
3260         NaN          NaN         14.0          NaN NaN        100.0   
3261         NaN          NaN          0.0          NaN NaN        100.0   

      좌측이중천창 작동여부  우측일중천창 개도  우측일중천창 온도폭  우측일중천창 설정온도  우측일중천창 작동여부  \
0            57.0        NaN         NaN          NaN          0.0   
1            60.0        NaN         NaN          NaN          0.0   
2            61.0        NaN         NaN          NaN          0.0   
3            63.0        NaN         NaN          NaN          0.0   
4            61.0        NaN         NaN          NaN          0.0   
...           ...        ...         ...          ...          ...   
3257        100.0        NaN         NaN          NaN        100.0   
3258        100.0        NaN         NaN          NaN        100.0   
3259        100.0        NaN         NaN          NaN        100.0   
3260        100.0        NaN         NaN          NaN         64.0   
3261        100.0        NaN         NaN          NaN          0.0   

      우측일중천창 작동상태  좌측일중천창 개도  좌측일중천창 온도폭  좌측일중천창 설정온도  좌측일중천창 작동여부  \
0             NaN        NaN         NaN          NaN          0.0   
1             NaN        NaN         NaN          NaN          0.0   
2             NaN        NaN         NaN          NaN          0.0   
3             NaN        NaN         NaN          NaN          0.0   
4             NaN        NaN         NaN          NaN          0.0   
...           ...        ...         ...          ...          ...   
3257          NaN        NaN         NaN          NaN        100.0   
3258          NaN        NaN         NaN          NaN        100.0   
3259          NaN        NaN         NaN          NaN        100.0   
3260          NaN        NaN         NaN          NaN         73.0   
3261          NaN        NaN         NaN          NaN          0.0   

      좌측일중천창 작동상태  천창  조사일   주차  생장길이  화방높이  줄기직경  엽장  엽폭  엽수  개화군  착과군  열매수  \
0             NaN NaN  NaN  NaN   NaN   NaN   NaN NaN NaN NaN  NaN  NaN  NaN   
1             NaN NaN  NaN  NaN   NaN   NaN   NaN NaN NaN NaN  NaN  NaN  NaN   
2             NaN NaN  NaN  NaN   NaN   NaN   NaN NaN NaN NaN  NaN  NaN  NaN   
3             NaN NaN  NaN  NaN   NaN   NaN   NaN NaN NaN NaN  NaN  NaN  NaN   
4             NaN NaN  NaN  NaN   NaN   NaN   NaN NaN NaN NaN  NaN  NaN  NaN   
...           ...  ..  ...  ...   ...   ...   ...  ..  ..  ..  ...  ...  ...   
3257          NaN NaN  NaN  NaN   NaN   NaN   NaN NaN NaN NaN  NaN  NaN  NaN   
3258          NaN NaN  NaN  NaN   NaN   NaN   NaN NaN NaN NaN  NaN  NaN  NaN   
3259          NaN NaN  NaN  NaN   NaN   NaN   NaN NaN NaN NaN  NaN  NaN  NaN   
3260          NaN NaN  NaN  NaN   NaN   NaN   NaN NaN NaN NaN  NaN  NaN  NaN   
3261          NaN NaN  NaN  NaN   NaN   NaN   NaN NaN NaN NaN  NaN  NaN  NaN   

      최종화방차수  
0        NaN  
1        NaN  
2        NaN  
3        NaN  
4        NaN  
...      ...  
3257     NaN  
3258     NaN  
3259     NaN  
3260     NaN  
3261     NaN  

[3262 rows x 84 columns]
In [10]:
# 데이터 객체 정보 확인
data.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 3262 entries, 0 to 3261
Data columns (total 84 columns):
 #   Column       Non-Null Count  Dtype  
---  ------       --------------  -----  
 0   시설ID         3262 non-null   object 
 1   시도           3262 non-null   object 
 2   시군구          3262 non-null   object 
 3   품목명          3262 non-null   object 
 4   품종           0 non-null      float64
 5   재배면적         3262 non-null   object 
 6   시설유형         0 non-null      float64
 7   재배형태         0 non-null      float64
 8   단동/연동 구분     0 non-null      float64
 9   수집일          3262 non-null   object 
 10  외부온도         3259 non-null   float64
 11  외부습도         0 non-null      float64
 12  외부 일사량       3259 non-null   object 
 13  외부풍향         0 non-null      float64
 14  외부풍속         3259 non-null   float64
 15  외부강우         0 non-null      float64
 16  강우감지         3259 non-null   float64
 17  내부온도         3260 non-null   float64
 18  내부습도         3260 non-null   float64
 19  내부CO2        3259 non-null   float64
 20  내부 일사량       0 non-null      float64
 21  토양EC         0 non-null      float64
 22  토양PH         0 non-null      float64
 23  지온           2899 non-null   float64
 24  지습           0 non-null      float64
 25  (양액)총배액      0 non-null      float64
 26  (양액)총급액      0 non-null      float64
 27  (양액)배액PH     0 non-null      float64
 28  (양액)공급PH     0 non-null      float64
 29  (양액)배액EC     0 non-null      float64
 30  (양액)공급EC     0 non-null      float64
 31  (양액)지온       0 non-null      float64
 32  (양액)지습       2899 non-null   float64
 33  배기팬작동여부      0 non-null      float64
 34  CO2발생장치작동여부  0 non-null      float64
 35  보광등작동여부      0 non-null      float64
 36  난방기작동상태      0 non-null      float64
 37  난방기작동여부      0 non-null      float64
 38  유동팬작동상태      0 non-null      float64
 39  유동팬작동여부      0 non-null      float64
 40  보온커튼작동상태     0 non-null      float64
 41  보온커튼작동여부     0 non-null      float64
 42  차광커튼작동상태     3259 non-null   float64
 43  차광커튼작동여부     0 non-null      float64
 44  우측삼중측창 작동여부  0 non-null      float64
 45  좌측삼중측창 작동여부  0 non-null      float64
 46  우측이중측창 작동여부  0 non-null      float64
 47  좌측이중측창 작동여부  0 non-null      float64
 48  우측일중측창 개도    0 non-null      float64
 49  우측일중측창 온도폭   0 non-null      float64
 50  우측일중측창 설정온도  0 non-null      float64
 51  우측일중측창 작동여부  0 non-null      float64
 52  우측일중측창 작동상태  0 non-null      float64
 53  좌측일중측창 개도    0 non-null      float64
 54  좌측일중측창 온도폭   0 non-null      float64
 55  좌측일중측창 설정온도  0 non-null      float64
 56  좌측일중측창 작동여부  3259 non-null   float64
 57  좌측일중측창 작동상태  0 non-null      float64
 58  측창           0 non-null      float64
 59  우측이중천창 작동여부  3259 non-null   float64
 60  좌측이중천창 작동여부  3259 non-null   float64
 61  우측일중천창 개도    0 non-null      float64
 62  우측일중천창 온도폭   0 non-null      float64
 63  우측일중천창 설정온도  0 non-null      float64
 64  우측일중천창 작동여부  3259 non-null   float64
 65  우측일중천창 작동상태  0 non-null      float64
 66  좌측일중천창 개도    0 non-null      float64
 67  좌측일중천창 온도폭   0 non-null      float64
 68  좌측일중천창 설정온도  0 non-null      float64
 69  좌측일중천창 작동여부  3259 non-null   float64
 70  좌측일중천창 작동상태  0 non-null      float64
 71  천창           0 non-null      float64
 72  조사일          466 non-null    object 
 73  주차           466 non-null    object 
 74  생장길이         443 non-null    float64
 75  화방높이         420 non-null    float64
 76  줄기직경         466 non-null    float64
 77  엽장           466 non-null    float64
 78  엽폭           466 non-null    float64
 79  엽수           305 non-null    float64
 80  개화군          466 non-null    float64
 81  착과군          466 non-null    float64
 82  열매수          443 non-null    float64
 83  최종화방차수       420 non-null    float64
dtypes: float64(75), object(9)
memory usage: 2.1+ MB
In [11]:
# '외부 일사량' 열에서 쉼표 제거 및 숫자 형식으로 변환

data['외부 일사량'] = data['외부 일사량'].str.replace(',', '').astype(float)

# 최대값 찾기 (정상변환 확인)

max_values = data['외부 일사량'].max()
print(max_values)
1050.0
In [12]:
# 열 이름 확인

print("CSV 파일의 모든 열 이름:")
print(data.columns)
CSV 파일의 모든 열 이름:
Index(['시설ID', '시도', '시군구', '품목명', '품종', '재배면적', '시설유형', '재배형태', '단동/연동 구분',
       '수집일', '외부온도', '외부습도', '외부 일사량', '외부풍향', '외부풍속', '외부강우', '강우감지', '내부온도',
       '내부습도', '내부CO2', '내부 일사량', '토양EC', '토양PH', '지온', '지습', '(양액)총배액',
       '(양액)총급액', '(양액)배액PH', '(양액)공급PH', '(양액)배액EC', '(양액)공급EC', '(양액)지온',
       '(양액)지습', '배기팬작동여부', 'CO2발생장치작동여부', '보광등작동여부', '난방기작동상태', '난방기작동여부',
       '유동팬작동상태', '유동팬작동여부', '보온커튼작동상태', '보온커튼작동여부', '차광커튼작동상태', '차광커튼작동여부',
       '우측삼중측창 작동여부', '좌측삼중측창 작동여부', '우측이중측창 작동여부', '좌측이중측창 작동여부', '우측일중측창 개도',
       '우측일중측창 온도폭', '우측일중측창 설정온도', '우측일중측창 작동여부', '우측일중측창 작동상태', '좌측일중측창 개도',
       '좌측일중측창 온도폭', '좌측일중측창 설정온도', '좌측일중측창 작동여부', '좌측일중측창 작동상태', '측창',
       '우측이중천창 작동여부', '좌측이중천창 작동여부', '우측일중천창 개도', '우측일중천창 온도폭', '우측일중천창 설정온도',
       '우측일중천창 작동여부', '우측일중천창 작동상태', '좌측일중천창 개도', '좌측일중천창 온도폭', '좌측일중천창 설정온도',
       '좌측일중천창 작동여부', '좌측일중천창 작동상태', '천창', '조사일', '주차', '생장길이', '화방높이', '줄기직경',
       '엽장', '엽폭', '엽수', '개화군', '착과군', '열매수', '최종화방차수'],
      dtype='object')
In [13]:
# '수집일' 열을 날짜형으로 변환

data['수집일'] = pd.to_datetime(data['수집일'], format='%Y-%m-%d %H:%M:%S', errors='raise')
print(data)
               시설ID    시도  시군구    품목명  품종   재배면적  시설유형  재배형태  단동/연동 구분  \
0     PF_0020760_01  전라북도  진안군  방울토마토 NaN  4,000   NaN   NaN       NaN   
1     PF_0020760_01  전라북도  진안군  방울토마토 NaN  4,000   NaN   NaN       NaN   
2     PF_0020760_01  전라북도  진안군  방울토마토 NaN  4,000   NaN   NaN       NaN   
3     PF_0020760_01  전라북도  진안군  방울토마토 NaN  4,000   NaN   NaN       NaN   
4     PF_0020760_01  전라북도  진안군  방울토마토 NaN  4,000   NaN   NaN       NaN   
...             ...   ...  ...    ...  ..    ...   ...   ...       ...   
3257  PF_0020760_01  전라북도  진안군  방울토마토 NaN  4,000   NaN   NaN       NaN   
3258  PF_0020760_01  전라북도  진안군  방울토마토 NaN  4,000   NaN   NaN       NaN   
3259  PF_0020760_01  전라북도  진안군  방울토마토 NaN  4,000   NaN   NaN       NaN   
3260  PF_0020760_01  전라북도  진안군  방울토마토 NaN  4,000   NaN   NaN       NaN   
3261  PF_0020760_01  전라북도  진안군  방울토마토 NaN  4,000   NaN   NaN       NaN   

                     수집일  외부온도  외부습도  외부 일사량  외부풍향  외부풍속  외부강우  강우감지  내부온도  \
0    2021-02-04 10:00:00  -1.0   NaN   461.0   NaN   2.0   NaN   0.0  12.0   
1    2021-02-04 11:00:00   0.0   NaN   590.0   NaN   3.0   NaN   0.0  13.0   
2    2021-02-04 12:00:00   0.0   NaN   655.0   NaN   2.0   NaN   0.0  16.0   
3    2021-02-04 13:00:00   1.0   NaN   656.0   NaN   2.0   NaN   0.0  17.0   
4    2021-02-04 14:00:00   1.0   NaN   586.0   NaN   2.0   NaN   0.0  16.0   
...                  ...   ...   ...     ...   ...   ...   ...   ...   ...   
3257 2021-06-28 09:00:00  25.0   NaN   529.0   NaN   0.0   NaN   0.0  18.0   
3258 2021-06-28 10:00:00  26.0   NaN   525.0   NaN   0.0   NaN   0.0  19.0   
3259 2021-06-28 11:00:00  27.0   NaN   454.0   NaN   0.0   NaN   0.0  19.0   
3260 2021-06-28 12:00:00  24.0   NaN    71.0   NaN   2.0   NaN   0.0  16.0   
3261 2021-06-28 13:00:00  18.0   NaN    25.0   NaN   4.0   NaN   1.0  14.0   

      내부습도  내부CO2  내부 일사량  토양EC  토양PH    지온  지습  (양액)총배액  (양액)총급액  (양액)배액PH  \
0     48.0  362.0     NaN   NaN   NaN   NaN NaN      NaN      NaN       NaN   
1     43.0  289.0     NaN   NaN   NaN   NaN NaN      NaN      NaN       NaN   
2     41.0  259.0     NaN   NaN   NaN   NaN NaN      NaN      NaN       NaN   
3     43.0  230.0     NaN   NaN   NaN   NaN NaN      NaN      NaN       NaN   
4     43.0  245.0     NaN   NaN   NaN   NaN NaN      NaN      NaN       NaN   
...    ...    ...     ...   ...   ...   ...  ..      ...      ...       ...   
3257  49.0  321.0     NaN   NaN   NaN  22.0 NaN      NaN      NaN       NaN   
3258  46.0  292.0     NaN   NaN   NaN  23.0 NaN      NaN      NaN       NaN   
3259  46.0  286.0     NaN   NaN   NaN  23.0 NaN      NaN      NaN       NaN   
3260  54.0  296.0     NaN   NaN   NaN  24.0 NaN      NaN      NaN       NaN   
3261  63.0  353.0     NaN   NaN   NaN  23.0 NaN      NaN      NaN       NaN   

      (양액)공급PH  (양액)배액EC  (양액)공급EC  (양액)지온  (양액)지습  배기팬작동여부  CO2발생장치작동여부  \
0          NaN       NaN       NaN     NaN     NaN      NaN          NaN   
1          NaN       NaN       NaN     NaN     NaN      NaN          NaN   
2          NaN       NaN       NaN     NaN     NaN      NaN          NaN   
3          NaN       NaN       NaN     NaN     NaN      NaN          NaN   
4          NaN       NaN       NaN     NaN     NaN      NaN          NaN   
...        ...       ...       ...     ...     ...      ...          ...   
3257       NaN       NaN       NaN     NaN    81.0      NaN          NaN   
3258       NaN       NaN       NaN     NaN    83.0      NaN          NaN   
3259       NaN       NaN       NaN     NaN    83.0      NaN          NaN   
3260       NaN       NaN       NaN     NaN    81.0      NaN          NaN   
3261       NaN       NaN       NaN     NaN    82.0      NaN          NaN   

      보광등작동여부  난방기작동상태  난방기작동여부  유동팬작동상태  유동팬작동여부  보온커튼작동상태  보온커튼작동여부  \
0         NaN      NaN      NaN      NaN      NaN       NaN       NaN   
1         NaN      NaN      NaN      NaN      NaN       NaN       NaN   
2         NaN      NaN      NaN      NaN      NaN       NaN       NaN   
3         NaN      NaN      NaN      NaN      NaN       NaN       NaN   
4         NaN      NaN      NaN      NaN      NaN       NaN       NaN   
...       ...      ...      ...      ...      ...       ...       ...   
3257      NaN      NaN      NaN      NaN      NaN       NaN       NaN   
3258      NaN      NaN      NaN      NaN      NaN       NaN       NaN   
3259      NaN      NaN      NaN      NaN      NaN       NaN       NaN   
3260      NaN      NaN      NaN      NaN      NaN       NaN       NaN   
3261      NaN      NaN      NaN      NaN      NaN       NaN       NaN   

      차광커튼작동상태  차광커튼작동여부  우측삼중측창 작동여부  좌측삼중측창 작동여부  우측이중측창 작동여부  좌측이중측창 작동여부  \
0        100.0       NaN          NaN          NaN          NaN          NaN   
1        100.0       NaN          NaN          NaN          NaN          NaN   
2        100.0       NaN          NaN          NaN          NaN          NaN   
3        100.0       NaN          NaN          NaN          NaN          NaN   
4        100.0       NaN          NaN          NaN          NaN          NaN   
...        ...       ...          ...          ...          ...          ...   
3257     100.0       NaN          NaN          NaN          NaN          NaN   
3258     100.0       NaN          NaN          NaN          NaN          NaN   
3259      94.0       NaN          NaN          NaN          NaN          NaN   
3260     100.0       NaN          NaN          NaN          NaN          NaN   
3261     100.0       NaN          NaN          NaN          NaN          NaN   

      우측일중측창 개도  우측일중측창 온도폭  우측일중측창 설정온도  우측일중측창 작동여부  우측일중측창 작동상태  좌측일중측창 개도  \
0           NaN         NaN          NaN          NaN          NaN        NaN   
1           NaN         NaN          NaN          NaN          NaN        NaN   
2           NaN         NaN          NaN          NaN          NaN        NaN   
3           NaN         NaN          NaN          NaN          NaN        NaN   
4           NaN         NaN          NaN          NaN          NaN        NaN   
...         ...         ...          ...          ...          ...        ...   
3257        NaN         NaN          NaN          NaN          NaN        NaN   
3258        NaN         NaN          NaN          NaN          NaN        NaN   
3259        NaN         NaN          NaN          NaN          NaN        NaN   
3260        NaN         NaN          NaN          NaN          NaN        NaN   
3261        NaN         NaN          NaN          NaN          NaN        NaN   

      좌측일중측창 온도폭  좌측일중측창 설정온도  좌측일중측창 작동여부  좌측일중측창 작동상태  측창  우측이중천창 작동여부  \
0            NaN          NaN          0.0          NaN NaN         57.0   
1            NaN          NaN          0.0          NaN NaN         60.0   
2            NaN          NaN          0.0          NaN NaN         62.0   
3            NaN          NaN          0.0          NaN NaN         67.0   
4            NaN          NaN          0.0          NaN NaN         65.0   
...          ...          ...          ...          ...  ..          ...   
3257         NaN          NaN         43.0          NaN NaN        100.0   
3258         NaN          NaN         45.0          NaN NaN        100.0   
3259         NaN          NaN         47.0          NaN NaN        100.0   
3260         NaN          NaN         14.0          NaN NaN        100.0   
3261         NaN          NaN          0.0          NaN NaN        100.0   

      좌측이중천창 작동여부  우측일중천창 개도  우측일중천창 온도폭  우측일중천창 설정온도  우측일중천창 작동여부  \
0            57.0        NaN         NaN          NaN          0.0   
1            60.0        NaN         NaN          NaN          0.0   
2            61.0        NaN         NaN          NaN          0.0   
3            63.0        NaN         NaN          NaN          0.0   
4            61.0        NaN         NaN          NaN          0.0   
...           ...        ...         ...          ...          ...   
3257        100.0        NaN         NaN          NaN        100.0   
3258        100.0        NaN         NaN          NaN        100.0   
3259        100.0        NaN         NaN          NaN        100.0   
3260        100.0        NaN         NaN          NaN         64.0   
3261        100.0        NaN         NaN          NaN          0.0   

      우측일중천창 작동상태  좌측일중천창 개도  좌측일중천창 온도폭  좌측일중천창 설정온도  좌측일중천창 작동여부  \
0             NaN        NaN         NaN          NaN          0.0   
1             NaN        NaN         NaN          NaN          0.0   
2             NaN        NaN         NaN          NaN          0.0   
3             NaN        NaN         NaN          NaN          0.0   
4             NaN        NaN         NaN          NaN          0.0   
...           ...        ...         ...          ...          ...   
3257          NaN        NaN         NaN          NaN        100.0   
3258          NaN        NaN         NaN          NaN        100.0   
3259          NaN        NaN         NaN          NaN        100.0   
3260          NaN        NaN         NaN          NaN         73.0   
3261          NaN        NaN         NaN          NaN          0.0   

      좌측일중천창 작동상태  천창  조사일   주차  생장길이  화방높이  줄기직경  엽장  엽폭  엽수  개화군  착과군  열매수  \
0             NaN NaN  NaN  NaN   NaN   NaN   NaN NaN NaN NaN  NaN  NaN  NaN   
1             NaN NaN  NaN  NaN   NaN   NaN   NaN NaN NaN NaN  NaN  NaN  NaN   
2             NaN NaN  NaN  NaN   NaN   NaN   NaN NaN NaN NaN  NaN  NaN  NaN   
3             NaN NaN  NaN  NaN   NaN   NaN   NaN NaN NaN NaN  NaN  NaN  NaN   
4             NaN NaN  NaN  NaN   NaN   NaN   NaN NaN NaN NaN  NaN  NaN  NaN   
...           ...  ..  ...  ...   ...   ...   ...  ..  ..  ..  ...  ...  ...   
3257          NaN NaN  NaN  NaN   NaN   NaN   NaN NaN NaN NaN  NaN  NaN  NaN   
3258          NaN NaN  NaN  NaN   NaN   NaN   NaN NaN NaN NaN  NaN  NaN  NaN   
3259          NaN NaN  NaN  NaN   NaN   NaN   NaN NaN NaN NaN  NaN  NaN  NaN   
3260          NaN NaN  NaN  NaN   NaN   NaN   NaN NaN NaN NaN  NaN  NaN  NaN   
3261          NaN NaN  NaN  NaN   NaN   NaN   NaN NaN NaN NaN  NaN  NaN  NaN   

      최종화방차수  
0        NaN  
1        NaN  
2        NaN  
3        NaN  
4        NaN  
...      ...  
3257     NaN  
3258     NaN  
3259     NaN  
3260     NaN  
3261     NaN  

[3262 rows x 84 columns]
In [14]:
# 전체 요소 결측값 조회

missing_values = data.isna().sum()
print(missing_values)
시설ID         0
시도           0
시군구          0
품목명          0
품종        3262
          ... 
엽수        2957
개화군       2796
착과군       2796
열매수       2819
최종화방차수    2842
Length: 84, dtype: int64

5.1.4 분석 요소 선택¶

  • 독립 변수와 종속 변수를 입력합니다.
    (본 예제에서는 외부온도, 외부 일사량, 외부풍속, 내부온도, 내부습도를 독립 변수로, 내부CO2를 종속 변수로 이용)
  • 독립 변수 feature = data[['외부온도', '외부 일사량', '외부풍속', '내부온도', '내부습도']]
  • 종속 변수 target = data[['내부CO2']]
In [15]:
# '수집일'과 분석 요소 선택

date = data[['수집일']]
feature = data[['외부온도', '외부 일사량', '외부풍속', '내부온도', '내부습도']]
target = data[['내부CO2']]

# 열 합치기
data_selected = pd.concat([date, feature, target], axis=1)


# 선택된 열 확인
print(data_selected)
                     수집일  외부온도  외부 일사량  외부풍속  내부온도  내부습도  내부CO2
0    2021-02-04 10:00:00  -1.0   461.0   2.0  12.0  48.0  362.0
1    2021-02-04 11:00:00   0.0   590.0   3.0  13.0  43.0  289.0
2    2021-02-04 12:00:00   0.0   655.0   2.0  16.0  41.0  259.0
3    2021-02-04 13:00:00   1.0   656.0   2.0  17.0  43.0  230.0
4    2021-02-04 14:00:00   1.0   586.0   2.0  16.0  43.0  245.0
...                  ...   ...     ...   ...   ...   ...    ...
3257 2021-06-28 09:00:00  25.0   529.0   0.0  18.0  49.0  321.0
3258 2021-06-28 10:00:00  26.0   525.0   0.0  19.0  46.0  292.0
3259 2021-06-28 11:00:00  27.0   454.0   0.0  19.0  46.0  286.0
3260 2021-06-28 12:00:00  24.0    71.0   2.0  16.0  54.0  296.0
3261 2021-06-28 13:00:00  18.0    25.0   4.0  14.0  63.0  353.0

[3262 rows x 7 columns]

5.1.5 결측값 조회 및 제거¶

결측값 개수를 조회하고 제거합니다.

In [16]:
# 선택된 항목의 결측값 조회

missing_values = data_selected.isna().sum()
print(missing_values)
수집일       0
외부온도      3
외부 일사량    3
외부풍속      3
내부온도      2
내부습도      2
내부CO2     3
dtype: int64
In [17]:
# 결측치 제거 (결측치가 있는 행을 제거)

data_cleaned = data_selected.dropna()
print(data_cleaned)
                     수집일  외부온도  외부 일사량  외부풍속  내부온도  내부습도  내부CO2
0    2021-02-04 10:00:00  -1.0   461.0   2.0  12.0  48.0  362.0
1    2021-02-04 11:00:00   0.0   590.0   3.0  13.0  43.0  289.0
2    2021-02-04 12:00:00   0.0   655.0   2.0  16.0  41.0  259.0
3    2021-02-04 13:00:00   1.0   656.0   2.0  17.0  43.0  230.0
4    2021-02-04 14:00:00   1.0   586.0   2.0  16.0  43.0  245.0
...                  ...   ...     ...   ...   ...   ...    ...
3257 2021-06-28 09:00:00  25.0   529.0   0.0  18.0  49.0  321.0
3258 2021-06-28 10:00:00  26.0   525.0   0.0  19.0  46.0  292.0
3259 2021-06-28 11:00:00  27.0   454.0   0.0  19.0  46.0  286.0
3260 2021-06-28 12:00:00  24.0    71.0   2.0  16.0  54.0  296.0
3261 2021-06-28 13:00:00  18.0    25.0   4.0  14.0  63.0  353.0

[3259 rows x 7 columns]

5.1.6 그래프 조회¶

수집일에 따른 요소별 그래프를 조회합니다.

In [18]:
# 그래프 조회

fig, axs = plt.subplots(6, 1, figsize=(16, 10), sharex=True)

# 각각의 서브플롯에 데이터를 그림
axs[0].plot(data_cleaned['수집일'], data_cleaned['외부온도'], label='외부온도', color='blue')
axs[1].plot(data_cleaned['수집일'], data_cleaned['외부 일사량'], label='외부 일사량', color='red')
axs[2].plot(data_cleaned['수집일'], data_cleaned['외부풍속'], label='외부풍속', color='green')
axs[3].plot(data_cleaned['수집일'], data_cleaned['내부온도'], label='내부온도', color='orange')
axs[4].plot(data_cleaned['수집일'], data_cleaned['내부습도'], label='내부습도', color='purple')
axs[5].plot(data_cleaned['수집일'], data_cleaned['내부CO2'], label='내부CO2', color='brown')

# 서브플롯 간의 간격 조정
plt.tight_layout()

# 각각의 서브플롯에 범례 추가
for ax in axs:
    ax.legend()

# x축 레이블 설정
axs[-1].set_xlabel('수집일')

plt.show()
In [19]:
# 테스트셋 생성을 위해 수집일 항목 DROP

df = data_cleaned.drop(['수집일'], axis=1)
df
Out[19]:
외부온도 외부 일사량 외부풍속 내부온도 내부습도 내부CO2
0 -1.0 461.0 2.0 12.0 48.0 362.0
1 0.0 590.0 3.0 13.0 43.0 289.0
2 0.0 655.0 2.0 16.0 41.0 259.0
3 1.0 656.0 2.0 17.0 43.0 230.0
4 1.0 586.0 2.0 16.0 43.0 245.0
... ... ... ... ... ... ...
3257 25.0 529.0 0.0 18.0 49.0 321.0
3258 26.0 525.0 0.0 19.0 46.0 292.0
3259 27.0 454.0 0.0 19.0 46.0 286.0
3260 24.0 71.0 2.0 16.0 54.0 296.0
3261 18.0 25.0 4.0 14.0 63.0 353.0

3259 rows × 6 columns

5.1.7 상관관계 분석¶

요소별 상관관계를 분석합니다.

In [20]:
# 상관 관계 계산

correlation_matrix = df.corr()
correlation_matrix
Out[20]:
외부온도 외부 일사량 외부풍속 내부온도 내부습도 내부CO2
외부온도 1.000000 0.441088 0.193764 0.814439 -0.489254 -0.624993
외부 일사량 0.441088 1.000000 0.347255 0.768345 -0.821978 -0.532319
외부풍속 0.193764 0.347255 1.000000 0.341588 -0.398901 -0.402808
내부온도 0.814439 0.768345 0.341588 1.000000 -0.723218 -0.717340
내부습도 -0.489254 -0.821978 -0.398901 -0.723218 1.000000 0.544615
내부CO2 -0.624993 -0.532319 -0.402808 -0.717340 0.544615 1.000000
In [21]:
import seaborn as sns
import matplotlib.pyplot as plt

# 상관 관계 히트맵 그리기
plt.figure(figsize=(10, 8))
sns.heatmap(correlation_matrix, annot=True, cmap='Blues', fmt=".2f")
plt.title('Correlation Heatmap',fontsize=20, pad=20)

# x축과 y축의 라벨 제거
plt.xlabel('')  # x축의 라벨 제거
plt.ylabel('')  # y축의 라벨 제거
plt.show()

5.2 모델 학습¶

5.2.1 훈련셋, 테스트셋 지정¶

  • 훈련셋 : 전체의 80%
  • 테스트셋 : 전체의 20%
In [22]:
training_sample =int(len(df) *0.8)

train_set,test_set = df[:training_sample], df[training_sample:] 
train_set,test_set
Out[22]:
(      외부온도  외부 일사량  외부풍속  내부온도  내부습도  내부CO2
 0     -1.0   461.0   2.0  12.0  48.0  362.0
 1      0.0   590.0   3.0  13.0  43.0  289.0
 2      0.0   655.0   2.0  16.0  41.0  259.0
 3      1.0   656.0   2.0  17.0  43.0  230.0
 4      1.0   586.0   2.0  16.0  43.0  245.0
 ...    ...     ...   ...   ...   ...    ...
 2602  10.0     0.0   0.0  10.0  61.0  442.0
 2603  10.0     0.0   0.0   9.0  61.0  454.0
 2604   9.0     0.0   0.0   9.0  61.0  471.0
 2605   9.0     6.0   0.0   9.0  61.0  491.0
 2606  10.0    91.0   0.0   9.0  61.0  492.0
 
 [2607 rows x 6 columns],
       외부온도  외부 일사량  외부풍속  내부온도  내부습도  내부CO2
 2607  13.0   273.0   0.0  10.0  53.0  365.0
 2608  16.0   477.0   0.0  12.0  47.0  344.0
 2609  20.0   651.0   0.0  15.0  38.0  315.0
 2610  23.0   805.0   0.0  18.0  27.0  297.0
 2611  24.0   915.0   0.0  19.0  28.0  294.0
 ...    ...     ...   ...   ...   ...    ...
 3257  25.0   529.0   0.0  18.0  49.0  321.0
 3258  26.0   525.0   0.0  19.0  46.0  292.0
 3259  27.0   454.0   0.0  19.0  46.0  286.0
 3260  24.0    71.0   2.0  16.0  54.0  296.0
 3261  18.0    25.0   4.0  14.0  63.0  353.0
 
 [652 rows x 6 columns])

5.2.2 데이터 정규화¶

In [23]:
# 데이터 정규화

from sklearn.preprocessing import StandardScaler, MinMaxScaler

# 정규화 수행
scalers = {}
for i in train_set.columns:
    scaler = MinMaxScaler(feature_range=(-1,1))
    s_s = scaler.fit_transform(train_set[i].values.reshape(-1,1))
    s_s = np.reshape(s_s, len(s_s))
    scalers['scaler_'+ i] = scaler
    train_set[i] = s_s
    
    # 테스트 셋에도 같은 스케일러 적용
    s_s = scaler.transform(test_set[i].values.reshape(-1,1))
    s_s = np.reshape(s_s, len(s_s))
    test_set[i] = s_s

5.2.3 데이터셋과 데이터로더 생성¶

In [24]:
# 시퀀스 길이와 배치 사이즈 설정

seq_length = 23
batch = 100
In [25]:
from torch.utils.data import TensorDataset # 텐서데이터셋
from torch.utils.data import DataLoader # 데이터로더
import torch

# 데이터셋 생성 함수
def build_dataset(time_series, seq_length):
    dataX = []
    dataY = []
    for i in range(0, len(time_series)-seq_length):
        _x = time_series[i:i+seq_length, :]
        _y = time_series[i+seq_length, [-1]]
        
        # print(_x, "-->",_y)
        dataX.append(_x)
        dataY.append(_y)

    return np.array(dataX), np.array(dataY)

trainX, trainY = build_dataset(np.array(train_set), seq_length)
testX, testY = build_dataset(np.array(test_set), seq_length)

# 텐서로 변환
trainX_tensor = torch.FloatTensor(trainX)
trainY_tensor = torch.FloatTensor(trainY)

testX_tensor = torch.FloatTensor(testX)
testY_tensor = torch.FloatTensor(testY)

# 텐서 형태로 데이터 정의
dataset = TensorDataset(trainX_tensor, trainY_tensor)

# 데이터로더는 기본적으로 2개의 인자를 입력받으며 배치크기는 통상적으로 2의 배수를 사용
dataloader = DataLoader(dataset,
                        batch_size=batch,
                        shuffle=True,  
                        drop_last=True)
In [26]:
# trainX, trainY, testX, testY 구성 조회

print("trainX_tensor size:", trainX_tensor.size())
print("trainY_tensor size:", trainY_tensor.size())
print("testX_tensor size:", testX_tensor.size())
print("testY_tensor size:", testY_tensor.size())
trainX_tensor size: torch.Size([2584, 23, 6])
trainY_tensor size: torch.Size([2584, 1])
testX_tensor size: torch.Size([629, 23, 6])
testY_tensor size: torch.Size([629, 1])

5.2.4 모델 생성¶

모델을 정의하기 위해 값을 설정합니다.

  • data_dim : 입력 데이터의 특성 개수 (독립 변수 개수에 따라 변경해야 합니다.)
  • hidden_dim : hidden state의 차원 수, 모델이 학습할 수 있는 공간의 크기 결정
  • output_dim : 모델의 출력 차원 수
  • learning_rate : 모델이 학습할 때 사용되는 학습률 결정
  • nb_epochs : 전체 데이터셋에 대해 반복되는 epoch 수 결정
In [27]:
import torch.nn as nn

# 설정값
data_dim = 6
hidden_dim = 128 # 테스트 후 증가시켜가며 튜닝하자
output_dim = 1 
learning_rate = 0.01
nb_epochs = 50

GRU 모델을 구축합니다.

In [28]:
#GRU 모듈

class GRUNet(nn.Module):
    # # 기본변수, layer를 초기화해주는 생성자
    def __init__(self, input_dim, hidden_dim, seq_len, output_dim, layers):
        super(GRUNet, self).__init__()
        self.hidden_dim = hidden_dim
        self.seq_len = seq_len
        self.output_dim = output_dim
        self.layers = layers
        
        self.gru = nn.GRU(input_dim, hidden_dim, num_layers=layers,
                            # dropout = 0.1,
                            batch_first=True)
        self.fc = nn.Linear(hidden_dim, output_dim, bias = True) 
        
    # 학습 초기화를 위한 함수
    def reset_hidden_state(self): 
        self.hidden = (
                torch.zeros(self.layers, self.seq_len, self.hidden_dim))
    
    # 예측을 위한 함수
    def forward(self, x):
        x, _status = self.gru(x)
        x = self.fc(x[:, -1])
        return x
In [29]:
def train_model(model, train_df, num_epochs = None, lr = None, verbose = 10, patience = 10):
     
    criterion = nn.MSELoss().to(device)
    optimizer = optim.Adam(model.parameters(), lr = learning_rate)
    nb_epochs = num_epochs
    
    # epoch마다 loss 저장
    train_hist = np.zeros(nb_epochs)

    for epoch in range(nb_epochs):
        avg_cost = 0
        total_batch = len(train_df)
        
        for batch_idx, samples in enumerate(train_df):

            x_train, y_train = samples
            
            # seq별 hidden state reset
            model.reset_hidden_state()
            
            # H(x) 계산
            outputs = model(x_train)
                
            # cost 계산
            loss = criterion(outputs, y_train)                    
            
            # cost로 H(x) 개선
            optimizer.zero_grad()
            loss.backward()
            optimizer.step()
            
            avg_cost += loss/total_batch
               
        train_hist[epoch] = avg_cost        
        
        if epoch % verbose == 0:
            print('Epoch:', '%04d' % (epoch), 'train loss :', '{:.4f}'.format(avg_cost))
            
        # patience번째 마다 early stopping 여부 확인
        if (epoch % patience == 0) & (epoch != 0):
            
            # loss가 커졌다면 early stop
            if train_hist[epoch-patience] < train_hist[epoch]:
                print('\n Early Stopping')
                
                break
            
    return model.eval(), train_hist

5.2.5 모델 학습¶

GRU 모델을 학습합니다.

In [30]:
# GRU 모델 학습

from torch import optim

device = 'cuda' if torch.cuda.is_available() else 'cpu'

grunet = GRUNet(data_dim, hidden_dim, seq_length, output_dim, 1).to(device)  
gru_model, gru_train_hist = train_model(grunet, dataloader, num_epochs = nb_epochs, lr = learning_rate, verbose = 20, patience = 10)
Epoch: 0000 train loss : 0.0555
Epoch: 0020 train loss : 0.0034
Epoch: 0040 train loss : 0.0021

GRU 모델의 학습 과정 중 에포크(epoch)별 손실(loss)값을 시각화한 그래프를 생성합니다.
모델의 학습 진행 상황, 과적합 여부 등을 확인할 수 있습니다.

In [31]:
# GRU epoch별 손실값
fig = plt.figure(figsize=(10, 4))
plt.plot(gru_train_hist, label="Training loss")
plt.legend()
plt.show()

5.2.6 모델 저장¶

학습된 GRU 모델을 저장합니다.

In [32]:
# 모델 저장    

gru_PATH = 'gru.pth'
torch.save(gru_model.state_dict(), gru_PATH)
In [33]:
# GRU 불러오기
gru_model = GRUNet(data_dim, hidden_dim, seq_length, output_dim, 1).to(device)  
gru_model.load_state_dict(torch.load(gru_PATH), strict=False)
gru_model.eval()
Out[33]:
GRUNet(
  (gru): GRU(6, 128, batch_first=True)
  (fc): Linear(in_features=128, out_features=1, bias=True)
)

5.3 성능 검증¶

5.3.1 역정규화¶

In [34]:
# 역정규화

with torch.no_grad(): 
    gru_pred = []
    for pr in range(len(testX_tensor)):

        gru_model.reset_hidden_state()

        gru_predicted = gru_model(torch.unsqueeze(testX_tensor[pr], 0))
        gru_predicted = torch.flatten(gru_predicted).item()
        gru_pred.append(gru_predicted)

    # INVERSE
    gru_pred_inverse = scaler.inverse_transform(np.array(gru_pred).reshape(-1, 1))
    testY_inverse = scaler.inverse_transform(testY_tensor)

5.3.2 모델 평가¶

MAE와 MSE 값을 도출하여 모델을 평가합니다.

  • MAE(Mean Absolute Error, 평균 절대 오차) : 모델의 예측값과 실제값 차이의 절대값 평균
  • MSE(Mean Suquare Error, 평균 제곱근 오차) : 추정된 값과 실제값 간의 평균 제곱 차이의 제곱근
In [35]:
def MAE(true, gru_pred):
    return np.round(np.mean(np.abs(true-gru_pred)),2)

print('MAE SCORE : ', MAE(gru_pred_inverse, testY_inverse))
MAE SCORE :  9.88
In [36]:
def RMSE(true, pred):
    return np.round(np.sqrt(np.mean((true - pred) ** 2)), 2)

# RMSE 계산
rmse = RMSE(testY_inverse, gru_pred_inverse)
print('RMSE SCORE : ', rmse)
RMSE SCORE :  12.73

5.3.3 예측 그래프 비교¶

In [37]:
# GRU 예측 그래프

# 그래프의 제목으로 target 데이터의 열 이름을 사용
target_column_name = target.columns[0]

plt.rcParams["figure.figsize"] = (16,6) # 그래프 사이즈

plt.plot(gru_pred_inverse) # 예측값 그래프 도출
plt.plot(testY_inverse) # 실측값 그래프 도출

plt.title(f'[ {target_column_name} ] 의 예측값과 실측값 비교 그래프', fontsize=20, pad=20) # 그래프 제목
plt.xlabel('Index', size=15) # 그래프 x축 이름
plt.ylabel('Value', size=15) # 그래프 y축 이름
plt.legend(['예측값', '실측값']) # 그래프 범례
Out[37]:
<matplotlib.legend.Legend at 0x2748a985e80>
In [ ]: