波士顿房价预测
''' 数据集介绍:
1) 共506行,每行14列,前13列描述房屋特征信息,最后一列为价格中位数
2) 考虑了犯罪率(CRIM) 宅用地占比(ZN)
非商业用地所占尺寸(INDUS) 查尔斯河虚拟变量(CHAS)
环保指数(NOX) 每栋住宅的房间数(RM)
1940年以前建成的自建单位比例(AGE) 距离5个波士顿就业中心的加权距离(DIS)
距离高速公路便利指数(RAD) 每一万元不动产税率(TAX)
教师学生比(PTRATIO) 黑人比例(B)
房东属于中低收入比例(LSTAT)
'''
import paddle
import paddle.fluid as fluid
import numpy as np
import os
import matplotlib.pyplot as plt
BUF_SIZE = 500
BATCH_SIZE = 20
random_reader = paddle.reader.shuffle(paddle.dataset.uci_housing.train(),
buf_size=BUF_SIZE)
train_reader = paddle.batch(random_reader, batch_size=BATCH_SIZE)
x = fluid.layers.data(name="x", shape=[13], dtype="float32")
y = fluid.layers.data(name="y", shape=[1], dtype="float32")
y_predict = fluid.layers.fc(input=x,
size=1,
act=None)
cost = fluid.layers.square_error_cost(input=y_predict,
label=y)
avg_cost = fluid.layers.mean(cost)
optimizer = fluid.optimizer.SGDOptimizer(learning_rate=0.001)
opts = optimizer.minimize(avg_cost)
place = fluid.CPUPlace()
exe = fluid.Executor(place)
exe.run(fluid.default_startup_program())
feeder = fluid.DataFeeder(place=place, feed_list=[x, y])
iter = 0
iters = []
train_costs = []
EPOCH_NUM = 120
model_save_dir = "./model/uci_housing"
for pass_id in range(EPOCH_NUM):
train_cost = 0
i = 0
for data in train_reader():
i += 1
train_cost = exe.run(program=fluid.default_main_program(),
feed=feeder.feed(data),
fetch_list=[avg_cost])
if i % 20 == 0:
print("PassID: %d, Cost: %0.5f" % (pass_id, train_cost[0][0]))
iter = iter + BATCH_SIZE
iters.append(iter)
train_costs.append(train_cost[0][0])
if not os.path.exists(model_save_dir):
os.makedirs(model_save_dir)
fluid.io.save_inference_model(model_save_dir,
["x"],
[y_predict],
exe)
plt.figure("Training Cost")
plt.title("Training Cost", fontsize=24)
plt.xlabel("iter", fontsize=14)
plt.ylabel("cost", fontsize=14)
plt.plot(iters, train_costs, color="red", label="Training Cost")
plt.grid()
plt.savefig("train.png")
infer_exe = fluid.Executor(place)
infer_scope = fluid.core.Scope()
infer_result = []
ground_truths = []
[infer_program, feed_target_names, fetch_targets] = \
fluid.io.load_inference_model(model_save_dir,
infer_exe)
infer_reader = paddle.batch(paddle.dataset.uci_housing.test(),
batch_size=200)
test_data = next(infer_reader())
test_x = np.array([data[0] for data in test_data]).astype("float32")
test_y = np.array([data[1] for data in test_data]).astype("float32")
x_name = feed_target_names[0]
results = infer_exe.run(infer_program,
feed={x_name: np.array(test_x)},
fetch_list=fetch_targets)
for idx, val in enumerate(results[0]):
print("%d: %.2f" % (idx, val))
infer_result.append(val)
for idx, val in enumerate(test_y):
print("%d: %.2f" % (idx, val))
ground_truths.append(val)
plt.figure('scatter')
plt.title("TestFigure", fontsize=24)
plt.xlabel("ground truth", fontsize=14)
plt.ylabel("infer result", fontsize=14)
x = np.arange(1, 30)
y = x
plt.plot(x, y)
plt.scatter(ground_truths, infer_result, color="green", label="Test")
plt.grid()
plt.legend()
plt.savefig("predict.png")
plt.show()