Skip to content

Mangom72/-

Repository files navigation

도시 스마트팜 토양수분/온도 예측 모델

라즈베리파이5 엣지 환경에서 동작하는 경량 예측 AI 모델입니다. "에너지 효율"이 핵심 목표라서 무거운 딥러닝 대신 선형 계열 회귀(StandardScaler + Ridge)를 사용합니다.

  • 입력: 최근 30분간의 (온도, 습도, 토양수분 평균, 조도) 시계열 (1분 간격)
  • 출력: 30분 후의 (토양수분 평균, 온도) 예측값
  • 입력 데이터는 이미 수집된 CSV 파일이라고 가정합니다. (센서/액추에이터/릴레이/펌프/MQTT/UART/ESP32 등 하드웨어·제어 코드는 이 프로젝트 범위 밖입니다.)

1. 설치

pandas, numpy, matplotlib는 이미 설치돼 있다고 가정합니다. 추가로 scikit-learnjoblib만 설치하면 됩니다.

pip install scikit-learn joblib

사용 라이브러리: pandas, numpy, scikit-learn, joblib, matplotlib (딥러닝 라이브러리 미사용)

Windows에서 sklearn 로드가 막힐 때 (Smart App Control)

Windows 11의 Smart App Control(SAC) 이 켜져 있으면 scikit-learn의 일부 서명되지 않은 .pyd 파일을 차단해 ImportError: DLL load failed ... (An Application Control policy has blocked this file) 가 날 수 있다. 이 경우 두 가지 선택지가 있다.

  1. WSL2(Linux)에서 실행 (권장) — SAC는 Windows 네이티브 바이너리에만 적용되므로 WSL에서는 막히지 않는다. 배포 대상(라즈베리파이5 = Linux/ARM)과도 환경이 가깝다.
    # WSL Ubuntu 안에서 (한 번만)
    python3 -m venv ~/appletree_venv
    curl -fsSL https://bootstrap.pypa.io/get-pip.py | ~/appletree_venv/bin/python   # 시스템 pip이 없을 때
    ~/appletree_venv/bin/pip install scikit-learn pandas numpy joblib matplotlib
    
    # 프로젝트 폴더는 /mnt/c/... 로 접근
    cd /mnt/c/Users/<사용자>/Desktop/apple_tree
    ~/appletree_venv/bin/python train.py
  2. Smart App Control 끄기 — 설정 → 개인정보 및 보안 → Windows 보안 → 앱 및 브라우저 컨트롤 → Smart App Control → 끄기. (끄면 영구적이며, 다시 켜려면 Windows 초기화가 필요하니 신중히 결정한다.)

2. 파일 구성 / 역할

파일 역할
prepare_data.py 공용 모듈. 컬럼명/윈도우/호라이즌/경로 등 상수와, CSV 로드·결측치 처리·슬라이딩 윈도우 생성·시계열 분할 함수를 제공. 나머지 스크립트가 import 한다.
make_sample_data.py 실제 CSV가 없을 때 테스트용 7일치 합성 데이터(sample.csv) 생성.
train.py 모델 학습 → model_soil.pkl, model_temp.pkl 저장 + 학습/테스트 MAE·RMSE 출력.
evaluate.py 테스트셋 평가(MAE·RMSE) + 예측 vs 실측 비교 그래프(eval_soil.png, eval_temp.png) 저장.
predict.py 저장된 모델 로드 후 predict_next() 제공. 제어 로직에서 import 해서 사용.
README.md 본 문서.

각 스크립트는 if __name__ == "__main__" 으로 단독 실행 가능합니다.


3. 실행 순서

# 1) (선택) 테스트용 샘플 CSV 생성  ── 실제 CSV가 있으면 건너뛰세요
python make_sample_data.py

# 2) (선택) 전처리 스모크 테스트 ── 윈도우 shape 확인
python prepare_data.py

# 3) 모델 학습 → model_soil.pkl, model_temp.pkl 생성
python train.py
#    다른 CSV로 학습하려면:  python train.py your_data.csv

# 4) 테스트셋 평가 + 비교 그래프 저장
python evaluate.py

# 5) 최근 30분으로 30분 후 예측 예시
python predict.py

4. 제어 로직에서 예측 함수 사용하기

predict.predict_next() 는 제어 로직에서 import 해서 쓰도록 설계했습니다.

from predict import predict_next
import pandas as pd

# 최근 30분(30행) 데이터를 DataFrame으로 준비
#  - 필요한 컬럼: temp, humidity, lux, 그리고 soil_avg (또는 soil1~4)
recent_df = get_recent_30min()        # ← 데이터 수집부에서 가져온다고 가정

result = predict_next(recent_df)
print(result)   # {"soil_avg": 47.3, "temp": 25.1}  ← 30분 후 예측

# 또는 numpy 배열 (shape (30, 4), 컬럼 순서 = [temp, humidity, soil_avg, lux])
import numpy as np
arr = np.array(...)                   # shape (30, 4)
result = predict_next(arr)

predict_next() 는 행 수(30), 피처 수(4), 결측치(NaN) 여부를 검증하고, 모델은 모듈 로드 시 1회만 읽어 캐싱하므로 반복 호출이 가볍습니다.


5. 설정 변경 (컬럼명 / 윈도우 / 호라이즌)

모든 설정 상수는 prepare_data.py 상단 한 곳에 모여 있습니다. CSV 포맷이나 예측 범위가 바뀌면 여기만 고치면 전체 파이프라인이 따라갑니다.

# prepare_data.py 상단
TS_COL       = "timestamp"
TEMP_COL     = "temp"
HUMIDITY_COL = "humidity"
LUX_COL      = "lux"
SOIL_COLS    = ["soil1", "soil2", "soil3", "soil4"]

FEATURE_COLS = [TEMP_COL, HUMIDITY_COL, SOIL_AVG_COL, LUX_COL]  # 입력 4피처
TARGET_COLS  = [SOIL_AVG_COL, TEMP_COL]                          # 출력 2값

WINDOW     = 30    # 입력 윈도우 길이(분)
HORIZON    = 30    # 몇 분 후를 예측할지
TEST_RATIO = 0.2   # 테스트셋 비율(시간순 뒤쪽)

컬럼명/윈도우/호라이즌을 바꾼 뒤에는 반드시 train.py 를 다시 실행해 모델을 재학습하세요.


6. 모델·데이터 메모

  • 시계열 분할: shuffle=False. 시간순으로 앞 80% 학습 / 뒤 20% 테스트 (미래 정보 누수 방지).
  • 입력 표현: 30분 × 4피처 = 120차원 벡터로 펼쳐 회귀에 입력.
  • 결측치 처리: 시계열 선형보간 → 앞채움(ffill) → 뒤채움(bfill).
  • 데이터가 적을 때: 행 수가 WINDOW + HORIZON(기본 60) 미만이면 학습 샘플을 만들 수 없어 명확한 에러를 냅니다. 7일치(약 10080행) 정도면 충분합니다.
  • 모델 파일: model_soil.pkl, model_temp.pkl 각각에 StandardScaler가 함께 저장되어 predict.py 에서 별도 스케일링 없이 바로 추론합니다.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages