선형 회귀
여러 입력 변수에 계수를 곱해 주거 만족도를 예측하고 계수의 의미를 해석하는 선형 회귀
모든 입력을 한 번에 합치기
- 선형 회귀(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) 성격: 한 조건의 불리함을 다른 조건의 유리함이 합산 과정에서 일부 상쇄 가능