이번에는 파이썬 코드 기반으로 싱글 레이어로 보스턴 집값을 예측하는 코드를 작성하겟습니다
이런 식으로 보스턴 집값을 예측한다
제일 처음으로 할것은
보스턴 Features들은
* **CRIM**: 자치 시(town) 별 1인당 범죄율
* **ZN**: 25,000 평방피트를 초과하는 거주지역의 비율
* **INDUS**: 비소매상업지역이 점유하고 있는 토지의 비율
* **CHAS**: 찰스강의 경계에 위치해 있으면 1, 그렇지 않으면 0
* **NOX**: 10ppm당 농축 일산화질소
* **RM**: 주택 1가구당 평균 방의 개수
* **AGE**: 1940년 이전에 건축된 소유주택의 비율
* **DIS**: 5개의 보스턴 직업센터까지의 접근성 지수
* **RAD**: 방사형 도로까지의 접근성 지수
* **TAX**: 10,000 달러 당 재산세율
* **PTRATIO**: 자치 시(town)별 학생/교사 비율
* **B**: 1000(Bk-0.63)^2, 여기서 Bk는 자치시별 흑인의 비율을 말함.
* **LSTAT**: 모집단의 하위계층 비율(%)
* **MEDV**: 본인 소유의 주택가격(중앙값) (단위: $1,000)
보스턴 데이터 셋 들고오기
from sklearn.datasets import load_boston
boston = load_boston()
보스턴 데이터 셋을 X, Y로 구분여 데이터 셋을 만들 준비를 한다
X = boston["data"]
y = boston["target"]
데이터 프레임 형태로 변환
import pandas as pd
data = pd.DataFrame(X, columns=boston["feature_names"])
data["MEDV"] = y
print(data.shape)
data.head()
<output>
CRIM | ZN | INDUS | CHAS | NOX | RM | AGE | DIS | RAD | TAX | PTRATIO | B | LSTAT | MEDV | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0.00632 | 18.0 | 2.31 | 0.0 | 0.538 | 6.575 | 65.2 | 4.0900 | 1.0 | 296.0 | 15.3 | 396.90 | 4.98 | 24.0 |
1 | 0.02731 | 0.0 | 7.07 | 0.0 | 0.469 | 6.421 | 78.9 | 4.9671 | 2.0 | 242.0 | 17.8 | 396.90 | 9.14 | 21.6 |
2 | 0.02729 | 0.0 | 7.07 | 0.0 | 0.469 | 7.185 | 61.1 | 4.9671 | 2.0 | 242.0 | 17.8 | 392.83 | 4.03 | 34.7 |
3 | 0.03237 | 0.0 | 2.18 | 0.0 | 0.458 | 6.998 | 45.8 | 6.0622 | 3.0 | 222.0 | 18.7 | 394.63 | 2.94 | 33.4 |
4 | 0.06905 | 0.0 | 2.18 | 0.0 | 0.458 | 7.147 | 54.2 | 6.0622 | 3.0 | 222.0 | 18.7 | 396.90 | 5.33 | 36.2 |
X의 Features을 다 구분 해두엇기에 x1~x13가지 데이터 X가 잇으며 이 데이터 X에 1대1로 배치되는 W 값을 만든다 random.uniform형태로
그리고 보스턴 집값예측 가격을 예측하는것이기때문에 output이 한개이므로 식은
y = w1*x1+w2*x2+w3*x3+w4*x4+w5*x5+w6*x6+w7*x7+w8*x8+w9*x9+w10*x10+w11*x11+w12*x12+w13*x13+b 이며,
손실 함수는 loss function은 0.5*Σ(y-y_predict)**2이며 이것을 미분하면 아래 공식이 탄생된다
(y-y_predict)*w 이 공식이 weight를 업데이트 하며 트레이닝 할수가 잇다
num_epoch = 100000
learning_rate = 0.000003
w1 = np.random.uniform(low=-1.0, high=1.0)
w2 = np.random.uniform(low=-1.0, high=1.0)
w3 = np.random.uniform(low=-1.0, high=1.0)
w4 = np.random.uniform(low=-1.0, high=1.0)
w5 = np.random.uniform(low=-1.0, high=1.0)
w6 = np.random.uniform(low=-1.0, high=1.0)
w7 = np.random.uniform(low=-1.0, high=1.0)
w8 = np.random.uniform(low=-1.0, high=1.0)
w9 = np.random.uniform(low=-1.0, high=1.0)
w10 = np.random.uniform(low=-1.0, high=1.0)
w11 = np.random.uniform(low=-1.0, high=1.0)
w12 = np.random.uniform(low=-1.0, high=1.0)
w13 = np.random.uniform(low=-1.0, high=1.0)
b = np.random.uniform(low=-1.0, high=1.0)
for epoch in range(num_epoch):
y_predict = x1 * w1 + \
x2 * w2 + \
x3 * w3 + \
x4 * w4 + \
x5 * w5 + \
x6 * w6 + \
x7 * w7 + \
x8 * w8 + \
x9 * w9 + \
x10 * w10 + \
x11 * w11 + \
x12 * w12 + \
x13 * w13 + \
b
error = np.abs(y_predict - y).mean()
if error < 5:
break
if epoch % 10000 == 0:
print("{0:5} error = {1:.5f}".format(epoch, error))
w1 = w1 - learning_rate * ((y_predict - y) * x1).mean()
w2 = w2 - learning_rate * ((y_predict - y) * x2).mean()
w3 = w3 - learning_rate * ((y_predict - y) * x3).mean()
w4 = w4 - learning_rate * ((y_predict - y) * x4).mean()
w5 = w5 - learning_rate * ((y_predict - y) * x5).mean()
w6 = w6 - learning_rate * ((y_predict - y) * x6).mean()
w7 = w7 - learning_rate * ((y_predict - y) * x7).mean()
w8 = w8 - learning_rate * ((y_predict - y) * x8).mean()
w9 = w9 - learning_rate * ((y_predict - y) * x9).mean()
w10 = w10 - learning_rate * ((y_predict - y) * x10).mean()
w11 = w11 - learning_rate * ((y_predict - y) * x11).mean()
w12 = w12 - learning_rate * ((y_predict - y) * x12).mean()
w13 = w13 - learning_rate * ((y_predict - y) * x13).mean()
b = b - learning_rate * (y_predict - y).mean()
print("----" * 10)
print("{0:5} error = {1:.5f}".format(epoch, error))
에측하기
y_predict = X.dot(w) + b
result = data.copy()
result["MEDV(predict)"] = y_predict
print(result.shape)
result.head()
<output> 원래가격 예측한 가격
CRIM | ZN | INDUS | CHAS | NOX | RM | AGE | DIS | RAD | TAX | PTRATIO | B | LSTAT | MEDV | MEDV(predict) | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0.00632 | 18.0 | 2.31 | 0.0 | 0.538 | 6.575 | 65.2 | 4.0900 | 1.0 | 296.0 | 15.3 | 396.90 | 4.98 | 24.0 | 30.115258 |
1 | 0.02731 | 0.0 | 7.07 | 0.0 | 0.469 | 6.421 | 78.9 | 4.9671 | 2.0 | 242.0 | 17.8 | 396.90 | 9.14 | 21.6 | 24.928269 |
2 | 0.02729 | 0.0 | 7.07 | 0.0 | 0.469 | 7.185 | 61.1 | 4.9671 | 2.0 | 242.0 | 17.8 | 392.83 | 4.03 | 34.7 | 27.318432 |
3 | 0.03237 | 0.0 | 2.18 | 0.0 | 0.458 | 6.998 | 45.8 | 6.0622 | 3.0 | 222.0 | 18.7 | 394.63 | 2.94 | 33.4 | 26.550113 |
4 | 0.06905 | 0.0 | 2.18 | 0.0 | 0.458 | 7.147 | 54.2 | 6.0622 | 3.0 | 222.0 | 18.7 | 396.90 | 5.33 | 36.2 | 26.108157 |