콘텐츠로 이동

9.4 선형회귀를 이용한 다음 날 기온 예측

선형회귀

선형회귀(linear regression)는 각 특징에 계수를 곱해 합산한 값으로 레이블을 예측하는 모델이다.

ŷ = w1x1 + w2x2 + … + w9x9 + b

x1~x9는 특징 9개, w1~w9는 계수, b는 절편, ŷ는 예측값이다. 학습 과정에서는 학습 데이터의 예측값과 실제값의 차이를 제곱해 합산한 값이 최소가 되도록 계수와 절편을 결정한다.

모델 학습

scikit-learn의 LinearRegression으로 모델을 생성하고 fit으로 학습한다.

from sklearn.linear_model import LinearRegression

model = LinearRegression()
model.fit(train[features], train["target_temp"])

coef = pd.Series(model.coef_, index=features).round(3)
print(coef)
print("절편:", round(model.intercept_, 3))

실행 결과

temp_mean    -0.223
temp_max      0.545
temp_min      0.419
humidity     -0.000
precip_mm     0.018
wind_max     -0.103
sunshine_h    0.056
doy_sin      -0.921
doy_cos      -3.579
dtype: float64
절편: 3.358

계수의 해석

특징 계수 해석
temp_max 0.545 오늘 최고기온이 1℃ 높으면 다음 날 평균기온 예측값이 0.545℃ 증가
temp_min 0.419 오늘 최저기온이 1℃ 높으면 예측값이 0.419℃ 증가
temp_mean −0.223 단독 해석 불가(아래 설명)
wind_max −0.103 풍속이 강한 날의 다음 날 기온이 낮은 경향
doy_cos −3.579 계절 위치에 따른 보정값

temp_mean의 계수가 음수인 결과는 "오늘이 따뜻할수록 내일이 춥다"는 의미가 아니다. 평균기온은 최고기온·최저기온과 거의 같은 정보를 담고 있으므로, 세 특징이 함께 입력되면 계수가 서로의 영향을 분담한다. 특징 사이의 상관이 높아 개별 계수를 독립적으로 해석할 수 없는 상태를 다중공선성(multicollinearity)이라고 한다. 세 기온 계수의 합(0.545 + 0.419 − 0.223 = 0.741)이 "오늘 기온 전체가 1℃ 높을 때의 증가량"에 가깝다.

예측

평가 데이터의 특징을 입력해 2025년의 다음 날 평균기온을 예측한다.

pred = model.predict(test[features])
result = pd.DataFrame({"date": test["date"], "actual": test["target_temp"], "pred": pred.round(1)})
print(result.head(5))

실행 결과

           date  actual  pred
1461 2025-01-01    -1.1   0.9
1462 2025-01-02    -2.6  -0.1
1463 2025-01-03    -1.9  -2.3
1464 2025-01-04     0.5  -1.0
1465 2025-01-05    -1.6  -0.4

첫 행은 2025-01-01의 자료로 예측한 01-02의 평균기온이다. 실제값은 −1.1℃, 예측값은 0.9℃이므로 오차는 2.0℃다. 9.5절에서 364일 전체의 오차를 지표로 요약한다.

확인 문제

  1. features에서 temp_mean을 제외하고 다시 학습한 뒤, temp_max·temp_min 계수가 어떻게 변화하는지 확인하시오.
  2. doy_sin·doy_cos를 제외하고 학습하면 9.5절의 MAE가 증가하는지 감소하는지 확인하시오.