Artificial Intelligence
[Python] Regression analysis - Boston
테리는당근을좋아해
2020. 1. 29. 21:31
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")