[재회귀분석] 회귀분석 분석을 통해 보스턴 주택 가격 데이터 집합 분석

개요


scikit-learn 사이트에 Toy 데이터 세트가 몇 개 준비되어 있습니다.
그중의 하나인 보스턴 주택 가격 데이터 집합을 이용하여 재회귀 분석을 하고 잔차도를 그려 보았는데 신경 쓰이는 편차치가 발견되어 그 원인을 고찰했다.

보스턴 주택 가격 데이터 집합 회귀 분석


원하는 라이브러리 가져오기

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd 
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error

from sklearn.datasets import load_boston
%matplotlib inline

데이터 세트 읽기

df = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/housing/housing.data', header=None, sep='\s+')
df.columns = ['CRIM','ZN','INDUS','CHAS','NOX','RM','AGE','DIS','RAD','TAX','PTRATIO','B','LSTAT','MEDV']

데이터 프레임 확인

pd.DataFramae(df.head())
出力結果

특징량 및 정답 지정


데이터 프레임의 출력 결과에 따라 0~13열의 데이터를 특징량(설명 변수), 14행의 MEDV(주택 가격)를 정해(목적 변수)로 한다.
#住宅価格以外のデータを特徴量Xに設定
X = df.iloc[:, 0:13].values
#住宅価格を正解yに設定
y = df['MEDV'].values

특징량과 정답을 8:2로 훈련 데이터와 테스트 데이터로 나누다

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state=0)

표준화


예를 들어 방 수량의 특징량은 일반적으로 한 자릿수이지만 방의 크기는 일반적으로 두 자릿수 이상(m2)이다.이 경우 수치의 크기와 편차가 크게 다르기 때문에 같은 기준으로 평가할 수 없다.
따라서 표준화하고 비례를 통일해야 한다.
#特徴量の標準化
sc = StandardScaler()
#訓練データで標準化モデルを作成し変換
X_train_std = sc.fit_transform(X_train)
#作成した標準化モデルでテストデータを変換
X_test_std = sc.transform(X_test)
#標準化された訓練データ
X_train_std[0]

모형의 제작과 훈련


이 모델은 scikit-learn 선형 회귀 모델인 LinerRegression()을 사용합니다.
#モデルの作成
model = LinearRegression()
#モデルの訓練
model.fit(X_train_std,y_train)

경사 및 슬라이스 확인

print('傾き: ' , model.coef_)
print('切片: ' ,  model.intercept_)
出力結果

계산 MSE


MSE는 모델의 평가 지표 중 하나로 이 값이 낮을수록 모델의 성능이 좋다.
계산 방법은 예측치와 정답의 균형과 오차이다.
scikit-learn에서 제공하는 MSE 계산squared_error 함수를 사용하면 실현할 수 있지만 여기서는 반드시 손으로 계산해야 한다.
#訓練データ、テストデータの住宅価格を予測
y_train_pred = model.predict(X_train_std)
y_test_pred = model.predict(X_test_std)

#MSEの計算
MSE_train = np.mean((y_train_pred - y_train) ** 2)
MSE_test = np.mean((y_test_pred - y_test) ** 2)
print('MSE train: ', MSE_train)
print('MSE test:', MSE_test)
出力結果

잔차도


잔차도는 오차의 편차를 시각화하고 편차가 작을수록 성능이 좋은 모델이다.
그림을 확인한 후 약 -10에서 10까지의 범위 내에서 오차의 편차를 볼 수 있다.
plt.figure(figsize = (8,4)) #プロットのサイズ指定

plt.scatter(y_train_pred, y_train_pred - y_train,
                   c = 'red', marker = 'o', edgecolors='white',
                   label = 'Training data')
plt.scatter(y_test_pred, y_test_pred - y_test,
                   c = 'blue', marker='s', edgecolors='white',
                   label = 'Test data')
plt.xlabel('Predicted values')
plt.ylabel('Presiduals')
plt.legend(loc='upper left')
plt.hlines(y=0, xmin=-10,xmax=50,color='black', lw=2)
plt.tight_layout()

plt.show()
出力結果

잔차도에서 읽는 편차 값



위의 그림에서 빨간색으로 동그라미를 친 부분의 그림을 주의하세요.
잘 모르겠지만 직선으로 그려서 무슨 상관이 있는 것 같아요.
그럼 가격과 방수의 분포 행렬도를 봅시다.

위 그림의 오른쪽 상단에 있는 산포도를 주의하세요.
듣자니 집값의 상한선이 50이라고 한다.
어떤 의도로 이런 수치가 만들어졌는지는 알 수 없지만 주택가격 상한선이 설정됐기 때문으로 보인다.

총결산


이번에는 보스턴의 주택 가격 데이터 집합을 이용해 주택 가격의 회귀를 진행해 이 과정에서 발생한 편차치를 조사했다.
평소에 나는 무의식중에 도면을 출력해서 왜 이렇게 변했는지 고찰해 보았는데 많은 것을 볼 수 있었다.
또 원래 기계 학습을 할 때 상술한 편차치를 배제하는 경우가 많다.

좋은 웹페이지 즐겨찾기