선형회귀의 정의
입력 변수(독립 변수)와 출력 변수(종속 변수) 사이의 선형적인 관계를 모델링하는 기법
즉, 데이터를 가장 잘 설명하는 직선을 찾아내는 것
광고비, 계절성, 요일 등의 데이터를 바탕으로 매출을 예측 / 수업 출석률, 과제 점수, 시험 점수를 이용해 최종 학점을 예측 / 키, 나이, 식습관 정보를 바탕으로 예상 몸무게 예측 등의 상황에서 선형회귀분석이 사용될 수 있음
수학적 표현
y=wx+b
훈련/검증 데이터 분할
# 속성(변수) 선택
X=ndf[['weight']] # 독립변수
Y=ndf[['mpg']] # 종속변수
# train data와 test data로 구분 (7:3 비율)
from sklearn.model_selection import train_test_split
X_train, X_test, Y_train, Y_test = train_test_split(X,Y,test_size=0.3,random_state=10)
print('train data 개수:', len(X_train))
print('train data 개수:', len(X_test))
모델 학습 및 검증
# sklearn 라이브러리에서 선형회귀분석 모듈 가져오기
from sklearn.linear_model import LinearRegression
# 단순회귀번석 모델 객체 생성
lr = LinearRegression()
# train data를 가지고 모델 학습
lr.fit(X_train, Y_train) # 학습에 사용되는 입력 데이터, 출력 데이터
# 학습을 마친 모델에 test data를 적용하여 결정계수 계산
r_square = lr.score(X_test, Y_test)
print('결정계수:', r_square)
결정계수: 모델이 전체 데이터의 변동성을 얼마나 잘 설명하는가? 를 나타내는 수치
이때 R² = 0.85 라면, 85%의 연비 변화를 자동차 무게로 설명할 수 있다는 뜻
# 모델에 test data 데이터를 입력하여 예측한 값 y_hat을 실제 y와 비교
y_hat = lr.predict(X_test) # 학습된 모델 lr이 X_test를 보고 예측한 종속변수
# 오차 계산
test_preds = pd.DataFrame(Y_test)
test_preds.columns = ['Y_test']
test_preds['y_hat'] = y_hat
# 실제값(Y_test)과 예측값(y_hat)을 비교
test_preds['squared_error'] = (test_preds['y_hat'] - test_preds['Y_test']) ** 2
test_preds
# 오차 분석
fig, axes = plt.subplots(1,2, figsize=(10,5)) # 1행 2열 구조
sns.regplot(x='Y_test', y='y_hat', data=test_preds, ax=axes[0]);
# 그래프가 왼쪽에 뾰족하게 치우쳐 있으면 → 예측이 전반적으로 정확하다는 뜻
# 커널 밀도 추정을 이용해 데이터 분포를 부드럽게 표현
sns.kdeplot(x='squared_error', data=test_preds, ax=axes[1]);