사이킷런의 보스턴 주택 가격 데이터셋을 사용하여 선형회귀 분석을 한다. 참고로 해당 데이터셋은 윤리적인 문제로 scikit-learn 1.2 버전 이후로 삭제되었다.


1. 라이브러리 및 데이터 로드

# 데이터프레임 형태로 만들기위해 pandas 로드
import pandas as pd
# sklean 내장 데이터셋인 보스턴 주택가격 데이터셋 로드
from sklearn.datasets import load_boston
# 보스턴 데이터셋을 boston_dataset 변수에 저장
boston_dataset = load_boston()

🚨 DataFrame 형태로 만들어줘야하는 이유
아래 넘파이 배열은 boston_dataset.data의 출력 결과이다. 사이킷런에서 제공하는 보스턴 데이터셋은 넘파이 배열 형태로 저장되어있기 때문에 편의를 위해 Pandas로 DataFrame 형태로 만들어 주는 것이 좋다.

array([[6.3200e-03, 1.8000e+01, 2.3100e+00, ..., 1.5300e+01, 3.9690e+02,
        4.9800e+00],
       [2.7310e-02, 0.0000e+00, 7.0700e+00, ..., 1.7800e+01, 3.9690e+02,
        9.1400e+00],
       [2.7290e-02, 0.0000e+00, 7.0700e+00, ..., 1.7800e+01, 3.9283e+02,
        4.0300e+00],
       ...,
       [6.0760e-02, 0.0000e+00, 1.1930e+01, ..., 2.1000e+01, 3.9690e+02,
        5.6400e+00],
       [1.0959e-01, 0.0000e+00, 1.1930e+01, ..., 2.1000e+01, 3.9345e+02,
        6.4800e+00],
       [4.7410e-02, 0.0000e+00, 1.1930e+01, ..., 2.1000e+01, 3.9690e+02,
        7.8800e+00]])
pd.DataFrame(boston.data, columns=boston.feature_names)의 결과


2. 데이터 정보 확인

print(boston_dataset.DESCR)

📍 위 코드에 대한 출력 결과(일부만 가져옴)

데이터셋의 설명 및 피처 설명


보스턴 데이터셋에서 입력변수는 13개, 출력변수는 1개(MEDV)이며 피처에 대한 설명은 위와 같다. 이번 선형 회귀 모델에는 입력변수를 범죄(CRIM)만 사용하여 범죄율에 따른 집 값을 예측하는 것이 목표이다.


3. 입력변수, 출력변수 지정

# 입력변수와 출력변수 모두 dataframe 형태로 저장
x = pd.DataFrame(boston_dataset.data, columns=boston.feature_names)[['CRIM']]
y = pd.DataFrame(boston_dataset.target, columns=['MEDV'])
입력 변수(왼쪽), 출력 변수(오른쪽)


4. 학습, 테스트 데이터 나누기

from sklearn.model_selection import train_test_split

x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=.2, random_state=42)

학습 데이터셋은 80%, 테스트 데이터셋은 20%로 데이터를 나누고 random_state를 42로 설정하여 데이터 분배 결과를 고정할 수 있도록 한다.

# 잘 나누어졌는지 shape로 확인
print(x_train.shape, x_test.shape, y_train.shape, y_test.shape)
출력 결과
(404, 1) (102, 1) (404, 1) (102, 1)


5. 모델링, 평가

# 선형 회귀
from sklearn.linear_model import LinearRegression

model = LinearRegression()
# 학습데이터로 모델 학습
model.fit(x_train, y_train)
# 학습이 완료된 모델에 테스트 데이터를 입력하여 y값을 예측
y_predict = model.predict(x_test)

# 평가 (RMSE)를 위해 MSE 로드
from sklearn.metrics import mean_squared_error
mean_squared_error(y_test, y_test_prediction) ** 0.5
출력 결과
7.854561569919787

보스턴 주택 가격 데이터셋을 학습, 테스트 8:2로 데이터를 나누고 선형 회귀로 분석한 결과 약 7.8 정도의 오차를 가지는 모델을 생성하였다.


6. 모델링 시각화

train 데이터 셋으로 학습한 모델링(선형 회귀)의 theta 0과 theta 1의 결과는 아래와 같다.

# theta 0의 값
model.intercept_
# theta 1의 값
model.coef_

theta 0의 값 : array([24.23898177])
theta 1의 값 : array([[-0.39966675]])


이를 바탕으로 학습, 테스트용 데이터와 선형 회귀 결과를 그래프로 그려보았다. 시각화 결과는 다음과 같다. (시각화에 사용된 코드는 아래와 같다.)

import matplotlib.pyplot as plt

# 최적선 만드는 함수
def best_line(x, theta_0, theta_1):
    return x * theta_1 + theta_0

plt.scatter(x_train, y_train, color='green', alpha=0.5)
plt.scatter(x_test, y_test, color='blue', alpha=0.5)
plt.plot(x_train, best_line(x_train, 24.23898177, -0.39966675), color='red')
plt.legend(("train","test", "best line"))
plt.xlabel("CRIM")
plt.ylabel("MEDV")
plt.show()
train, test, 선형회귀 결과 시각화


6. Reference


👩🏻‍💻개인 공부 기록용 블로그입니다
오류나 틀린 부분이 있을 경우 댓글 혹은 메일로 따끔하게 지적해주시면 감사하겠습니다.

댓글남기기