표준 선형 회귀모형은 가장 간단하고 오래된 선형 회귀모형으로 절편과 기울기를 추정하기 위해 실제값과 예측값 사이의 평균제곱오차 (MSE)를 최소화하는 절편과 기울기를 찾는다. 여기서 MSE는 비용함수 (Cost Function)라고 하며, 이는 학습된 결과가 실제 데이터와 얼마나 떨어졌는지를 나타낸다. 표준 선형회귀 모형의 MSE 비용함수는 각 독립변수의 계수()에 대해 다음과 같이 계산한다.
일반적으로 선형 회귀모형이라고 하면 표준 선형 회귀모형을 일컫는다. 선형 회귀모형을 모델링할 때는 특별히 조절할 인자가 없는 것이 장점이지만, 모형의 복잡도를 제어할 방법도 없다는 한계가 있다.
실습
1) 종속변수 분포 확인 및 로그 변환
모형 생성에 앞서 종속변수인 'A' 의 분포를 살펴보자. 정규분포가 아닌 경우 수치 예측 성능이 떨어질 수 있으므로 적절히 로그 변환을 하는 것이 바람직할 수 있기 때문이다.
#1. 모듈 및 함수 불러오기
import pandas as pd
from matplotlib import rc, font_manager
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
#2. 데이터 불러오기
df = pd.read_csv('data.csv’, encoding = ‘cp949’)
#3. 폰트 설정
font_name = font_manager.FontProperties(fname=‘c:/Windows/Fonts/malgun.ttf’).get_name()
plt.rc(‘font’, family=font_name)
#4. 히스토그램 생성
plt.title(‘A 분포’)
sns.distplot(df[‘A’])
다음은 종속변수인 'A'기에 대한 로그 변환 후 다시 히스토그램을 그려 변환된 분포를 살펴보는 과정이다.
plt.title(‘로그 변환 후 A’)
df[‘A’] = np.log1p(df[‘A’])
sns.distplot(df[‘A’])
2) 변수 지정 및 전처리
다음으로 독립변수와 종속변수를 지정하고, 전체 데이터 세트를 학습용 데이터 세트와 평가용 데이터 세트로 분리한 후 독립변수에 해당하는 데이터 세트를 표준화 및 더미변수화하는 단계를 거친다. 표준화는 측정 단위가 다른 수치형 변수들에 대해 평균을 0, 표준편차를 1로 변환하여 변수들의 척도를 동일하게 맞춰주는 작업이다.
#1. 모듈 및 함수 불러오기
from sklearn.model_selection import train_test_split
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import StandardScaler
from sklearn.preprocessing import OneHotEncoder
#2. 변수 지정(독립변수/종속변수)
num=[‘b’, ‘c’, ‘d’, ‘e’, ‘f’, ‘g’, ‘h’, ‘i’]
cg=[‘j’, ‘k’, ‘l’, ‘m’, ‘n’, ‘o’, ‘p’, ‘q’]
X = df[df.r==0][num+cg]
Y = df[df.r==0][‘A’]
#3. 데이터 분할(학습용/평가용 데이터 세트)
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.3, random_state=0)
#4. 표준화 및 원핫인코딩
ct = ColumnTransformer([(‘scaling’, StandardScaler(), num), (‘onehot’, OneHotEncoder(sparse=False), cg)])
ct.fit(X_train)
X_train=ct.transform(X_train)
X_test=ct.transform(X_test)
print(X_train)
▶ 범주형 변수의 전처리 방법인 원핫인코딩의 개념을 살펴보자. 원핫인코딩 (One-Hot Encoding)이란 범주형 변수를 일종의 더미변수로 변환하는 방법으로서 범주형 변수의 범주 개수만큼 칼럼을 생성하여 해당 범주에 속하면 1로, 속하지 않으면 0으로 코딩을 변환해주는 작업이다. 만약 범주형 변수를 원핫인코딩 처리하지 않은 채 모형을 생성한다면 모형이 범주형 변수의 값을 수치형 데이터로 착각하여 예측 결과를 왜곡시킬 수 있다.
[표 1] 원핫인코딩의 개념
수치형 변수에는 표준화 함수인 StandardScaler( )를, 범주형 변수에는 원핫인코딩 함수인 OneHotEncoder( )를 적용하고, 이를 ColumnTransformer( ) 함수의 인자로 입력하여 표준화와 원핫인코딩을 한 번에 수행하는 ct 객체를 만든다. ‘scaling’과 ‘onehot’은 각 전처리가 수행된 결과를 저장하기 위해 사용자가 임의로 지정해준 이름이다.
OneHotEncoder( ) 함수의 인자인 sparse는 범주형 독립변수를 희소행렬 (Sparse Matrix) 형태로 반환할 것인지를 설정하는 인자로서 원핫인코딩을 하려는 변수의 범주가 매우 많을 경우 메모리를 절약하기 위해 독립변수를 해당 범주의 위치만 저장하는 희소행렬 형태로 전환하는 것이 바람직하다. 그러나, 본 실습에서 사용할 범주형 독립변수들은 범주의 수가 많지 않으므로 False로 설정하여 일반적인 Numpy 배열 형태로 반환하도록 하였다.
fit( ) 함수를 이용하여 ct 객체에 학습용 데이터 세트의 독립변수인 X_train을 적용한다. fit( )과 같은 함수는 반환값이 자기 자신의 객체 (Self Object)이기 때문에 별도의 객체를 지정해주지 않아도 된다. 따라서, 다음 두 코드는 같은 의미를 갖는다.
- ct =ct.fit(X_train)
- ct.fit(X_train)
이제 ct 객체의 transform( ) 함수를 사용해 학습용 데이터 세트의 독립변수(X_train)와 평가용 데이터 세트의 독립변수(X_test)의 스케일 변환(표준화) 및 원핫인코딩을 해준다. 그리고 변환한 값을 다시 X_test, X_train 변수에 할당하고, print(X_train) 함수를 통해 전처리 작업이 적용된 학습용 데이터 세트의 독립변수 X_train을 출력하였다.
3) 모형 학습 및 예측
이제 모형을 생성하여 학습용 데이터를 모형에 학습시키고, 평가용 데이터를 이용해 실제 예측을 수행해 본다.
#1. 모듈 및 함수 불러오기
from sklearn.linear_model import LinearRegression
#2 모형 학습
lr= LinearRegression().fit(X_train, Y_train)
#3 모형 예측
Y_pred = lr.predict(X_test)
print(‘평가용 데이터 세트에 대한 예측값\n’, Y_pred)
4) 모형 평가
결정계수와 RMSE를 사용하여 모형의 성능을 평가해보자.
• 결정계수 평가
print(‘학습용 데이터 세트 결정계수: {:.3f}’.format(lr.score(X_train, Y_train)))
print(‘평가용 데이터 세트 결정계수: {:.3f}’.format(lr.score(X_test, Y_test)))
• RMSE 평가
선형 회귀모형의 오차의 정도를 확인하기 위해 RMSE를 구해보자. RMSE를 구하기 위해서는 sklearn.metrics 모듈의 mean_squared_error( ) 함수를 이용해 MSE를 구한 다음 sqrt( ) 함수를 이용하여 MSE에 제곱근을 취해야 한다.
#1. 모듈 및 함수 불러오기
from sklearn.metrics import mean_squared_error
from math import sqrt
#2. RMSE 계산
rmse= sqrt(mean_squared_error(Y_test, Y_pred))
print(‘RMSE: {:.3f}’.format(rmse))
RMSE는 오차를 표현하는 지표이므로 0에 가까울수록 모형의 성능이 우수한 것이지만, RMSE을 판단하는 명확한 기준은 존재하지 않는다. RMSE의 단위는 예측값과 동일하므로 데이터의 단위에 따라 RMSE의 크기는 달라지기 때문이다.
5) 절편 및 가중치 출력
구축된 표준 선형 회귀모형의 절편과 가중치를 확인해보자.
print(‘절편: ‘, np.round(lr.intercept_, 3))
print(‘가중치: ‘, np.round(lr.coef_, 3))
This post was written based on what I read and studied the book below.
http://www.kyobobook.co.kr/product/detailViewKor.laf?mallGb=KOR&ejkGb=KOR&barcode=9791195511747
댓글