파이썬에 탑재되어 있는 보스턴 집값 데이터셋을 활용하여 보스턴 집값 예측하는 코딩 짜기
두가지 분석 방법을 적용해 볼 예정,
1. Linear Regression
2. Logistic Regression
먼저, Boston Housing Datasets 불러오기
from sklearn.datasets import load_boston
data = load_boston() # boston housing 데이타를 data로 정의
print(data.data.shape) # 위에서 정의한 data의 테이터 구성 확인
(506, 13)
어떠한 feature와 key 가 있는지 한번 확인해 보자.
data.feature_names # feature 확인
array(['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD',
'TAX', 'PTRATIO', 'B', 'LSTAT'], dtype='<U7')
print(data.keys())
print(type(data.key())) # key는 dictionary 형태로 아래의 key가 정의 되어 있는 것을 확인
dict_keys(['data', 'target', 'feature_names', 'DESCR', 'filename'])
<class 'dict_keys'>
이제 데이타 내용을 확인해 보자.
print(data.DESCR) # Describe

집값의 분포가 어떻게 되어 있는지 확인해 보기 위해,
matplotlib 을 불러와 히스토그램을 그려 봤다.
import matplotlib.pyplot as plt
plt.hist(data.target)

이번에는 각 요소들에 대한 집값의 분포를 산포도를 그려 알아보자.
for index, feature_name in enumerate(data.feature_name)
# enumerate() 함수는 반복시 사용
plt.figure()
plt.scatter(data.data[:,index], data.target) #feature name 별 target의 산포도를 그려라
plt.ylabel('Price', size=15) # y축 제목 설정
plt.xlabel(feature_name, size=15)

이제 어느정도 데이터 파악을 했으니,
모델 객체를 생성해 보자.
# 훈련 데이터와 테스트 데이터 분리
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(data.data, data.target)
#data의 data 내용과 target을 각각 train과 test로 나눔
x_train.shape, x_test.shape, y_train.shape, y_test.shape
((379, 13), (127, 13), (379,), (127,))
Linear Regression(선형 회귀분석을 적용해 보자)
from sklearn.linear_model import LinearRegression
clf = LinearRegression() # clf 함수 정의
clf.fit(x_train, y_train) # clf 함수에 train 값을 적용해 학습
predicted = clf.predict(x_test) # 학습한 모델에 test값을 넣어 나온 값을 predicted 라고 정의
answer = y_test # test의 실제 값을 answer라고 정의
자, 이제 이 모델이 제대로 만들어진 모델인지 확인해 보자.
RMS (Root Mean Square)를 적용해 오차의 크기를 비교 분석함으로써 예측이 잘 맞았는지 확인해 볼 수 있다.
import numpy as np
print("RMS: %s " % np.sqrt(np.mean((predicted - answer)**2)))
RMS: 5.007703162594393
RMS 값이 작아 보이지는 않는다.
그렇다면 실제로 어떤 값을 보여줬는지 보자.
print(clf.predict(data.data[1].reshape(1,-1)))
[25.0892807]
# target의 1번 값을 제대로 예측하는지 보기 위해 1번 데이타 값을 넣어봄
# 그 결과 값이 25.089가 나왔음
# 실제로 1번에 대한 target 값(answer, y_test) 값은 21.6
# 오차가 제법 있음을 확인
# 파이썬은 '0'부터 시작

흠... 예상값(predicted)과 실제값(answer)의 산포도를 그려보면
plt.scatter(answer, predicted)

선형회귀의 모습이긴 한데, 분포된 모습이 일정한 두께를 지닌 선형의 모습이다.
(아직 걷어내지 않은 잔차가 있나 보다)
잔차를 더 확실하게 알아보기 위해
resid = answer - predicted # 실제값과 예측값의 차이
plt.scatter(y_test, resid)

실제값을 기준으로 5~-5 사이의 gap 안에 비슷하게 분포 되어 있는것을 보니
아직 잔차가 random 하지 않다고 볼 수 있고,
모형의 변형이 필요하다고 판단된다.
※ <참고>
선형회귀 식에서의 x1, x2,... 에 대한 계수 b1, b2,... 와 b0를 구해보면,
print([x for x in zip(data.feature_names, clf.coef_)]
[('CRIM', -0.10198275780147505), ('ZN', 0.0471420383126222), ('INDUS', -0.016890740805226068), ('CHAS', 2.844585305945712), ('NOX', -16.16877758356266), ('RM', 3.8796199734806365), ('AGE', 0.0028161062084431643), ('DIS', -1.3697431923771684), ('RAD', 0.2560976999637809), ('TAX', -0.010908366357371357), ('PTRATIO', -0.9255869916639518), ('B', 0.007717489541713599), ('LSTAT', -0.48964119805514245)]
clf.intercept_ #b0
34.480387513963656
'머신러닝 > Linear Regression' 카테고리의 다른 글
| Linear Regression (0) | 2022.11.23 |
|---|