tensorflow BP神经网络 波士顿房价预测

前言

啥也别说了,上代码

code

# 根据波士顿房价信息进行预测,多元线性回归 + 特征数据归一化 + 可视化 + TensorBoard可视化
#读取数据
from sklearn.metrics import mean_squared_error #均方误差
from sklearn.metrics import mean_absolute_error #平方绝对误差
from sklearn.metrics import r2_score#R square
import tensorflow as tf
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd  # 能快速读取常规大小的文件。Pandas能提供高性能、易用的数据结构和数据分析工具
from sklearn.utils import shuffle  # 随机打乱工具,将原有序列打乱,返回一个全新的顺序错乱的值

# 迭代轮次
train_epochs = 50

# 学习率
learning_rate = 0.01

# 读取数据文件
def get_data():
    mydf = pd.read_excel('data.xlsx', encoding='utf-8')
    df = mydf.values

    # 把df转换成np的数组格式
    df = np.array(df)
    return df

def normal(df):
    # 特征数据归一化
    # 对特征数据{0到11}列 做(0-1)归一化
    for i in range(13):
        df[:, i] = (df[:, i] - df[:, i].min()) / (df[:, i].max() - df[:, i].min())

    # x_data为归一化后的前12列特征数据
    x_data = df[:, :13]

    # y_data为最后1列标签数据
    y_data = df[:, 13]
    return x_data, y_data

def model():
    # 模型定义
    # 定义特征数据和标签数据的占位符
    # shape中None表示行的数量未知,在实际训练时决定一次带入多少行样本,从一个样本的随机SDG到批量SDG都可以
    x = tf.placeholder(tf.float32, [None, 13], name="X")  # 12个特征数据(12列)
    y = tf.placeholder(tf.float32, [None, 1], name="Y")  # 1个标签数据(1列)

    # 定义模型函数
    # 定义了一个命名空间.
    # 命名空间name_scope,Tensoflow计算图模型中常有数以千计节点,在可视化过程中很难一下子全部展示出来/
    # 因此可用name_scope为变量划分范围,在可视化中,这表示在计算图中的一个层级
    with tf.name_scope("Model"):
        # w 初始化值为shape=(12,1)的随机数
        w = tf.Variable(tf.random_normal([13, 1], stddev=0.01), name="W")

        # b 初始化值为1.0
        b = tf.Variable(1.0, name="b")
        # w和x是矩阵相乘,用matmul,不能用mutiply或者*
        def model(x, w, b):
            return tf.matmul(x, w) + b
        # 预测计算操作,前向计算节点
        pred = model(x, w, b)

    # 定义均方差损失函数
    # 定义损失函数
    with tf.name_scope("LossFunction"):
        loss_function = tf.reduce_mean(tf.pow(y - pred, 2))  # 均方误差

    # 创建优化器
    optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss_function)
    return loss_function, optimizer, pred, x, y, b, w


def run_model(loss_function, optimizer, pred, x_data, y_data, x, y, b, w):
    # 声明会话
    sess = tf.Session()

    # 定义初始化变量的操作
    init = tf.global_variables_initializer()

    # 为TensorBoard可视化准备数据
    # 设置日志存储目录
    logdir = './test'
    # 创建一个操作,用于记录损失值loss,后面在TensorBoard中SCALARS栏可见
    sum_loss_op = tf.summary.scalar("loss", loss_function)

    # 把所有需要记录摘要日志文件的合并,方便一次性写入
    merged = tf.summary.merge_all()

    # 启动会话
    sess.run(init)

    # 创建摘要的文件写入器
    # 创建摘要writer,将计算图写入摘要文件,后面在Tensorflow中GRAPHS栏可见
    writer = tf.summary.FileWriter(logdir, sess.graph)
    # 迭代训练
    loss_list = []  # 用于保存loss值的列表
    Add_train_y = []
    Add_predict_y = []
    for epoch in range(train_epochs):
        loss_sum = 0.0
        for xs, ys in zip(x_data, y_data):
            xs = xs.reshape(1, 13)
            ys = ys.reshape(1, 1)

            # feed数据必须和Placeholder的shape一致
            _, summary_str, loss = sess.run([optimizer, sum_loss_op, loss_function], feed_dict={x: xs, y: ys})
            writer.add_summary(summary_str, epoch)

            loss_sum = loss_sum + loss

        #   loss_list.append(loss)     #每步添加一次
        # 打乱数据顺序,防止按原次序假性训练输出
        x_data, y_data = shuffle(x_data, y_data)

        b0temp = b.eval(session=sess)  # 训练中当前变量b值
        w0temp = w.eval(session=sess)  # 训练中当前权重w值
        loss_average = loss_sum / len(y_data)  # 当前训练中的平均损失

        loss_list.append(loss_average)  # 每轮添加一次
        print("epoch=", epoch + 1, "loss=", loss_average, "b=", b0temp, "w=", w0temp)

        Add_train_y.append(np.sqrt(mean_squared_error(y_data, sess.run(pred, feed_dict={x: x_data}))))
    return loss_list, pred, Add_train_y, sess


def plot_all(loss_list, x_data, y_data, pred, Add_train_y, sess, x, y):
    plt.plot(loss_list)

    # 模型应用
    n = np.random.randint(506)  # 随机确定一条来看看效果
    print(n)
    x_test = x_data[n]

    x_test = x_test.reshape(1, 13)
    predict = sess.run(pred, feed_dict={x: x_test})
    print("预测值:%f" % predict)

    target = y_data[n]
    print("标签值:%f" % target)
    plt.show()
    #######        曲线拟合效果,可以看出预测效果不错       #####
    test_predictions = sess.run(pred, feed_dict={x: x_data})

    plt.scatter(y_data, test_predictions)
    plt.xlabel('True Values [1000$]')
    plt.ylabel('Predictions [1000$]')
    plt.axis('equal')
    plt.xlim(plt.xlim())
    plt.ylim(plt.ylim())
    _ = plt.plot([-100, 100], [-100, 100])
    plt.show()
    ##########                 #########                                ##

    plt.figure()
    plt.xlabel('Epoch')
    plt.ylabel('Mean Abs Error [1000$]')

    plt.plot(np.arange(50), Add_train_y,
           label = 'MAE')
    plt.legend()
    plt.ylim([0, 10])
    plt.show()

    #######         ##############
    error = test_predictions - y_data
    plt.hist(error, bins = 50)
    plt.xlabel("Prediction Error [1000$]")
    _ = plt.ylabel("Count")
    plt.show()

def main():
    df = get_data()  # getdata
    x_data, y_data = normal(df)
    loss_function, optimizer, pred, x, y, b, w = model()
    loss_list, pred, Add_train_y, sess = run_model(loss_function, optimizer, pred, x_data, y_data, x, y, b, w)
    plot_all(loss_list, x_data, y_data, pred, Add_train_y, sess, x, y)


if __name__ == '__main__':
    main()

结语

写的有点乱,大家凑活看
运行结果如下:
①利用Tensorboard查看神经网络结构图,如图所示可以看出是单层神经元的BP神经网络:
tensorflow BP神经网络 波士顿房价预测_第1张图片
②观察随着训练轮数的变化,loss值的变化,分别用matplotlib和tensorboard展示

tensorflow BP神经网络 波士顿房价预测_第2张图片
tensorflow BP神经网络 波士顿房价预测_第3张图片
③利用matplotlib作图,展示神经网络预测拟合效果,可以看出还是不错的。
tensorflow BP神经网络 波士顿房价预测_第4张图片
④利用matplotlib作图,查看预测失误情况的直方图,可以看出大部分预测还是准确的:
tensorflow BP神经网络 波士顿房价预测_第5张图片
⑤利用matplotlib作图,展示平均绝对误差:MAE(Mean Absolute Error)的变化趋势,可以看出在几轮训练之后,趋于减小,最后近乎平稳。
tensorflow BP神经网络 波士顿房价预测_第6张图片

⑥仿真测试,随机选取数据进行预测,并查看预测效果,可以看出预测效果中等偏上。
索引:375
预测值:15.012003
标签值:19.100000

402
预测值:12.718363
标签值:13.400000

10
预测值:30.206409
标签值:34.700000

239
预测值:31.967896
标签值:26.700000

51
预测值:18.368908
标签值:13.000000

120
预测值:12.289744
标签值:13.400000

参考致谢

https://blog.csdn.net/u012735708/article/details/84337262
https://blog.csdn.net/qq_36712111/article/details/87742822
https://blog.csdn.net/weixin_43737376/article/details/86718103

你可能感兴趣的:(机器学习)