본문 바로가기
Artificial Intelligence

[Python] Regression analysis - Boston

by 테리는당근을좋아해 2020. 1. 29.

Boston

housing price 문제로 13개의 feature로 평균 주택 가격을 예측하는 회귀문제

 

 

데이터 불러오기

scikit-learn dataset에서 boston dataset을 load

from sklearn.datasets import load_boston #scikit-learn의 datasets에서 sample data import

boston = load_boston() # boston dataset load

 

key, description 확인

print(boston.keys()) # 각 key 확인
print(boston.DESCR) # boston datasets description

 

데이터 프레임으로 변환

# 데이터 프레임으로 변환
df = pd.DataFrame(data=boston.data, columns=boston.feature_names)
df['price'] = boston.target
print(df)

 

missing value 검사

print(df.isnull().sum())

 

 

탐색적 데이터 분석

몇 개의 이상값을 제외하면 정규 분포 형태를 띄는 것을 확인할 수 있다.

import matplotlib.pyplot as plt
import seaborn as sns

# 분포표를 통해서 데이터 값의 전반적인 형태 검사
sns.distplot(df['price'])
plt.show()

 

상관 행렬을 통해서 각 독립변수와 종속변수와의 상관관계를 분석한다.

correlation_matrix = df.corr().round(2)
sns.heatmap(data=correlation_matrix, annot=True)
plt.show()

상관계수의 범위는 -1부터 1까지이다. 1에 가까울수록 양의 상관관계, -1에 가까울수록 음의 상관관계를 가진다.

상관행렬을 통해서 'price'와 강한 상관관계를 가지는 독립변수는 'LSTAT'와 'RM'인 것을 확인할 수 있다.

또한 독립 변수 간 강한 상관 관계를 가질 경우 이 두 변수는 밀접한 관계를 가지므로 모델학습에 모두 사용해서는 안된다.

 

# scatter
cols = ["price","LSTAT", "RM"]
sns.pairplot(df[cols])
plt.show()

산점도를 통해서 LSTAT가 증가할 때 price가 하락하고, RM이 증가할 때 price도 함께 증가하는 것을 확인할 수 있다.

 

학습 모델 만들기

import numpy as np

x = pd.DataFrame(np.c_[df["LSTAT"], df["RM"]], columns=["LSTAT", "RM"])
y = df["price"]

탐색적 데이터 분석을 통해 label과 강한 상관관계를 가지는 feature를 추출한다.

 

from sklearn.model_selection import train_test_split

x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=5)
print(x_train.shape)
print(x_test.shape)
print(y_train.shape)
print(y_test.shape)

 

 

학습한 모델을 test하기 위해 scikit-learn의 train_test_split 라이브러리를 통해 train data의 20%의 test data를 만든다.

 

from sklearn.linear_model import LinearRegression

model = LinearRegression()
model.fit(x_train, y_train)

scikit-learn의 LinearRegression 라이브러리로 기계학습한다.

 

학습모델 평가

from sklearn.metrics import mean_squared_error, r2_score

# train set에 대한 모델 평가
y_train_predict = model.predict(x_train)
rmse = (np.sqrt(mean_squared_error(y_train, y_train_predict)))
r2 = r2_score(y_train, y_train_predict)
print("train set")
print("price is {}".format(rmse))
print("R2 Score is {}".format(r2))
print("\n")

# test set에 대한 모델 평가
y_train_predict = model.predict(x_test)
rmse = (np.sqrt(mean_squared_error(y_test, y_train_predict)))
r2 = r2_score(y_test, y_train_predict)
print("train set")
print("price is {}".format(rmse))
print("R2 Score is {}".format(r2))
print("\n")

 

소스코드

from sklearn.datasets import load_boston #scikit-learn의 datasets에서 sample data import
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np

from sklearn.model_selection import train_test_split

from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score


boston = load_boston() # boston dataset load
print(boston.keys()) # 각 key 확인
print(boston.DESCR) # boston datasets description

# 데이터 프레임으로 변환
df = pd.DataFrame(data=boston.data, columns=boston.feature_names)
df['price'] = boston.target
print(df)

# print(df.isnull().sum())

# 분포표를 통해서 데이터 값의 전반적인 형태 검사
# sns.distplot(df['price'])
# plt.show()

# 상관행렬
# 상관계수의 범위는 -1에서 1
# 1에 가까울수록 양의 상관관계
# -1에 가까울수록 음의 상관관계
# 상관행렬을 통해서 price와 강한 상관관계를 가지는 것은
# LSTAT와 RM인 것을 확인할 수 있다
# 또한 독립 변수 간 강한 상관관계를 가지는 변수는
# 밀접한 관계를 가지므로 모델학습에 이러한 변수들을 모두 사용하면 안된다.
# RAD-TAX, DIS-AGE가 서로 강한 상관계를 가진다.
# correlation_matrix = df.corr().round(2)
# sns.heatmap(data=correlation_matrix, annot=True)
# plt.show()

# scatter
# cols = ["price","LSTAT", "RM"]
# sns.pairplot(df[cols])
# plt.show()

x = pd.DataFrame(np.c_[df["LSTAT"], df["RM"]], columns=["LSTAT", "RM"])
y = df["price"]

x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=5)
# print(x_train.shape)
# print(x_test.shape)
# print(y_train.shape)
# print(y_test.shape)

# 학습
model = LinearRegression()
model.fit(x_train, y_train)


# train set에 대한 모델 평가
y_train_predict = model.predict(x_train)
rmse = (np.sqrt(mean_squared_error(y_train, y_train_predict)))
r2 = r2_score(y_train, y_train_predict)
print("train set")
print("price is {}".format(rmse))
print("R2 Score is {}".format(r2))
print("\n")

# test set에 대한 모델 평가
y_train_predict = model.predict(x_test)
rmse = (np.sqrt(mean_squared_error(y_test, y_train_predict)))
r2 = r2_score(y_test, y_train_predict)
print("train set")
print("price is {}".format(rmse))
print("R2 Score is {}".format(r2))
print("\n")

댓글