logo

선형 회귀

여러 입력 변수에 계수를 곱해 주거 만족도를 예측하고 계수의 의미를 해석하는 선형 회귀

모든 입력을 한 번에 합치기

  • 선형 회귀(linear regression): 각 입력 변수에 계수를 곱한 뒤 모두 더해 숫자를 예측하는 모델
  • 계수(coefficient): 입력 변수 한 단위에 배정한 가중치
  • 절편(intercept): 모든 입력값이 0일 때 예측의 출발점

입력 변수가 세 개인 선형 회귀식:

  • : 모델의 예측값
  • : 절편
  • , , : 각 입력 변수의 계수
  • , , : 새 사례의 입력값

모델 학습의 목표는 실제 만족도와 예측 만족도의 차이가 작아지는 절편과 계수를 찾는 것.

예시: 주거 만족도

의사결정나무에서 사용한 240명의 주거 조건과 만족도 자료를 그대로 사용.

  • 입력
    • commute: 통학 시간(분)
    • rent: 월세(만원)
    • noise: 소음 수준(1은 조용함, 5는 시끄러움)
  • 타깃
    • score: 주거 만족도(0점에서 100점)

실습 준비

Colab에서 두 파일을 바로 내려받으려면 다음 셀 실행.

!wget -q -O housing.xlsx "https://i7xuddrpzatg79hh.public.blob.vercel-storage.com/content/shared/sha256/98/98281ede1416a15670d419ced730f15ab08d51ff370771636544a1261bb3c53f/housing.xlsx?download=1"
!wget -q -O cases.xlsx "https://i7xuddrpzatg79hh.public.blob.vercel-storage.com/content/shared/sha256/85/85f41d8db294086be3bd075f460463b844856bb1b72e8974f08c2088544c0cc0/cases.xlsx?download=1"

데이터 불러오기

다운로드한 Excel 파일을 코랩의 현재 폴더에 올린 뒤 실행.

import pandas as pd

df = pd.read_excel("housing.xlsx", sheet_name="data")
df.head()
실행 결과
   commute  rent  noise  score
0       10    51      2   90.8
1       56    87      5   48.2
2       48    47      2   66.8
3       33    92      4   53.0
4       33    90      3   70.7

입력과 타깃 나누기

features = [
    "commute",
    "rent",
    "noise",
]
X = df[features]
y = df["score"]
  • : 통학 시간, 월세, 소음 수준
  • : 주거 만족도

선형 회귀 학습

from sklearn.linear_model import LinearRegression

model = LinearRegression()
model.fit(X, y)
실행 결과
LinearRegression()

fit(X, y)는 최소제곱법(least squares)으로 만족도 예측 오차의 제곱합이 가장 작아지는 절편과 계수를 탐색.

절편 확인

model.intercept_.item()  # 절편
실행 결과
116.65958153724841

절편은 약 116.66점. 통학 시간, 월세, 소음 수준이 모두 0일 때의 계산상 예측값. 세 입력이 모두 0인 주거 조건은 자료의 일반적인 사례가 아니므로, 절편은 주로 계산의 출발점으로 사용.

계수 확인

coef = pd.DataFrame({
    "variable": features,
    "coefficient": model.coef_,
})
coef
실행 결과
  variable  coefficient
0  commute    -0.456990
1     rent    -0.223370
2    noise    -5.529794

학습한 예측식:

계수 해석

한 계수는 다른 입력 변수가 같을 때 해당 변수가 한 단위 증가하면 예측 만족도가 얼마나 달라지는지를 표시.

  • 통학 시간 계수
    • 월세와 소음 수준이 같을 때 통학 시간 1분 증가
    • 예측 만족도 약 0.457점 감소
  • 월세 계수
    • 통학 시간과 소음 수준이 같을 때 월세 1만 원 증가
    • 예측 만족도 약 0.223점 감소
  • 소음 수준 계수
    • 통학 시간과 월세가 같을 때 소음 수준 1단계 증가
    • 예측 만족도 약 5.530점 감소

계수의 부호는 예측값이 변하는 방향, 계수의 절댓값은 한 단위 변화에 따른 예측 변화량. 세 변수의 단위가 분, 만 원, 단계로 다르므로 계수의 절댓값만으로 중요도를 직접 비교하기는 어려움.

새로운 사례 예측

cases = pd.read_excel("cases.xlsx", sheet_name="cases")
cases.head()
실행 결과
   commute  rent  noise
0       15    60      1
1       35    85      3
2       55   110      5

cases.xlsx에는 입력 변수만 존재. 선형 회귀식으로 만족도 예측값을 계산해 새 열에 추가.

cases["prediction"] = model.predict(cases)
cases
실행 결과
   commute  rent  noise  prediction
0       15    60      1   90.872744
1       35    85      3   65.089116
2       55   110      5   39.305488
  • 첫 사례: 만족도 약 90.9점 예측
  • 둘째 사례: 만족도 약 65.1점 예측
  • 셋째 사례: 만족도 약 39.3점 예측

각 예측은 절편에서 시작해 통학 시간, 월세, 소음 수준의 기여분을 모두 더한 결과.

의사결정나무와 선형 회귀

  • 의사결정나무: 한 번에 한 입력 변수에 질문하고 선택한 가지를 따라 예측
  • 선형 회귀: 모든 입력 변수의 값을 계수와 곱해 동시에 합산
  • 의사결정나무의 예측: 같은 잎에 속한 사례에 같은 값 부여
  • 선형 회귀의 예측: 입력값이 달라지면 일정한 비율로 연속해서 변화
  • 선형 회귀의 보상적(compensatory) 성격: 한 조건의 불리함을 다른 조건의 유리함이 합산 과정에서 일부 상쇄 가능
Previous
의사결정 나무